首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将默认值放入redux的中?

如何将默认值放入redux的中?
EN

Stack Overflow用户
提问于 2018-10-06 15:01:15
回答 1查看 2.6K关注 0票数 1

我问自己,是否有一种方法可以用道具初始化一个React组件,并自动让Redux知道更新它的应用程序状态?

我举了一个反例:

代码语言:javascript
复制
import React from 'react';
import {createStore} from "redux"
import {Provider} from "react-redux"

import Counter from "./Counter"
import countReducer from "./ducks.js"

const store = createStore(countReducer)

class App extends React.Component {
  render() {
    return (
      <Provider store={store}>
        <div className="App">
          <Counter />
        </div>
      </Provider>
    );
  }
}

export default App;

Counter.js

代码语言:javascript
复制
import React from 'react';
import {connect} from "react-redux"
import {increment, decrement, reset} from "./ducks"

const Counter = ({count, decrement, increment, reset}) => (
    <div>
      <h1>Counter</h1>
      <button onClick={decrement}>-</button>
      <span style={{ margin: "0 10px" }}>{count}</span>
      <button onClick={increment}>+</button>
      <div>
        <button onClick={reset}>Reset</button>
      </div>
    </div>
  );

const mapStateToProps = ({count}) => ({
  count
})

const mapDispatchToProps = {
  decrement,
  increment,
  reset
}

export default connect(mapStateToProps, mapDispatchToProps)(Counter);

ducks.js

代码语言:javascript
复制
// action creators
export const increment = () => ({
  type: "INC"
})

export const decrement = () => ({
  type: "DEC"
})

export const reset = () => ({
  type: "RESET"
})

// reducers
export default function countReducer(state = { count: 0 }, action) {

  switch (action.type) {
    case "INC":
      return { count: state.count + 1 }
    case "DEC":
      return { count: state.count - 1 }
    case "RESET":
      return state.defaultCount ? {
          count: state.defaultCount
        } : {
          count: 0
        }
    default:
      return state
  }
}

它的工作原理是预期的:我们可以对值0增加、减少或重置。

但是,如果我们想要重置另一个值呢?

代码语言:javascript
复制
class App extends React.Component {
  render() {
    return (
      <Provider store={store}>
        <div className="App">
          <Counter defaultValue={10}/>
        </div>
      </Provider>
    );
  }
}

我脑海中的另一个问题是如何管理两个不同计数器的计数器,同时仍然让redux处理整个状态?

我很可能想以错误的方式做一些事情,所以即使你有最好的实践,我也会感激你的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-06 15:52:15

我问自己,是否有一种方法可以用道具初始化一个React组件,并自动让Redux知道更新它的应用程序状态?

该规范的解决方案是使用componentDidMount()生命周期挂钩。我们可能会有这样的事情:

代码语言:javascript
复制
componentDidMount(){
   if(this.props.defaultValue){
      this.props.initCounter(this.props.defaultValue);
   }
}
...
const mapDispatchToProps = dispatch({
   ...
   initCounter: defaultValue  => dispatch({type: 'INIT_COUNTER', payload: {defaultValue}})
   ...
})

我们需要在还原器中处理这个操作,实现非常类似于您所做的事情。

我脑海中的另一个问题是如何管理两个不同计数器的计数器,同时仍然让redux处理整个状态?

那么,我们的状态将是counter对象的数组,如下所示:

代码语言:javascript
复制
const reducer = (state = [ { id: 1, value:77 }, { id: 2, value: 88} ], action) => {
      switch (action.type):
           case 'INCREMENT':
               return state.map(c => {
                     if(action.payload.id === c.id) return {...c, value: c.value + 1};
                     return c;
               });
           case 'DECREMENT':
               return state.map(c => {
                     if(action.payload.id === c.id) return {...c, value: c.value - 1};
                     return c;
               })
           ...
           default:
               return state;
};

我们使用id来指定需要更新的计数器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52680329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档