我使用的是this starter kit,下面的代碼可以在this fork上找到。使用Redux從還原器返回承諾
計數器組件:
export const Counter = (props) => (
<div style={{ margin: '0 auto' }} >
<h2>Counter: {props.counter}</h2>
<button className='btn btn-default' onClick={props.double}>
Double (Async)
</button>
</div>
)
Counter.propTypes = {
counter : React.PropTypes.number.isRequired,
double : React.PropTypes.func.isRequired,
increment : React.PropTypes.func.isRequired
}
export default Counter
和容器組件:
import { connect } from 'react-redux'
import { increment, double } from '../modules/counter'
import Counter from '../components/Counter'
const mapDispatchToProps = {
increment :() => increment(1),
double:() => double()
}
const mapStateToProps = (state) => {
return {
counter : state.counter
}
}
export default connect(mapStateToProps, mapDispatchToProps)(Counter)
的行動:
export const COUNTER_INCREMENT = 'COUNTER_INCREMENT'
export const COUNTER_DOUBLE = 'COUNTER_DOUBLE'
// ------------------------------------
// Actions
// ------------------------------------
export const increment = (value = 1) => {
return {
type: COUNTER_INCREMENT,
payload: value
}
}
export const double = (value = 0) => {
return {
type: COUNTER_DOUBLE,
payload: value
}
}
const doubleAsync = (state) => {
return (dispatch, getState) => {
return new Promise((resolve) => {
setTimeout(() => {
dispatch(increment(state))
resolve()
}, 200)
})
}
}
export const actions = {
increment,
double
}
const ACTION_HANDLERS = {
[COUNTER_INCREMENT]: function (state, action) {
return state + action.payload
},
[COUNTER_DOUBLE]: (state, action) => {
return doubleAsync()
}
}
}
而減速:
const initialState = 0
export default function counterReducer(state = initialState, action) {
const handler = ACTION_HANDLERS[action.type]
return handler ? handler(state, action) : state
}
但是,COUNTER_DOUBLE
動作處理程序似乎沒有更新視圖,也沒有任何呈現。我得到這樣的警告:
警告:無法道具類型:提供給
Counter
型function
的無效道具counter
,預計number
。
我意識到我已經定義了一個數字propType
並且返回promise函數導致這個錯誤。我甚至試圖修改mapDispatchToProps
來返回執行的promise函數無濟於事。我究竟做錯了什麼?
我在這裏搜索和達成的共識似乎是使用redux-thunk包裝承諾與立即執行的功能,但我很難得到這個工作。
任何幫助,將不勝感激!
沒錯。訣竅是當承諾完成時觸發另一個行動。承諾不應該存儲在狀態。創建一箇中間件可以爲每個異步操作觸發3個動作 - 「掛起」,「成功」和「錯誤」,這很好。你甚至可以創建通用的reducers來存儲數據或錯誤。 – Sulthan