【问题标题】:loading array data init immutable.js加载数组数据初始化 immutable.js
【发布时间】:2016-05-07 19:27:33
【问题描述】:

我正在将数组数据加载到我的减速器中,这就是我目前正在做的事情,它正在工作,有没有更好的方法来实现这一点? 我浏览过文档,但它们似乎是某种奇怪的象形文字形式

action.data = [{key: "value"},{key: "value2"}]
// ...

const initialState = Immutable.Map({
  loading: false,
  data: Immutable.List([]),
})

    case RECEIVE_DATA:
      return state 
        .set('data', Immutable.List(action.data.map(item => Immutable.Map(item))))

【问题讨论】:

  • 使用fromJS将js数据深度转换为不可变数据

标签: javascript reactjs redux immutable.js


【解决方案1】:

您可能会发现fromJS() 函数更简单:

fromJS() 将纯 JS 对象和数组深度转换为不可变映射 和列表。

例子:

action.data = [{key: "value"},{key: "value2"}]
// ...

const initialState = Immutable.fromJS({
  loading: false,
  data: [],
})

// ...
    case RECEIVE_DATA:
      return state.set('data', Immutable.fromJS(action.data))

【讨论】:

  • 我认为这是我正在寻找的,虽然我认为 const initialState = Immutable.Map({ 因为 loading 是一个状态值
  • 使用const initialState = Immutable.Map({...}) 不会将您的data 数组转换为列表。您必须在传递给Map() 的对象中手动执行此操作。使用fromJS() 肯定会更简单。您能否详细说明“加载是状态值”的含义?
  • 抱歉,我在编辑之前没有看到这条评论。 jsbin.com/cohenojape/edit?js,console,output 基本上是我想要达到的目标。值加载不是来自任何地方的 js,所以我认为将它作为状态的属性保存更合适,即在状态的地图内。
【解决方案2】:

你为什么使用Immutable.List.of

action.data = [{key: "value"},{key: "value2"}]
// ...

const initialState = Immutable.Map({
  loading: false,
  data: Immutable.List([]),
})

    case RECEIVE_DATA:
      return state 
        .set('data', Immutable.List.of(action.data))

【讨论】:

  • 你必须使用扩展运算符 .set('data', Immutable.List.of(...action.data)) 但我猜这样会更好
  • 或者您可以直接致电Immutable.List(action.data)。我个人更喜欢这个,因为它表示预期的数据结构,而 fromJS 可以是任何东西
  • List() 不会将内部对象从 action.data 转换为 Maps,它只会产生一个原生 JS 对象列表。将 Immutable 与本机类型混合会让人感到困惑,最好让整个结构都是 Immutable 的。 fromJS() 只是把数组改成Lists,把对象改成Maps,非常简单且可预测。
  • 好点。一开始我也不确定这一点,(如果你将数据放入一个不可变的不可变列表中,它是不可变的吗?)。我认为最好保持嵌套不可变结构并使用映射或记录,然后您可以 .get() 每个属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
  • 1970-01-01
  • 1970-01-01
  • 2018-08-13
  • 2020-10-24
  • 1970-01-01
  • 2012-11-24
相关资源
最近更新 更多