简易 redux

背景

Redux 常常配合 react-redux 作为状态管理应用在 React 的项目中,并且基于 redux 发展出了 dva 之类的诸多状态管理工具。

说来惭愧,虽然在项目中常常使用到,但是并未阅读过 redux 的源码,了解其原理。本文作为学习笔记,并根据 redux 的比较核心的 createStore 这部分代码实现一个简易版本的 redux,以便将来回顾。

redux demo

redux 提供了使用 demo 如下:

import { createStore } from 'redux'

/**
 * 这是个 reducer,纯函数,用于描述状态是如何转变的
 * reducer 接收 state 和 action 作为参数
 */
function counter(state = 0, action) {
  switch (action.type) {
    case 'INCREMENT':
      return state + 1
    case 'DECREMENT':
      return state - 1
    default:
      return state
  }
}

// createStore:接收 reducer 作为参数,以此构建一个 store
let store = createStore(counter)

// 订阅 store, 每次 dispatch 的时候,都将触发回调
store.subscribe(() => console.log(store.getState()))

// dispath 一个 action
store.dispatch({ type: 'INCREMENT' })

简化的数据流

fiber

以上的数据流简化了 combineReducers 等过程

简易 redux

可以看出 redux 实际上就是一个发布订阅模式,简易版实现如下

const createStore = (reducer) => {
  let state
  // 订阅的回调
  let listeners = []

  // 获取 state
  const getState = () => {
    return state
  }

  const dispatch = (action) => {
    // 更新 state
    state = reducer(state, action)
    // 一旦 dispatch 就执行所有订阅的回调
    listeners.forEach((listener) => listener())
  }

  const subscribe = (listener) => {
    // 收集回调
    listeners.push(listener)
    return () => {
      // 取消订阅
      listeners = listeners.filter((l) => l !== listener)
    }
  }

  return {
    getState,
    dispatch,
    subscribe,
  }
}