我正在尝试复制类似于redux docs' basic example中的TodoList示例的内容。第二个reducer接收一个数组 - styleItems = [{... ... }, {... ...}]
- 然后调用第一个函数来处理每个单独的对象。
我通过以下内容向应用容器提供initialState
,如containers/app.js
所示。但是,传递给styleItems
reducer的状态似乎是一个空白数组 - 每次都是。
但是,react会根据初始配置呈现UI,并且dev-tools会按预期显示状态结构。 redux商店是否会以某种方式看到同样的反应?
容器/ app.js
function starterInfo(state) {
return {
// The ID of this particular object
id: 12345,
// Various keys and theri css values
styleItems: [
{
pk: 31,
order: 1,
label: 'Caption text color',
css_identifier: '.caption-text',
css_attribute: 'color',
css_value: '#FFFFFF'
},
{
pk:23,
order: 2,
label: 'Caption link color',
css_identifier: '.caption-link',
css_attribute: 'color',
css_value: '#FEFEFE'
}
],
// Network state info
currently_fetching: false,
currently_posting: false
}
}
export default connect(starterInfo)(App)
减速器/ index.js
// This handles a single styleItem object within the array
function change_css(state = {}, action){
switch (action.type){
case actions.CHANGE_CSS:
if (state.order !== action.order){
return state
}
return {
...state,
css_value
}
default:
return state
}
}
// This handles the styles array in the global state
function styleItems(state = [], action){
switch(action.type){
case actions.CHANGE_CSS:
const foobar = state.map(styleItem =>
change_css(styleItem, action)
)
return foobar
default:
return state
}
}
答案 0 :(得分:7)
简短的回答是你没有完全正确地通过初始状态。 React Redux绑定的connect
函数的第一个参数是mapStateToProps
。此功能的目的是获取应用程序中已的状态,并将其映射到组件的props。你在starterInfo
函数中所做的只是对你的组件的状态进行硬编码。因为你正在返回一个普通对象,React并不真正知道它的区别,所以它工作得很好,但是Redux还不知道你的app状态。
相反,你应该做的是直接向reducers提供你的初始状态,如下所示:
const intialStyleItemsState = [
{
pk: 31,
order: 1,
label: 'Caption text color',
css_identifier: '.caption-text',
css_attribute: 'color',
css_value: '#FFFFFF'
},
{
pk:23,
order: 2,
label: 'Caption link color',
css_identifier: '.caption-link',
css_attribute: 'color',
css_value: '#FEFEFE'
}
];
function styleItems(state = intialStyleItemsState, action){ ...
最终,因为你要将你的Reducer拆分起来,你需要再次使用Redux的combineReducers
实用程序将它们组合在一起,将root reducer提供给你的商店并从那里开始。
答案 1 :(得分:1)
您还可以使用redux函数createstore传递初始状态,该函数将参数createStore(reducer,[initialState])http://rackt.org/redux/docs/api/createStore.html
假设你有两个减速器
change_css(state = {}, action)
function styleItems(state = [], action)
如果您使用comibneReducer初始化您的状态
var reducer = combineReducers({
css: change_css,
items: styleItems
})
现在
var store = createStore(reducer)
console.log(store.getState())
您的商店将包含{ css: {}, items: [] }
现在,如果要初始化状态,可以将初始状态作为createStore函数的第二个参数传递。
createStore(reducer, {css:{some properties},items:[{name:"obj1"},{name:"obj2"},{name:"obj3"}]})
现在你的商店将包含初始状态。 {css:{some properties,items:[{name:"obj1"},{name:"obj2"},{name:"obj3"}]}
例如,您可以从服务器提供此状态,并将其设置为应用程序的初始状态