我不确定这是否完全相关(上下文使用 Redux 和 React),但我在搜索类似内容时发现了这个页面,所以我写这个以防万一。
我的动机是,我有状态对象,我想在其中公开该状态的表示,而不是状态本身。因此,例如(使用 Immutable.js),我有一个包含一个或多个字段的状态(模式) ,每个字段由一个唯一标识符标识并存储在 Map 中,以及一个标识符列表,该标识符给出字段排序。
我真的不想写这样的东西
state.get('field').get(state.get('order').get(nth))
获取第 n 个字段,而不是靠近减速器的任何地方,以便隐藏内部表示并且可以轻松更改。
我目前正在做的(这是一个实验),是在与减速器相同的文件中添加一个函数:
schema.mapVisibleState = function (state) {
return {
getOrderedFields: () => state.get('order').map((fid) => state.get('fields').get(fid)
}
}
这用于相应的 React 组件(以及类似的 schema.bindActionCreators 函数):
export const Schema = connect(
(state) => schema.mapVisibleState (state),
(dispatch) => schema.bindActionCreators (dispatch)
)(_Schema) ;
现在我可以像this.props.getOrderedFields()一样以正确的顺序访问组件内部的字段,而不必担心底层表示。它还具有额外的好属性,即很容易对 getOrderedFields() 函数进行依赖注入。
另外,由于我有一个类似的字段状态结构,我可以扩展它:
schema.mapVisibleState = function (state) {
return {
getOrderedFields: () => state.get('order').map((fid) => field.mapVisibleState(state.get('fields').get(fid)),
getNthField (nth) => field.mapVisibleState(state.get('fields').get(state.get('order').get(nth)))
}
}