使用 spread 将我从 API 获得的对象添加到我的初始数据源中

Posted

技术标签:

【中文标题】使用 spread 将我从 API 获得的对象添加到我的初始数据源中【英文标题】:Using spread to add an object that I get from API into my initial datasource 【发布时间】:2019-04-24 08:30:57 【问题描述】:

我确实有一个初始数据源:

const initState = 
  columns: [
    
      id: 'column-2',
      title: 'column-2',
      tabs: []
    
  ],
  columnOrder: ['column-2']
;

一旦应用程序加载(这是我为自己构建的 chrome 扩展程序),我会从 chrome 获得打开的选项卡,并希望将它们作为新列添加到此数据源中。

这是我的尝试:

export default (state = initState, action) => 
  switch (action.type) 
    case TABS_LOAD:
      return 
        columns: [
           id: 'chromeTabs', title: 'chromeTabs', tabs: action.payload ,
          ...state.columns
        ],
        columnOrder: ["chromeTabs", ...state.columnOrder]
      ;

    default:
      return state;
  
;

我希望通过上面的函数创建一个如下所示的数据对象:

const state = 
 columns: [
 
      id: 'chromeTabs,
      title: 'chromeTabs',
      tabs: 
[tab1,tab2,tab3,tab4]
    , 
    
      id: 'column-2',
      title: 'column-2',
      tabs: []
    
  ],
  columnOrder: ['chromeTabs', 'column-2']

;

不幸的是,这对我不起作用。我会很感激任何指示。

【问题讨论】:

你期望得到的 redux 状态是什么样的? “很遗憾,这对我不起作用……” 以什么方式?始终引用您收到的任何错误消息等,或者您看到的与您预期不符的行为。 另外,我不相信"chromeTabs" 是任何类型的有效语法。 【参考方案1】:

"chromeTabs" 是语法错误。要添加到 columnOrder 数组,只需使用 "chromeTabs" 而不在其周围使用

return 
  columns: [
     id: 'chromeTabs', title: 'chromeTabs', tabs: action.payload ,
    ...state.columns
  ],
  columnOrder: ["chromeTabs", ...state.columnOrder]
  // No  -----^-----------^
;

现场示例:

const initState = 
  columns: [
    
      id: 'column-2',
      title: 'column-2',
      tabs: []
    
  ],
  columnOrder: ['column-2']
;

const TABS_LOAD = "tabs-load";

const f = (state = initState, action) => 
  switch (action.type) 
    case TABS_LOAD:
      return 
        columns: [
           id: 'chromeTabs', title: 'chromeTabs', tabs: action.payload ,
          ...state.columns
        ],
        columnOrder: ["chromeTabs", ...state.columnOrder]
      ;

    default:
      return state;
  
;

console.log(f(initState, type: TABS_LOAD));
.as-console-wrapper 
  max-height: 100% !important;

【讨论】:

谢谢,让我再挖掘一下,根据你的代码,我的也应该可以工作,但是我的 console.log 显示了完全相同的结果。 @ilteris - 同样,"chromeTabs" 需要一个值是语法错误,因此包含它的代码永远不会运行(因为它根本无法解析)。

以上是关于使用 spread 将我从 API 获得的对象添加到我的初始数据源中的主要内容,如果未能解决你的问题,请参考以下文章

javascript 使用Object spread向对象添加新属性

无法使用为 vue cli 3 设置添加的 babel-plugin-transform-object-rest-spread 传播对象

使用扩展运算符替换集合的对象

Vimeo PHP API 如何将我最近上传的视频添加到频道?

如何将我从外部文件中的函数获得的字符串转换为全部大写[重复]

使用Spread制作对象类具有抽象方法的对象副本时如何解决错误?