使用 useState 更新复杂对象

Updating complicated Object with useState

我正在尝试执行一组状态函数并仅更改一个值。

这就是对象,例如,我想将索引 [0] 中的 book1(即 name1)从 true 更改为 false。

我不明白怎么做

我正在尝试的一切都只是覆盖了对象的一部分

{
      book1: [
        { name: 1, selected: true },
        { name: 2, selected: false },
        { name: 3, selected: false },
        { name: 4, selected: false },
        { name: 5, selected: true },
      ],
      book2: [
        { name: 1, selected: false },
        { name: 2, selected: false },
        { name: 3, selected: true },
        { name: 4, selected: false },
        { name: 5, selected: true },
      ],
    }

因为对象处于状态,所以不能直接修改它。相反,您必须创建该对象和您更改的任何内部对象(包括数组)的副本。查看评论:

// Use the callback form because you're updating state based on existing state
setTheObject(original => {
    // Shallow copy the object and book1
    const update = {...original, book1: [...original.book1]};
    // Replace the object at index 0 with a new updated object
    update.book1[0] = {...update.book1[0], selected: false};
    // return the update
    return update;
});

技术上可以在一个嵌套操作中完成此操作,但难以阅读和调试:

// Use the callback form because you're updating state based on existing state
setTheObject(original => ({
    // Shallow copy the object
    ...original,
    // Shallow copy `book1` while updating index 0 with a copy of the object with the updated property
    book1: Object.assign([], original.book1, {0: {...original.book1[0], selected: false}}),
}));

不推荐。 :-D

const [books, setBooks] = useState({
      book1: [
           { name: 1, selected: true },
           { name: 2, selected: false },
           { name: 3, selected: false },
           { name: 4, selected: false },
           { name: 5, selected: true }
          ],
      book2: [
           { name: 1, selected: false },
           { name: 2, selected: false },
           { name: 3, selected: true },
           { name: 4, selected: false },
           { name: 5, selected: true }
          ]
 });

假设你拿着书是这样的。现在像这样更新书籍状态。

setBooks({
  ...books,
  book1: books.book1.map((book) =>
    book.name === 1 ? { ...book, selected: !book.selected } : book
  )
});

为了查看state改变后的效果,可以在useEffect hook中添加依赖,一旦书籍改变,你就会在useEffect中看到更新后的state。

useEffect(() => {
  console.log(books);
 }, [books]);