2

在我的表单中,我有一些下拉组件。每当第一个下拉选项更改时,我想更新第二个下拉列表的道具并重新渲染它。我的代码看起来像这样

handleProjectChange(option) {
    //this.setState({ selectedProject: option })
    this.refs.phase.props = option.phases;
    //this.refs.forceUpdate()
    this.refs.phase.render()
}

render() {
    var projectOptions = this.projectOptions
    var defaultProjectOption = this.state.selectedProject
    var phaseOptions = defaultProjectOption.phaseOptions
    var defaultPhaseOption = phaseOptions[0]
    var workTypeOptions = api.workTypes().map(x => { return  { value: x, label: x } })
    var defaultWorkTypeOption = workTypeOptions[0]
    return (
        <div>
            <Dropdown ref='project' options={projectOptions} value={defaultProjectOption} onChange={this.handleProjectChange.bind(this)} />
            <Dropdown ref='phase' options={phaseOptions} value={defaultPhaseOption} />
            <Dropdown options={workTypeOptions} value={defaultWorkTypeOption} />                
            <button className="btn btn-primary"  onClick={this.handleAddClick.bind(this)}>Add</button>
        </div>
    )
}

但是 props 没有改变,所以它重新渲染了相同的选项。目前我只是通过在其上设置新状态来重新渲染整个表单。有没有办法用新的道具只重新渲染一个孩子/下拉菜单?

4

2 回答 2

3

这样做的方法是将所选选项置于selectedProject状态的第一个下拉列表中。

在您的渲染函数中,获取/填充第二个下拉列表中的选项,具体取决于所选项目。

然后流程将是:

  • 用户在第一个下拉列表中选择一个选项。
  • 这触发handleProjectChange()
  • 在内部handleProjectChange(),新选择的选项通过this.setState()调用进入状态
  • 因为状态改变了,react 重新运行整个render()函数。
  • 在幕后,react 发现只有第二个下拉菜单发生了变化,所以 react 只会在你的屏幕上/在 DOM 中重新渲染第二个下拉菜单。
于 2016-02-08T10:40:37.260 回答
0

尽管 React 确实有一个协调算法,可以动态检查每个组件是否应该在每次渲染其父组件时重新渲染,但它并不总是像我们预期的那样工作。

https://reactjs.org/docs/reconciliation.html

对于此类问题,您有两种选择。你可以使用 React.pureComponent 或 React.useMemo()。

于 2020-09-24T18:48:53.133 回答