【发布时间】:2020-10-13 05:53:58
【问题描述】:
考虑reducer状态的这两种模式:
- 单个状态对象:
// personReducer.js
const initialState = {
personInfo: {
firstName: "",
lastName: "",
foo: "",
bar: "",
baz: "",
foo1: "",
bar1: "",
bar2: "",
foo2: "",
foo3: "",
}
// some not-to-mention states
};
- 多个状态(没有
person级别):
// personReducer.js
const initialState = {
firstName: "", // no person level
lastName: "",
foo: "",
bar: "",
baz: "",
foo1: "",
bar1: "",
bar2: "",
foo2: "",
foo3: ""
};
哪个更好?让我困惑的是:
// Person.jsx - pattern 1
const mapStateToProps = ({ personInfo }) => {
personInfo
}
// Person.jsx - pattern 2
const mapStateToProps = ({ firstName, lastName }) => {
firstName,
lastName
}
// Human.jsx - pattern 1
const mapStateToProps = ({ personInfo }) => {
personInfo
}
// Human.jsx - pattern 2
const mapStateToProps = ({ foo, bar }) => {
foo,
bar
}
假设我们的应用中有两个组件Person 和Human,它们都将连接到personReducer 以检索个人信息。
对于模式 1:
在Person 组件中,我调度了一个动作来更新personInfo 内部的firstName,这稍后将强制Human 也重新渲染,是吗?在我们的减速器中是这样的:
case UPDATE_PERSON_INFO: {
return {
...state,
personInfo: {
...state.personInfo,
firstName: payload.firstName
}
}
}
对于模式 2:
在Person 组件中,我调度了一个动作来更新firstName,这以后不会强制Human 重新渲染,因为Human 不是将firstName 映射到它的props,而是foo, bar .我对吗?某物
喜欢:
case UPDATE_PERSON_INFO: {
return {
...state,
firstName: payload.firstName
}
}
【问题讨论】:
-
你可以有一个 personInfo reducer 并使用 combineReducers 进行 mapState 我建议使用 reselect 和撰写 selectPersonInfo,here 是一些如何使用 reselect 和 react-redux 的示例。