初始化 State

来源:互联网 发布:asynchttp post json 编辑:程序博客网 时间:2024/05/01 11:27

初始化State的方法有以下方法:

1.在创建store 的时候,createStore()方法的第二个参数preloadeState参数是初始化state的。

2.在reducer中设置state的初始值state={...},也可以使用ES6中默认的参数语法: function myReducer(state = someDefaultValue,action)如下代码:



如果不使用 combineReducers() 或者类似的代码,那么 preloadedState 总是会优先于在 reducer 里面使用 state = ... ,因为 state 传到 reducer 里的 preloadedState 的 state 而不是 undefined,所以 ES6 的默认参数语法并不起作用。

如果使用 combineReducers() 方法,那么这里的行为就会有一些细微的差别了。那些指定了 preloadedState 的 reducer 会接收到那些对应的 state。而其他的 reducer 将会接收到 undefined 并因此回到了 state = ... 这里去获取指定的默认值。

通常情况下,通过 preloadedState 指定的 state 要优先于通过 reducer 指定 state。这样可以使通过 reducer 默认参数指定初始数据显得更加的合理,并且当你从一些持久化的存储器或服务器更新 store 的时候,允许你更新已存在的数据(全部或者部分)。

总结

综上所述,如果你遵守 Redux 的约定并且要让 reducer 中 undefined 的 state 参数返回初始 state (最简单的实现方法就是利用 ES6 的默认参数来指定 state),那么对于组合多个 reducers 的情况,这将是一个很有用的做法,他们会优先选择通过 preloadedState 参数传到 createStore() 的对象中的相应值,但是如果你不传任何东西,或者没设置相应的字段,那么 reducer 就会选择指定的默认 state 参数来取代。这样的方法效果很好,因为他既能用来初始化也可以用来更新现有的数据,不过如果数据没有保护措施的话,这样做也会使一些独立的 reducer 的 state 被重新赋值。当然你可以递归地使用这个模式,比如你可以在多个层级上使用 combineReducers() 方法,或者甚至手动的组合这些 reducer 并且传入对应部分的 state tree。


0 0
原创粉丝点击