将 store 数据放在组件的 state 中更有意义,这是因为 props 可能会被父组件更改为componentWillReceiveProps
. 因此,随时更新是有意义的state
:
- 商店的 change 事件被触发并且
- 每当道具发生变化时(将仅与组件本身相关的衍生数据放入状态)
下面是一个示例组件,它更新收听回流商店以及道具更改。我很少this.props
在render
函数中使用,而是在新道具出现时修改它们(创建仅在组件本身内使用的衍生数据)。我经常遇到这种模式,所以不妨写下来:
var SampleComponent = React.createClass({
mixins: [Reflux.ListenerMixin],
// reusable helper function to build state object
buildStateFromProps: function(props) {
return {
actualHeight: props.height + 20
}
},
// default props if no such was set by a parent component
getDefaultProps: function() {
return {
height: 100
};
},
// initial state with all value set to something default
// even using buildStateFromProps with default props
getInitialState: function() {
// this.props is built before this.state
var state = buildStateFromProps(this.props);
// append default data from store
state.text = '';
},
// happens when the parent component send different
// props data
componentWillReceiveProps: function(nextProps) {
// building derivative data from new props
// reusing buildStateFromProps
this.setState(buildStateFromProps(nextProps));
},
// setting up store to be used by the component
componentDidMount: function() {
// this.listenTo is a helper function ListenerMixin
this.listenTo(sampleStore, sampleUpdated);
},
// is called from the sampleStore update
sampleUpdated: function(sampleData) {
this.setState({
text: sampleData.text
});
},
render: function() {
return (
// ...
// using this.state.text from store updates and
// this.state.height from prop updates
);
}
});
我将 props 数据发送到 state 的原因是为了避免弄乱渲染函数。否则,渲染函数将包含大量与“渲染”组件无关的代码。此外,如果此衍生数据用于应用程序的其他部分,则很容易将其从组件中拉出并放入存储中。
希望这可以帮助。