Appearance
原生计数器
本节目标:理解“原生计数器”的核心思路,并能把它用于实际开发或面试表达。
reduxcreateStore.ts
create-react-app zhufeng_redux_preparecd zhufeng_redux_preparenpm install redux -Syarn startpublic\index.html
<!DOCTYPEhtml>
<htmllang="en"><head><metacharset="utf-8"/\>
<metaname="viewport"content="width=device-width,initial-scale=1" /\>
<metaname="theme-color"content="#000000"/\>
<metaname="description"content="Website created using create-react-app"/\>
<title>ReactApp</title></head><body><divid="root"></div><divid="counter"><pid="counter-value">0</p><buttonid="add-btn">+</button><buttonid="minus-btn">-</button></div></body>
</html>src\redux\index.js
export{ default as createStore } from
'./createStore';src\redux\createStore.js
/*** 创建仓库 * @param {*} reducer 处理器 * @param {*} preloadedState 默认状态 或者 说初始状态
*/
functioncreateStore(reducer,preloadedState){let state =
preloadedState;let listeners = [];function
getState(){return
state;}function
dispatch(action){//根据老状态和action动作,计算新状态 state =
reducer(state,action);listeners.forEach(l=\>
l());}function
subscribe(listener){
listeners.push(listener);}return {
getState,//用来获取当前的仓库中的状态
dispatch,//向仓库派发动作
subscribe,//用来订阅仓库中的状态的变化
}
}
exportdefault
createStore;src\index.js
/*** redux不需要依赖react
*/
import{ createStore } from
'./redux';
constADD =
'ADD';
constMINUS =
'MINUS';
letinitialState =
0;
/**** @param {*} oldState 老状态 可以是任何类型的数据 * @param {*} action 动作对象 普通的JS对象 {type:'ADD',payload:1}
*/
functionreducer(oldState,action){switch
(action.type){case
ADD: `return` `oldState` `+`
1; `case`
MINUS: `return` `oldState` `-`
1;default: `return`
oldState;}
}
letstore =
createStore(reducer,initialState);
letcounterValue =
document.getElementById('counter-value');
letaddBtn =
document.getElementById('add-btn');
letminusBtn =
document.getElementById('minus-btn');
functionrender(){
counterValue.innerHTML=
store.getState();
}
render();
store.subscribe(render);
addBtn.addEventListener('click',() =\>
store.dispatch({type: ADD
}));
minusBtn.addEventListener('click',() =\>
store.dispatch({type: MINUS }));
store对象dispatch一个代表一种操作和相应操作值的对象之后;- 就会执行
reducer,并传入store之前的值和操作对象; - 然后
reducer会根据传入的操作对象和store旧值,算出新的值; - 然后用这个新的值替换老的
store; - 在整个过程中,老的
store值并未被修改,只是store转存了一个新值,也就是说,reducer是一个纯函数,并不会修改传入函数的参数;
