Skip to content

实现一个 mini redux

使用 useSyncExternalStore 赋能,用 40 行不到的代码实现一个 mini reduxGithub Link

实现

js
import { useSyncExternalStore } from 'react'

const createMiniReduxStore = (reducer, initialState) => {
  let state = initialState
  const listeners = new Set()

  const subscribe = (listener) => {
    listeners.add(listener)

    return () => {
      listeners.delete(listener)
    }
  }

  const getSnapshot = () => {
    return state
  }

  const dispatch = (action) => {
    state = reducer(state, action)

    listeners.forEach((l) => l())

    return action
  }

  return {
    subscribe,
    getSnapshot,
    dispatch,
  }
}

const useMiniReduxStore = (store) => {
  const state = useSyncExternalStore(store.subscribe, () => store.getSnapshot())

  return state
}

export { createMiniReduxStore, useMiniReduxStore }
js
import { createMiniReduxStore, useMiniReduxStore } from '/@/utils/mini-redux'

const reducer = (state, action) => {
  switch (action.type) {
    case 'ADD':
      return { data: state.data + 1 }

    case 'MULTIPLY':
      return { data: state.data * action.value }

    default:
      return state
  }
}

const initialState = { data: 0 }

const store = createMiniReduxStore(reducer, initialState)

const useDataStore = () => {
  return useMiniReduxStore(store)
}

const useDataDispatch = () => {
  return store.dispatch
}

export { useDataStore, useDataDispatch }