【发布时间】:2018-08-23 15:00:41
【问题描述】:
我正在尝试学习 Redux,所以:我正在学习 Action creators、actions、reducers、dispatchers...
现在,我正在尝试学习如何根据其他状态生成 x 状态。对于案子,姓名和爱好。
我有类型,常量:NAMES 和 HOBBIES,它们被我的动作创建者使用,它们将它们作为类型和有效负载返回,例如:{ type: HOBBIES, request: payload }
然后我有我的 reducer 文件,我在其中通过两种情况(和默认情况)的操作进行切换
我从我的主文件 App.js 进行调度,并以道具的形式访问这些状态。
function mapStateToProps(state) {
return {
names: state.names,
hobbies: state.hobbies
}
}
function mapDispatchToProps(dispatch) {
return bindActionCreators({ grabNames, grabHobbies }, dispatch);
}
export default connect(mapStateToProps,mapDispatchToProps)(myApp);
我正在使用 combineReducers (index.js)
const rootReducer = combineReducers({
names: namereducer,
hobbies: hobbyreducer
});
目前我有以下redux状态。
names: [
{name: "A", id: "1"},
{name: "B", id: "2"},
{name: "C", id: "3"}
]
和
hobbies: [
{basedId: "1", hobby: "cooking"},
{basedId: "2" hobby: "reading"},
{basedId: "3" hobby: "gaming"},
{basedId: "1" hobby: "reading"}
]
结果应该是包含每个basedId 的爱好的对象数组,当然遵循 Redux 的良好实践。
result: [
{name: "A", id: "1", hobby: ["cooking", "reading"]},
{name: "B", id: "2", hobby: "reading"},
{name: "C", id: "3", hobby: "gaming"}
]
问题是我从未超越简单的地图和 [...state, action.data];
我试图找到解决方案,但我找不到。我非常感谢任何帮助,因为我是新手。
【问题讨论】:
-
只要“爱好”只包含一个字符串,考虑通过简单地将它们保存在名称缩减器内的数组中来维持这种 1:N 关系(一个人有很多爱好)。只有当“爱好”成为具有其他属性的更复杂对象时(显然,您不想在
state.names中复制),您才需要使用像reselect这样的库来建立此映射。顺便说一句,mapStateToProps 也可以正常工作,这只是一种优化。
标签: javascript reactjs redux react-redux