Redux: 如何使用不可变对象初始化Redux

创建于 2015-06-20  ·  26评论  ·  资料来源: reduxjs/redux

有可能还是我做错了?

let initialState = immutable.fromJS({some_store: "some initial data"});
const redux = createRedux(stores, initialState);
...
export function some_store(state, action) {
    // state is undefined here
}
help wanted question

最有用的评论

@jsifalda

在Redux上使用不可变的优点:

  • 你不能错误地变异
  • 大型阵列和对象可实现更快的性能和更好的内存消耗

在Redux上使用不可变的缺点:

  • 为您的团队学习的新API
  • 捆绑包尺寸增加
  • 调试起来有点棘手

权衡由您决定!

所有26条评论

我想你想要的就是这样

// stores/some-store.js
import Immutable from 'immutable'

const { Map, List, fromJS } = Immutable
const initialState = Map({
  foo: 'bar',
  fooList: List()
})

export function someStore (state = initialState, action) {
  if (action.type === 'FOO') {
    return state.set('foo', fromJS(action.foo))
  }
  if (action.type === 'FOO_LIST') {
    return state.set('fooList', fromJS(action.fooList))
  }

  return state
}

// stores/index.js
export { default as someStore } from './some-store'

// application.js
import * as stores from './stores'

const redux = createRedux(stores)

您应该让商店使用默认参数(如显示的@emmenko)定义自己的初始状态。

initialState参数仅用于从服务器或localStorage补水状态。 ( @acdlite ,我们可能想在文档中对此进行解释。)

就是说,您尝试过的应该起作用。 有人可以调查吗?

不,我尝试过的方法不起作用。 我只想在一个地方为所有商店创建初始数据。 我想这是我不应该做的。

我只想在一个地方为所有商店创建初始数据。 我想这是我不应该做的。

由你决定。 我发现最好分割初始数据。

不过,如果某事不起作用,让我们保持打开状态吗? 下周我将再次访问,看看为什么它不起作用。

问题在于composeStores假定根状态是一个普通的JS对象,并使用state[key]访问属性,而使用Immutable.Map失败。 我认为它可以与Immutable.Record因为这可以通过常规JS属性访问字段。

但是,可能在其他地方假设一个普通对象。

哦。 真是太好了! 感谢您的解释。 这是很合理的。

由于同样的原因,使用连接器也会失败: isPlainObject(Immutable.Record) === false

@pierregm这实际上是正确的。 如果将Record属性分布在各个组件props上,则无论如何都行不通。 编写select={state => state.get('something').toJS()}

我能够使它像这样工作

// store
const initialState = Immutable.fromJS({}).toOrderedMap();

export default function streamStore(state = initialState, action) {
  switch (action.type) {

    case actionTypes.FETCH_STREAM_DONE:
      var streamMap = {};

      for (var i in action.stream_data) {
        var item = action.stream_data[i];
        streamMap[item.id] = item;
      }
      return state.merge(Immutable.fromJS(streamMap).toOrderedMap());

    default:
      return state
  }
};

// select
function select(state) {
  return {stream: state.stream.toList()}
}

它可以完美工作,但最终会重新呈现流中的所有项目(列表视图)。 我想知道如何实现一种在存储级别比较旧状态与新状态的方法,并在数据没有更改的情况下使在此处呈现任何组件的需求无效。 NuclearJS使用不可变的结构来做到这一点。 推荐的方法是在redux中实现类似的东西吗?

@owais

签出重新选择: https :

@gaearon酷! 在ReactEurope BTW上精彩演讲! 谢谢。

这是我尝试将Immutable.js与redux 1.0.0, https://github.com/gajus/redux-immutable结合使用

不错@gajus! 现在测试redux-immutable并真正喜欢https://github.com/gajus/canonical-reducer-composition模式

谢谢@chiplay。 如果您遇到缺陷或有改进的想法,我将非常感谢您提供反馈。

将不可变结构与redux一起使用有什么优势? 当redux基于不可变行为时(例如,存储返回状态的新副本)? 性能(是否有基准?)? 或者是其他东西? 谢谢

@jsifalda

在Redux上使用不可变的优点:

  • 你不能错误地变异
  • 大型阵列和对象可实现更快的性能和更好的内存消耗

在Redux上使用不可变的缺点:

  • 为您的团队学习的新API
  • 捆绑包尺寸增加
  • 调试起来有点棘手

权衡由您决定!

@gaearon
非常感谢您提供快速有用的答案!

如果您想要符合Redux标准的ImmutableJs&Redux,可以查看https://github.com/indexiatech/redux-immutablejs

@gaearon是否可以在网站上放置链接?

谢谢阿萨夫。 我相信人们会发现它有用。

2015年9月4日,18:36,Asaf Shakarchi [email protected]写道:

如果您想要符合Redux标准的ImmutableJs&Redux,可以查看https://github.com/indexiatech/redux-immutablejs

@gaearon是否可以在网站上放置链接?

-
直接回复此电子邮件或在GitHub上查看。

@asaf

好东西,您想对Ecosystem.md建立PR吗?
如果您将测试添加到项目中,我会很乐意将其添加到那里。

@gaearon完成单元测试,PR是: https :

谢谢!

大家好,
@gaearon的一个小问题,

基本用例:从API调用获取数据集合并将其存储在reducer中...

从我的减速器
没有ImmutableJS:

const initialStore = {
    isLoading : false,
    error     : null,
    data      : []
}

// in the switch case
return {
   ...state,
   isLoading: false,
   error: null,
   data: action.result
}

使用ImmutableJS

const initialStore = Map({
    isLoading : false,
    error     : null,
    data      : List()
})

// in the handler function
return state.merge({
    isLoading: false,
    error: null,
    data: List(result.result)
})

我想知道ImmutableJS正在做的“处理”是否在这里花费不更多?

据我从不可变性中了解到,渲染加快时,好处更多,对吗?

感谢您的反馈意见。

这样做的好处是,在大型阵列和对象上进行操作会减少内存消耗并加快工作速度。 在小型应用程序中并没有太大的区别。

好,谢谢。
所以我有正确的方法吗?

是的,对我来说很好。

到目前为止,权衡是值得的。

此页面是否有帮助?
0 / 5 - 0 等级