在React

时间:2016-08-04 05:45:41

标签: reactjs components render jsx

我有一个组件,其状态作为prop组件传递给子组件。我注意到即使更改了Parent的状态,也不会重新呈现子组件。

基于使用shouldComponentUpdate的官方React文档:

  

“第一次渲染内部组件时,它会有{foo:   'bar'}作为价值道具。如果用户点击锚点,则   父组件的状态将更新为{value:{foo:'barbar'   触发内部组件的重新渲染过程,其中   将获得{foo:'barbar'}作为道具的新值​​。

     

问题在于,由于父组件和内组件共享一个   当对象在第2行变异时,引用同一个对象   onClick函数,内部组件的prop将改变。   因此,当重新渲染过程开始时,和shouldComponentUpdate   被调用,this.props.value.foo将等于   nextProps.value.foo,因为实际上this.props.value引用了   与nextProps.value相同的对象。

     

因此,我们会错过道具和短片的变化   电路重新渲染过程,UI不会从'bar'更新   'barbar'。“

如果我不能使用shouldComponentUpdate,我将如何基于来自Parent的道具更改强制子组件重新渲染?

父组件

我希望子组件根据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>
    );
  }
}

2 个答案:

答案 0 :(得分:0)

在子组件中,您使用了&#34; showZone&#34;而不是&#34; showDropzone&#34;。

由于

答案 1 :(得分:0)

对不起,您的代码有很多错误

首先(这是一个提示):

 const { onDrop } = this.props;
 const { showDropzone } = this.props;
 const { clearFile } = this.props;

您只能写一行

 const { onDrop, showDropzone, clearFile } = this.props;

现在您的问题从这里开始:

  

您在卷曲括号中使用了showDropzone,这是您的   问题删除它们

您的错误{{showDropzone}? firstOption : anotherOption }

将是{ showDropzone? firstOption : anotherOption }


另一个错误:

  

您在内部使用了 Dropzone 组件,这是一个很大的错误

您不能在此处使用{{showDropzone}? <Dropzone {...}/> : anotherOption }的Dropzone组件。您可以在其他组件中使用它


最后,我试图格式化您的代码,使其像这样

父组件

{ this.state.filePresent
   ? <Dropzone onDrop={this.onDrop} />
   : <button
         type="button" 
         className="btn btn-primary"
         onClick={clearFile}
         children="Clear File"
     />
}

儿童能力

class Dropzone extends Component {
  render() {
    const { onDrop } = this.props;

    return (
      <div className="file-adder">
        <div className="preview" onDrop={onDrop} ref="dropzone">
          <p>Hi! This is Dropzone component</p>
        </div>
      </div>
    );
  }
}

export default Dropzone;