跳至正文
Wener Notes

react-tracked

约 1 分钟阅读
    • 通过 proxy 跟踪变化 - 类似
    • 可以用于 useState, zustand , redux useSelector, 主要提供一个匹配的方法即可
    • 使用 proxy-compare
      • getUntracked, createProxy, isChanged
  • createTrackedSelector - useSelector -> useTrackedSelector
    • 访问属性会被 watch、select
  • createContainer
    • 提供类似 useReducer 的 hook
    • 返回 Provider, useTracked, useUpdate, useTrackedState, useSelector,
    • concurrentMode -> useContextUpdate
  • memo - 会处理 proxy 对象值变化
  • getUntrackedObject - 获取原始值
  • useTrackedState 每次返回新的 proxy 对象 - 不等
  • React.memo 无法处理传入 proxy 对象,导致值变化但不 rerender
  • 传值到 render 之外时记得 getUntrackedObject
TSX
const reducer = () => {};
const { Provider, useTracked } = createContainer(({ reducer, initialState, init }) =>
  useReducer(reducer, initialState, init),
);

// 直接使用状态的方式
const {} = createContainer(({ initialState = {} }) => useState(initialState));

// 使用 immer 更新
import produce from 'immer';
const useTrackedWithImmer = () => {
  const [state, setState] = useTracked();
  const update = useCallback(
    (updater) => {
      setState((oldVal) => produce(oldVal, updater));
    },
    [setState],
  );
  return [state, update];
};

const App = ({ initialState }) => (
  <Provider reducer={reducer} initialState={initialState}>
    ...
  </Provider>
);

关联信息

反向链接、本文链接的其他页面和外部资料。

站内链接

  • use-context-selector
    笔记 · use-context-selector

    支持 context 选取部分 - 监听部分变化 · 可以传递更新逻辑 - 支持 suspense · 支持 concurrent 模式 · 提供 BridgeProvider - 多个 render 上下文 · 无 Consumer · 参考

  • valtio
    笔记 · valtio

    pmndrs/valtio · 7kB/2.5kB - use-sync-external-store+proxy-compare · 基于 proxy 的状态管理 · 类似 mobx, vue · 默认状态变化是异步触发监听 · 可以使用 Class 作为 被代理对象

  • zustand
    笔记 · useStore

    pmndrs/zustand 是什么? · out of tree 状态管理 · 可外部查询、修改、订阅 · 可多个渲染树使用 · 支持 react concurrency · Context 可选 · 默认全局 store 单例 · 可在其它框架使用 - 不依赖 react

参考资料

GitHub2 条
最近更新commit bbadfd2编辑