だけ変更されたサブセットをレンダリングするために不変ヘルパーを反応させ、私は唯一の変更されたデータの一部をレンダリングしようとしているここhttp://jsfiddle.net/8xzxkteu/1/は、データ
を例を参照してください。この例では、コンポーネントMain
、data
の状態はid
でインデックス付けされていますが、反応不能ヘルパーを使用して変更されたものだけを設定しています。しかし、出力をクリックすると、カウンターに示されているようにすべての子をレンダリングします。私は不変性ヘルパーを使用して反応するだけでそれをレンダリングされたデータの一部だけを検出することができます。私はおそらくshouldComponentUpdate
を使用し、各子供のオブジェクト値を比較することができますが、不変性ヘルパーでこれを行うより良い方法があります。
class Child extends React.Component {
constructor(props) {
super(props);
this.onClick = this.onClick.bind(this)
this.state = {
count: 0
};
}
componentWillReceiveProps(nextProps) {
var count = this.state.count + 1;
this.setState({ count: count });
}
onClick() {
this.props.onClick(this.props.name);
}
render() {
return <p onClick={this.onClick}>{this.props.name}: {this.props.value} {this.state.count}</p>;
}
}
class Main extends React.Component{
constructor(props) {
super(props);
this.handleChange = this.handleChange.bind(this)
this.state = {
data: {
"a" : "a",
"b" : "b",
}
};
}
handleChange(id) {
this.setState({
data: React.addons.update(this.state.data, { [id]: { $set: 'x' } })
});
}
render() {
const keys = Object.keys(this.state.data);
const children = keys.map(k => {
return <Child name={k} value={this.state.data[k]} onClick={this.handleChange}/>
})
return <div>
{children}
</div>;
}
}
React.render(<Main />, document.getElementById('container'));
'Main'が再レンダリングされると、すべての子も再レンダリングされることに注意してください。再描画するかどうかを確認するには、 'Child'に' shouldComponentUpdate'を使う必要があります。 – ffxsam