javascript - 以不可变的方式更新子组件中父组件的状态

标签 javascript reactjs typescript ecmascript-6 setstate

我有一个具有以下属性的对象数组。

columns = [
           {Header: ƒ, Cell: ƒ, sortable: false, show: true},
           {Header: ƒ, accessor: "firstName", sortable: false, show: true},
           {Header: ƒ, accessor: "status", sortable: false, show: true},
           {Header: ƒ, accessor: "visits", sortable: false, show: true}
          ]

我将其发送到子组件的对象数组以及将用于从子组件设置父组件状态的方法

父组件

<Child columns={this.props.child} handleSetState={this.handleSetState}/>

handleSetState = columns => {
    this.setState({ columns });
};


我在子组件中有一个下拉组件,其中我将复选框显示为从 Prop 中提取的选项。另外,我选择了一些选项,当我单击“应用”时,与对象匹配的属性应该得到更新,相应的父状态也应该更新

例如,单击“Apply”,我形成此数组

值 = ['名字','状态'];

所以我需要 parent 状态“显示”属性应更新为其反转值。基本上 show 用于显示/隐藏列

子组件

  value = ['firstName','status'];
  submitSelection = () => {
    let updatedObj = this.props.columns.map((obj, i) => {
      if (obj.accessor === value[i]) {
        obj.show = !obj.show;
      }
      return obj;
    });
    this.props.handleSetState(updatedObj);
  };


在第一个选择中,我希望状态应更新为:

[
           {Header: ƒ, Cell: ƒ, sortable: false, show: true},
           {Header: ƒ, accessor: "firstName", sortable: false, show: false},
           {Header: ƒ, accessor: "status", sortable: false, show:false},
           {Header: ƒ, accessor: "visits", sortable: false, show: true}
]

我无法在“submitSelection()”内正确映射索引。是否有比这里实现更清晰的逻辑?

帮助将不胜感激

最佳答案

您可以通过以下方式编写您的 submitSelection 函数:

  values = ['firstName','status'];

  submitSelection = () => {
    const updatedObj = this.props.columns.map(o => 
      values.some(val => val === o.accessor) 
      ? { ...o, show: !o.show } 
      : {...o}
    );
    this.props.handleSetState(updatedObj);
  };

关于javascript - 以不可变的方式更新子组件中父组件的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56747867/

相关文章:

angular - 如何使用 *ngFor 迭代对象键?

javascript - 全局替换中是否允许变量标识符?

javascript - React.JS 计算虚拟 DOM 中的 img 宽度

javascript - 使用 React JS 右键单击​​菜单

javascript - 刷新后 React-Redux 状态丢失

从 ES5 与 ES6 编写的库中导入 TypeScript

javascript - 如何使 children 不在ag网格中重复( Angular )

javascript - 无法使用angular.js在输入字段内绑定(bind)数据

javascript - 如何对不同的路线使用相同的通行证策略?

javascript - Vuejs $remove 按日期分组的数据