我应该使用克隆道具还是一次更换道具并使道具进入状态

时间:2019-08-08 16:35:10

标签: reactjs design-patterns

我有一些类似于UIManager和Form的东西,我收到相当大的JSON作为该组件的道具,我必须遍历此JSON并分配onChangeFunction到此JSON的每个元素,然后使用新的JSON渲染子代,我还将使用类似{{1 }}并且我还使用此formData在render中更新了上述JSON,因此子级的值很好(双向绑定)。
现在我正在这样做:

formData=[{ID:Value}]

我想知道是否应该这样做:

render () {
    let newElementList = deepClone(props.elementList)

    newElementList.forEach(element => {
      if (!element.onChange) {
        element.onChange = this.onElementChange();
      }
    })

    //use newElementList from now on
}

哪个是更好的解决方案?
注意,我还对此componentDidMount() { let newElementList = deepClone(props.elementList) newElementList.forEach(element => { if (!element.onChange) { element.onChange = this.onElementChange(); } }) this.setState({elementList: newElementList}); } render () { //use this.state.elementList from now on } 做了一些其他更改,例如,我为每个更改的元素更新了value参数,并更新了JSON

1 个答案:

答案 0 :(得分:1)

答案将取决于对JSON对象进行更新的位置,不是吗?

如果通过props传递的JSON对象仅仅是该组件的任意起点,那么只要所有更新都源自该组件和/或其子代,将其置于挂载状态应该适合您的目的。

但是,如果JSON数据由该组件的祖先操纵,则此解决方案将不起作用,因为仅在安装组件时才设置状态,并且组件将无法反映任何更改。在这种情况下,您希望继续将元素列表放到render中(如果您不希望其他更改触发渲染)或componentDidUpdate中(如果组件将经常重新渲染并且您不想处理JSON)。