ReactJS,使用处理程序更新状态但数据为空

发布于 2025-01-20 18:05:36 字数 927 浏览 2 评论 0原文

我有这种情况:

我想更新一些用于映射不同 React 组件的状态(一个数组)。

这些组件有自己的handleUpdate

但是当我调用handleUpdate时,我需要使用的状态是空的。我认为是因为每个处理程序方法都是在状态填充数据之前挂载的,但是那么,我如何确保或使用处理程序中的数据呢?换句话说,处理程序需要更新填充其自身状态的状态:

const [data, setData] = useState([]);
const [deliver, setDeliver] = useState({items: []});

const handleUpdate = (value, position) => {
  // This set works
  setDeliver({
    items: newItems
  });
  // This doesn't work because "data" is an empty array - CRASH
  setData(data[position] = value);
};

useEffect(() => {
  const dataWithComponent = originalData.map((item, i) => ({
    ...item,
    entregado: <SelectorComponent
      value={deliver?.items[i].delivered}
      key={i}
      onUpdate={(value) => handleUpdate(value, i)}
    />
    }));
    setData(dataWithComponent); // This is set after <SelectComponent is created...
  }
}, [originalData]);

I have this situation:

I want to update some state (an array) which is used to map different React components.

Those componentes, have their own handleUpdate.

But when I call to handleUpdate the state that I need to use is empty. I think is because each handler method was mounted before the state was filled with data, but then, how could I ensure or use the data in the handler? In other words, the handler needs to update the state that fill it's own state:

const [data, setData] = useState([]);
const [deliver, setDeliver] = useState({items: []});

const handleUpdate = (value, position) => {
  // This set works
  setDeliver({
    items: newItems
  });
  // This doesn't work because "data" is an empty array - CRASH
  setData(data[position] = value);
};

useEffect(() => {
  const dataWithComponent = originalData.map((item, i) => ({
    ...item,
    entregado: <SelectorComponent
      value={deliver?.items[i].delivered}
      key={i}
      onUpdate={(value) => handleUpdate(value, i)}
    />
    }));
    setData(dataWithComponent); // This is set after <SelectComponent is created...
  }
}, [originalData]);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

糖粟与秋泊 2025-01-27 18:05:36

您传递的值不是来自originalData,因此onUpdated不知道它是什么value

您使用map在originalData上运行,因此您需要传递item。 onUpdate 函数

const dataWithComponent = originalData.map((item, i) => ({
    ...item,
    entregado: <SelectorComponent
      value={deliver?.items[i].delivered} // you can't use items use deliver.length > 0 ? [i].delivered : ""
      key={i}
      onUpdate={() => handleUpdate("here you pass item", i)}
    />
    }));

The value that you pass don't come from originalData, so the onUpdated don't know what it's value

You run on originalData using map, so you need to pass item.somthing the the onUpdate function

const dataWithComponent = originalData.map((item, i) => ({
    ...item,
    entregado: <SelectorComponent
      value={deliver?.items[i].delivered} // you can't use items use deliver.length > 0 ? [i].delivered : ""
      key={i}
      onUpdate={() => handleUpdate("here you pass item", i)}
    />
    }));
许一世地老天荒 2025-01-27 18:05:36

我不确定,但是我认为您可以做这样的事情。希望您能有所了解。

// This doesn't work because "data" is an empty array - CRASH
  let tempData = [...data].
  tempData[position] = value;
  setData(tempData);

I'm not sure, but I think you can do something like that. I hope you get some idea to work it.

// This doesn't work because "data" is an empty array - CRASH
  let tempData = [...data].
  tempData[position] = value;
  setData(tempData);

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文