我有一个组件,它的状态作为属性传递给子组件。我注意到即使父组件的状态被改变了,子组件也没有重新渲染。
根据官方 React 文档中利用 shouldComponentUpdate 的方式:
“第一次内部组件被渲染时,它将具有 {foo: 'bar'} 作为值属性。如果用户单击锚点,父组件的状态将更新为 {value: {foo: 'barbar'}},触发内部组件的重新渲染过程,该过程将接收 {foo: 'barbar'} 作为新值的属性。
问题在于,由于父组件和内部组件共享对同一对象的引用,当对象在 onClick 函数的第 2 行被突变时,内部组件拥有的属性也会发生更改。因此,当重新渲染过程开始并调用 shouldComponentUpdate 时,this.props.value.foo 将等于 nextProps.value.foo,因为实际上,this.props.value 引用与 nextProps.value 相同的对象。
因此,由于我们将错过属性上的更改并短路重新渲染过程,UI 将不会从'bar'更新为'barbar'。”
如果我不能使用 shouldComponentUpdate,我该如何强制子组件基于来自父组件的属性更改而重新渲染?
父组件
我希望子组件基于给定的 showDropzone 布尔值重新渲染。
根据官方 React 文档中利用 shouldComponentUpdate 的方式:
“第一次内部组件被渲染时,它将具有 {foo: 'bar'} 作为值属性。如果用户单击锚点,父组件的状态将更新为 {value: {foo: 'barbar'}},触发内部组件的重新渲染过程,该过程将接收 {foo: 'barbar'} 作为新值的属性。
问题在于,由于父组件和内部组件共享对同一对象的引用,当对象在 onClick 函数的第 2 行被突变时,内部组件拥有的属性也会发生更改。因此,当重新渲染过程开始并调用 shouldComponentUpdate 时,this.props.value.foo 将等于 nextProps.value.foo,因为实际上,this.props.value 引用与 nextProps.value 相同的对象。
因此,由于我们将错过属性上的更改并短路重新渲染过程,UI 将不会从'bar'更新为'barbar'。”
如果我不能使用 shouldComponentUpdate,我该如何强制子组件基于来自父组件的属性更改而重新渲染?
父组件
我希望子组件基于给定的 showDropzone 布尔值重新渲染。
<Dropzone
onDrop={this.onDrop}
clearFile = {this.clearFile}
showDropzone = {this.state.filePresent}/>
子组件
export default class Dropzone extends Component {
constructor(props) {
super(props);
}
render() {
const { onDrop } = this.props;
const {showDropzone} = this.props;
const {clearFile} = this.props;
return (
<div className="file-adder">
<div className="preview">
{{showDropzone}?
<Dropzone
onDrop={onDrop}
ref="dropzone">
</Dropzone>
:<button type="button"
className="btn btn-primary"
onClick={clearFile}>
Clear File</button>}
</div>
</div>
);
}
}