代码之家  ›  专栏  ›  技术社区  ›  user1019042

通过特定索引更新反应状态将数组更改为对象

  •  0
  • user1019042  · 技术社区  · 5 年前

    我的状态是这样的:

    state
      books {}  <-- object
        book    <-- array
          pages <-- array
    

    在我的Reducer中,我试图通过索引访问Book数组,并用一个新的数组替换它的Pages数组。我正在观察我的Google Chrome中的Redux值在值改变前后的变化。 它将整个数组转换为一个对象。在redux中的“book”数组之前,它看起来像:

    book: [{...}, {...}, {...}]
    

    变更后:

    book: {{0: {...}, 1: {...}, 2: {...}}
    

    如何在Redux中保持Book对象的原始显示?

    这是我的减速器中的代码:

    export interface MyState {
      book: BookItem[];
      pages: Pages[];
    }
    
    function updatePages(index: number, state: MyState)  {
        // set up my new pages array here into newPages variable
        return {
            ...state,
            book: {
              ...state.book,
              [index]: {
                ...state.book[index],
                pages: newPages as Pages[]
              }
            }
        };
    }
    
    2 回复  |  直到 5 年前
        1
  •  2
  •   Gabriel Ferrarini    5 年前

    你能试试这个看看它是否有效吗?

    function updatePages(index: number, state: MyState)  {
        // set up my new pages array here into newPages variable
        return {
            ...state,
            book: state.book.map(bk => ({
                ...bk,
                pages: newPages as Pages[]
            }))
        };
    }
    

    编辑

    function updatePages(index: number, state: MyState)  {
        // set up my new pages array here into newPages variable
        return {
            ...state,
            book: state.book.map((bk, idx) => ({
                ...bk,
                pages: idx === index ? newPages as Pages[] : bk.pages
            }))
        };
    }
    
        2
  •  2
  •   devserkan    5 年前

    @加布里埃尔·费拉里尼的回答解决了你的问题,这就是为什么我投了反对票。但是,作为映射的另一种选择,我想提供一个不同的答案。因为你有一个现在的索引,你可以使用 Object.assign 操纵 book 的页面。

    function updatePages(index: number, state: MyState) {
      // newPages setup...
      return {
        ...state,
        book: Object.assign([], state.book, {
          [index]: { ...state.book[index], pages: newPages as Pages[] }
        })
      };
    }
    

    我们正在使用 对象分配 操作一个数组及其索引。同样,在不改变原始状态(使用扩展语法)的情况下,我们只需将页面指定为 newPages 对于 项目。