使用不可变 js 将 reducer 状态设置为返回数组
Use immutable js to set reducer state to returned array
我有一个简单的减速器示例:
import { fromJS } from 'immutable'
import {
REQUEST_SUCCESS
} from './constants'
const initialState = fromJS({
badges: []
})
function badgesReducer (state = initialState, action) {
switch (action.type) {
case REQUEST_SUCCESS:
return state
.set('badges', action.payload.badges || [])
default:
return state
}
}
export default badgesReducer
这里的想法是将徽章设置为等于 action.payload.badges
内的 api 响应返回的数组,但是我认为我做错了什么,因为我返回了以下错误:
warning.js:44 Warning: Failed prop type: Invalid prop badges
of type
object
supplied to Badges
, expected array
发生错误是因为 React 需要一个数组,但您返回的是一个 Immutable.List。 React 渲染组件两次,因为第一次渲染发生在 reducer initialState 上,然后第二次渲染是由于 props 更改(在调度操作之后)引起的。
您的道具不一致,因为您在 REQUEST_SUCCESS
操作中传递了 initialState 和数组中的 Immutable.List。
如果你想在任何地方都坚持使用 Immutable.js,那么就这样声明 propTypes。
组件
import React, { PropTypes } from 'react'
import { List } from 'immutable'
Component.propTypes = {
badges: PropTypes.instanceOf(List)
}
减速机
import { fromJS, List } from 'immutable'
function badgesReducer (state = initialState, action) {
switch (action.type) {
case REQUEST_SUCCESS:
return state
.set('badges', fromJS(action.payload.badges) || List())
default:
return state
}
}
如果您希望始终将数组传递给组件,请从 initialState 声明中删除 fromJS
我有一个简单的减速器示例:
import { fromJS } from 'immutable'
import {
REQUEST_SUCCESS
} from './constants'
const initialState = fromJS({
badges: []
})
function badgesReducer (state = initialState, action) {
switch (action.type) {
case REQUEST_SUCCESS:
return state
.set('badges', action.payload.badges || [])
default:
return state
}
}
export default badgesReducer
这里的想法是将徽章设置为等于 action.payload.badges
内的 api 响应返回的数组,但是我认为我做错了什么,因为我返回了以下错误:
warning.js:44 Warning: Failed prop type: Invalid prop
badges
of typeobject
supplied toBadges
, expectedarray
发生错误是因为 React 需要一个数组,但您返回的是一个 Immutable.List。 React 渲染组件两次,因为第一次渲染发生在 reducer initialState 上,然后第二次渲染是由于 props 更改(在调度操作之后)引起的。
您的道具不一致,因为您在 REQUEST_SUCCESS
操作中传递了 initialState 和数组中的 Immutable.List。
如果你想在任何地方都坚持使用 Immutable.js,那么就这样声明 propTypes。
组件
import React, { PropTypes } from 'react'
import { List } from 'immutable'
Component.propTypes = {
badges: PropTypes.instanceOf(List)
}
减速机
import { fromJS, List } from 'immutable'
function badgesReducer (state = initialState, action) {
switch (action.type) {
case REQUEST_SUCCESS:
return state
.set('badges', fromJS(action.payload.badges) || List())
default:
return state
}
}
如果您希望始终将数组传递给组件,请从 initialState 声明中删除 fromJS