example
实现一个简单的redux计数的例子
第一步: 简单的改变数据
let initState = {count: 0}
function reducer(state = initState, action) {
switch (action.type) {
case 'INCREMENT':
return {
...state,
count: state.count + 1
}
case 'DECREMENT':
return {
...state,
count: state.count - 1
}
default:
return state;
}
}
function createStore(reducer){
let state = reducer(undefined, {}) // 如果不在同一个文件下,`reducer(undefined, {})`会返回初始化的`state`
let listeners = []
function getState() {return state}
function check() {throw new Error('Action Must Be Object')}
function dispatch(action = check()) {
state = reducer(state, action)
for(let i = 0; i < listeners.length; i++){
const listen = listeners[i]
listen()
}
}
function subscribe(listen){
listeners.push(listen)
}
return {subscribe, getState, dispatch}
}
//如果`reducer`和`createStore`不在一个文件夹下, 你可以改下`createStore`加个参数去接收`reducer`
let store = createStore(reducer)
store.subscribe(function() {
let state = store.getState()
console.log('subscribe state count is', state.count)
})
store.dispatch({})
store.dispatch({type: 'INCREMENT'})这个是一个简单版的redux。
第二步:reducers添加combineReducers函数
reducers添加combineReducers函数可以发现这个是一个reducer的,在正常的开发中会有多个reducer, 比如: 首先是countReducer:
接下来就是infoReducer:
可见这里有两个reducers了,我们需要一个combineReducers来做这样的事情:
接下来就实现这个combineReducers:
最后返回改变之后的state.具体的demo请点击这里
上面这些就是关于redux combineReducers的部分。
很早之前看redux源码感觉挺复杂,如今结合看来倒是挺好。
本文原文请点击这里, 有部分有更改。
Last updated