redux源码分析:用 redux + react 搭建一个极简的计数器项目

搭建一个极简的项目,用来分析 redux 源码
更新于: 2021-12-19 12:57:28

先列重点

1. 准备 store

2. 准备 render 函数 —— 即运行这个方法,可以刷新 UI

3. 先运行一次 render();

4. 做好订阅 store.subscribe(render)保证后续更新可以触发 render 再次执行

.
├── README.md
├── package.json
└── src
    ├── index.js
import React from 'react';
import ReactDOM from 'react-dom';
import { createStore } from 'redux';

const root = document.getElementById('root');

// reducer 纯函数
const reducer = (state = 0, action) => {
};

// 创建一个store
const store = createStore(reducer);

const render = () => ReactDOM.render(
  <div className="counter">
    <span>{store.getState()}</span>
  </div>,
  document.getElementById('root')
);

render();

// store订阅一个更新函数,待dispatch之后,执行这个更新函数,获取新的值
store.subscribe(render);

 

项目结构如下

.
├── README.md
├── package-lock.json
├── package.json
├── public
│   ├── favicon.ico
│   ├── index.html
│   ├── logo192.png
│   ├── logo512.png
│   ├── manifest.json
│   └── robots.txt
└── src
    ├── index.js
    └── logo.svg

2 directories, 11 files

核心文件 index.js

import React from 'react';
import ReactDOM from 'react-dom';
import { createStore } from 'redux';

const root = document.getElementById('root');

// reducer 纯函数
const reducer = (state = 0, action) => {
  switch (action.type) {
    case 'INCREMENT':
      return state + 1;
    case 'DECREMENT':
      return state - 1;
    case 'ANY':
      store.dispatch({ type: 'DECREMENT' });
      return state;
    default:
      return state;
  }
};

// 创建一个store
const store = createStore(reducer);

const render = () => ReactDOM.render(
  <div className='counter'>
    <span>{store.getState()}</span>
    <button onClick={() => store.dispatch({ type: 'INCREMENT' })}>INCREMENT</button>
    <button onClick={() => store.dispatch({ type: 'DECREMENT' })}>DECREMENT</button>
    <button onClick={() => store.dispatch({ type: 'ANY' })}>ZUOSI</button>
  </div>,
  root,
);
render();
// store订阅一个更新函数,待dispatch之后,执行这个更新函数,获取新的值
store.subscribe(render);