我的商店是下一个:
const initialState = {
all: {
"name": "",
"datas": {
"data1": {
"subdata1": [],
"subdata2": [],
},
"data2": {
"subdata1": [],
"subdata2": [],
},
}
}
}
我有下一个组件:
* All: main Component, map to Data with all.datas
* Data: show data1 or data2 or data3. map to Subdata with data1 and data2 ...
* Subdata: show list subdata1
我在Subdata中有一个redux连接,我希望reducers,而不是返回一般状态,返回一个子数据状态。
例如:
Subdata.js:
class Subdata extends React.Component {
// ....
}
function mapStateToProps(state, ownProps) {
return {
subdata: ownProps.subdata
};
}
function mapDispatchToProps(dispatch) {
return { actions: bindActionCreators(Actions, dispatch) }
}
export default connect(mapStateToProps, mapDispatchToProps)(Subdata);
reducers.js:
const subdata = (state = {}, action) => {
// I want that state return: subdata, in this case, []
// instead of all: {...}
const copy = JSON.parse(JSON.stringify(state));
switch(action.type) {
case "ADD_SUBDATA":
// In this moment: I need pass a lot of vars: data_id and subdata_id
my_subdata = state.datas[data_id][subdata_id]
// I want get directly the subdata
my_subdata = state.subdata
default:
return state;
}
}
这可能吗?怎么样?
非常感谢你。
答案 0 :(得分:0)
是的,这是可能的。
您可以考虑在减速机中使用dot-prop-immutable
或Immutable.js来选择性地操作"切片"你的商店。
使用dotProp的伪代码示例:
// Getter
dotProp.get({foo: {bar: 'unicorn'}}, 'foo.bar')
签名:
get(object, path) --> value
我在你的代码中注意到你正在使用以下内容来克隆"克隆"你的州:
const copy = JSON.parse(JSON.stringify(state));
这不是最佳的,因为您完全克隆了所有状态对象,而只应在其中的一部分上操作(减速器操作的地方,特别是如果您使用组合减速器)。