我一直在使用Redux一个月,当项目变得非常大时,似乎没有必要将整个应用程序暴露给每个Reducer的所有值。是否有创建临时国家或为组成部分创建个别国家的好方法?
我是否认为这一切都是错的,或者是出于某种原因以这种方式构建的?
答案 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>
);
}
});