redux-3
by Momo l
HTML
<script src="https://npmcdn.com/redux@latest/dist/redux.min.js"></script>
<div>
<p>
Clicked: <span id="value1">0</span> times
<button name="increment" data-id="one">+</button>
<button name="decrement" data-id="one">-</button>
</p>
</div>
<div>
<p>
Clicked: <span id="value2">0</span> times
<button name="increment" data-id="two">+</button>
<button name="decrement" data-id="two">-</button>
</p>
</div>
Babel + JSX
function counterReducer(state = 0, action) {
switch (action.type) {
case 'INCREMENT':
return state + 1;
case 'DECREMENT':
return state - 1;
default:
return state;
}
}
/**
* 使reducer可鉴别,只处理有一致标识符的action
*/
function identify(identifier, reducer) {
return function identifiable(state, action) {
//!important undefined 代表是初始化,需要返回缺省状态,直接委托给原reducer
let initState = null;
if (typeof state === 'undefined') {
initState = reducer(state, action);
}
let nextState = action.identifier === identifier
? reducer(state, action)
: state;
return initState !== null ? initState : nextState;
};
}
let rootReducer = Redux.combineReducers({
countOne: identify('one',counterReducer),
countTwo: identify('two',counterReducer)
});
let store = Redux.createStore(rootReducer);
let valueEl = document.getElementById('value1');
let valueE2 = document.getElementById('value2');
function render() {
console.log(store.getState());
valueEl.innerHTML = store.getState().countOne.toString();
valueE2.innerHTML = store.getState().countTwo.toString();
}
render();
store.subscribe(render);
function handleInc(id) {
return function inc() {
store.dispatch({
type: 'INCREMENT',
identifier: id
});
};
}
function handleDec(id) {
return function inc() {
store.dispatch({
type: 'DECREMENT',
identifier: id
});
};
}
Array.from(
document.getElementsByName('increment')
).forEach((ele) => {
ele.addEventListener('click', handleInc(ele.dataset['id']));
});
Array.from(
document.getElementsByName('decrement')
).forEach((ele) => {
ele.addEventListener('click', handleDec(ele.dataset['id']));
});