【发布时间】:2016-12-10 02:27:33
【问题描述】:
我有一个组件,其状态作为道具传递给子组件。我注意到即使父组件的状态发生了变化,子组件也不会重新渲染。
基于使用 shouldComponentUpdate 的官方 React 文档:
"第一次渲染内部组件时,它将有 { foo: 'bar' } 作为 value 属性。如果用户点击锚点, 父组件的状态将更新为 { value: { foo: 'barbar' } },触发内部组件的重新渲染过程,即 将收到 { foo: 'barbar' } 作为道具的新值。
问题是由于父组件和内部组件共享一个 引用同一个对象,当对象在第 2 行发生变异时 在 onClick 函数中,内部组件的 prop 会发生变化。 所以,当重新渲染过程开始时,shouldComponentUpdate 被调用,this.props.value.foo 将等于 nextProps.value.foo,因为其实 this.props.value 引用了 与 nextProps.value 相同的对象。
因此,因为我们会错过 prop 和 short 的变化 电路重新渲染过程,用户界面不会从“栏”更新 到 'barbar'。”
如果我不能使用 shouldComponentUpdate,我将如何强制子组件根据 Parent 的 props 更改重新渲染?
父组件
我希望子组件根据提供给 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>
);
}
}
【问题讨论】:
-
您确定命名正确吗?子组件称为 Dropzone,但它的渲染函数也渲染一个子
.
标签: reactjs components render jsx