有可能还是我做错了?
let initialState = immutable.fromJS({some_store: "some initial data"});
const redux = createRedux(stores, initialState);
...
export function some_store(state, action) {
// state is undefined here
}
我想你想要的就是这样
// 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上使用不可变的缺点:
权衡由您决定!
@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正在做的“处理”是否在这里花费不更多?
据我从不可变性中了解到,渲染加快时,好处更多,对吗?
感谢您的反馈意见。
这样做的好处是,在大型阵列和对象上进行操作会减少内存消耗并加快工作速度。 在小型应用程序中并没有太大的区别。
好,谢谢。
所以我有正确的方法吗?
是的,对我来说很好。
到目前为止,权衡是值得的。
最有用的评论
@jsifalda
在Redux上使用不可变的优点:
在Redux上使用不可变的缺点:
权衡由您决定!