跨组件共享处理状态

Share processed state across components

我有三个组成部分。我的 state 有一个名为 state.selected 的 属性。

目前在我的 mapStateToProps 中,我在所有三个组件中都这样做:

function mapStateToProps(state, ownProps) {
   return { selected:state.selected }
}

然后在每个表示组件中,我进行相同的处理,称为 getSelectedDisplays。此函数根据所选内容进行一些处理。

var PresentaionalComponent_1 = React.createClass({
   render: function() {
       var displays = getSelectedDisplays();
       // custom processing on `displays` for coponent 1
   }
})

var PresentaionalComponent_2 = React.createClass({
   render: function() {
       var displays = getSelectedDisplays();
       // custom processing on `displays` for coponent 2
   }
})

var PresentaionalComponent_3 = React.createClass({
   render: function() {
       var displays = getSelectedDisplays();
       // custom processing on `displays` for coponent 3
   }
})

无法控制父组件

我希望避免将三个组件包装在额外的 div 中,因为我唯一需要的是将 getSelectedDisplays 的结果传递给它们。我希望避免这种情况:

 React.createElement(OverContainer)

OverContainer 将是唯一接收 state.selected 的,然后它会执行 getSelectedDisplays 然后它将渲染三个组件作为道具:

var OverPresentaional = React.createClass({ 渲染:函数(){ var {选择} = this.props; var display = getSelectedDisplays(selected);

     return React.createElement('div', {},
          React.createElement(PresentaionalComponent_1, { display });
          React.createElement(PresentaionalComponent_2, { display });
          React.createElement(PresentaionalComponent_3, { display });
     );
}

}});

如果不将它们包装在父级中是否可行 div?

您可以创建一个 selector,它将封装从状态获取数据和计算派生属性:

export const getSelectedDisplays = (state) => {
    const selected = state.selected;
    const selectedDisplays = // whatever logic you need to get selectedDisplays from selected
    return {
        selectedDisplays;
    };
};

现在每个组件:

import { getSelectedDisplays } from 'selectorFile';

function mapStateToProps(state, ownProps) {
   return getSelectedDisplays(state);
}

var PresentaionalComponent_1 = React.createClass({
   render: function() {
       var displays = this.props.selectedDisplays;
       // custom processing on `displays` for coponent 1
   }
})

等...

唯一的问题是,获取数据和逻辑将执行 3 次,而不是一次。为了解决这个问题,您可以创建一个记忆选择器,如果提供的参数(在本例中为状态)没有改变,它将缓存和 return 相同的结果。 Reselect 是一个为您创建备忘选择器的库。