javascript - 更改子组件中的数据而不更改父组件中的数据

标签 javascript reactjs react-hooks onclick state

我正在更改一组数据,并且数据保存在父组件状态中,我将该数据传递给第二个组件,但是当我更改第二个组件中的数据时,它正在更改第一个组件中的数据。我尝试将变量设置为状态的值,以努力复制它/还在第二个组件中创建一个新状态,该状态是根据第一个组件的初始数据设置的。但由于某种原因我仍在更改初始数据。谁能解释一下这是怎么回事?

父组件:

const [data, setData] = useState([]);
const [editing, setEditing] = useState(null);

{!!editing && (
        <EditInsurance state={editing} data={data} setEditing={setEditing} />
)}

第二个组件:

const [update, setUpdate] = useState([]);
const [List, setList] = useState([]);

//sets the data onLoad
 useEffect(() => {
    setList(data);
  }, []);

//edits the data
const handleClick = (item) => {
    let list = List;
    
    list.forEach((el) => {
      if (el.payerName === item.payerName) {
        el.state.push(state.value);
        if (!el.isActive) {
          el.isActive = true;
        }
      }
    });

    //update is an array containing only edited objects.
    setUpdate([...update, item]);
  };

handleClick 被触发并且我控制台父组件中的 data 值时,它已被更新。在用户单击“保存”之前我不想更改该数据。如何获得第二个组件独有的数据副本,而不会操作父组件中的数据?

最佳答案

问题

这里的问题是代码正在改变状态对象。

const [update, setUpdate] = useState([]);
const [List, setList] = useState([]);

// sets the data onLoad
useEffect(() => {
  setList(data); // <-- (1) parent state passed as prop
}, []);

// edits the data
const handleClick = (item) => {
  let list = List; // <--(2) reference to state in parent

  list.forEach((el) => {
    if (el.payerName === item.payerName) {
      el.state.push(state.value); // <-- (3) mutation of parent state!
      if (!el.isActive) {
        el.isActive = true; // <-- (3) mutation of parent state!
      }
    }
  });

  // update is an array containing only edited objects.
  setUpdate([...update, item]);
};

解决方案

使用/应用不可变更新模式。任何正在更新的状态都应该浅复制到新的数组/对象引用中。扩展语法是通过引用进行浅复制,这就是为什么需要创建数组/对象引用以避免改变原始引用。

我假设这个子组件只想/需要维护自己的 data 属性副本。

const [list, setList] = useState(data); // <-- (1) parent state passed as prop

// edits the data
const handleClick = (item) => {
  setList(list => list.map(el => { // <-- (2) array.map shallow copy
    if (el.payerName === item.payerName) {
      return {
        ...el, // <-- (3) shallow copy array element
        state: [...el.state, state.value], // <-- (4) shallow copy array
        isActive: !el.isActive, // <-- new property
      };
    }
    return el; // <-- not updating, just return current element
  }));
};

关于javascript - 更改子组件中的数据而不更改父组件中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71876744/

相关文章:

javascript - 当我尝试以 Javascript OOP 样式编写代码时,Append 不起作用

javascript - jquery 中的加载函数行为如何

javascript - 单击另一个输入后如何防止我的日期选择器重新聚焦

reactjs - 将 Redux 添加到现有的 React 应用程序

reactjs - 必须在 React 函数组件或自定义 React Hook 函数中调用 React Hooks

javascript - 使用 jquery 将标题标签内容替换为另一个标题标签内容时出现 IE 问题

javascript - React-Semantic UI 调度事件不起作用

reactjs - 如何使用 useQuery 重新输入 API 的响应?

reactjs - 如何在某些情况下删除 React hook?

javascript - 无法在 Vue.js 中动态创建 ref