如何在ReactRedux中创建临时状态?

时间:2015-12-07 18:46:39

标签: reactjs redux

我一直在使用Redux一个月,当项目变得非常大时,似乎没有必要将整个应用程序暴露给每个Reducer的所有值。是否有创建临时国家或为组成部分创建个别国家的好方法?

我是否认为这一切都是错的,或者是出于某种原因以这种方式构建的?

2 个答案:

答案 0 :(得分:2)

根据Redux docs

  

整个应用程序的状态存储在对象树中   一家商店。

一个州。一家商店。而已。您可以在单个组件中创建由较大的应用程序状态通知的本地状态,但此时您只是复制已存在的较大状态的部分。

请注意,在复杂的应用中,您不会将整个状态提供给“智能”组件。即使你有100个reducer函数,当你connect a component to the store时,你可以使用mapStateToProps只选择你想要的应用程序状态部分,并从那些部分创建组件的道具。所以你永远不会看到你不使用的所有州的部分,即使你在脑海中知道它们存在。

这真是一个伟大的建筑模式。有一个州,你有一个single source of truth。由于这个原因,您的应用程序的任何部分都不可能有过时的数据。请记住,在初始化应用程序状态时,您只是定义状态结构,而不是加载所有数据。因此,在开始时初始化整个结构不会影响性能。而且,您永远不会将整个应用程序状态加载到单个组件中(除非它需要),因此您的道具始终是可管理的。

答案 1 :(得分:2)

我假设“每个reducer的值”指的是整个app状态。

您当然可以分割您的状态并仅将必要的部分暴露给特定组件。这就是connect绑定中react-redux方法的用途。 connect接受一个函数(例如mapStateToProps),该函数依次获取整个应用状态,并且只将您指定为道具的部分暴露给您正在“连接”到redux的组件。

例如,假设您有一个简单的React组件,它显示了用户的姓名和地址:

var myComponent = React.createClass({
  render: function() {
    return (
      <div>{Name from redux state goes here}</div>
      <div>{Address from redux state goes here}</div>
    );
  }
});

显然,您不需要将整个应用程序状态发送到此组件,只需要包含用户名称和地址的部分。所以你这样使用connect

// the "state" param is your entire app state object.  
function mapStateToProps(state) {
  return {
    name: state.name,
    address: state.address
  }
}

var connectedComponent = connect(mapStateToProps)(myComponent);

包裹的myComponent现在实际上看起来像这样:

var myComponent = React.createClass({
  propTypes: {
   name: React.PropTypes.string // injected by connect
   address: React.PropTypes.string // injected by connect  
  },

  render: function() {
    return (
      <div>{this.props.name}</div>
      <div>{this.props.address}</div>
    );
  }
});