有一些方法可以在减速器中使用react和redux读取子状态吗?

时间:2017-05-31 18:33:33

标签: reactjs redux react-redux

我的商店是下一个:

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;
    }
}

这可能吗?怎么样?

非常感谢你。

1 个答案:

答案 0 :(得分:0)

是的,这是可能的。

您可以考虑在减速机中使用dot-prop-immutableImmutable.js来选择性地操作"切片"你的商店。

使用dotProp的伪代码示例:

// Getter 
dotProp.get({foo: {bar: 'unicorn'}}, 'foo.bar')

签名:

get(object, path) --> value

我在你的代码中注意到你正在使用以下内容来克隆"克隆"你的州:

const copy = JSON.parse(JSON.stringify(state));

这不是最佳的,因为您完全克隆了所有状态对象,而只应在其中的一部分上操作(减速器操作的地方,特别是如果您使用组合减速器)。