react-tracked
约 1 分钟阅读
- dai-shi/react-trackedGitHubdai-shi/react-trackeddai-shi/react-tracked · 通过 proxy 跟踪变化 - 类似 valtio · 可以用于 useState, zustand useStore, redux useSelector, 主要提供一个匹配的方法即可 · 使用 proxy-compare笔记:react-tracked
- 通过 proxy 跟踪变化 - 类似 valtio笔记valtiopmndrs/valtio · 7kB/2.5kB - use-sync-external-store+proxy-compare · 基于 proxy 的状态管理 · 类似 mobx, vue · 默认状态变化是异步触发监听 · 可以使用 Class 作为 被代理对象打开:/notes/web/react/valtio
- 可以用于 useState, zustand useStore笔记zustandpmndrs/zustand 是什么? · out of tree 状态管理 · 可外部查询、修改、订阅 · 可多个渲染树使用 · 支持 react concurrency · Context 可选 · 默认全局 store 单例 · 可在其它框架使用 - 不依赖 react打开:/notes/web/react/zustand, redux useSelector, 主要提供一个匹配的方法即可
- 使用 proxy-compare
- getUntracked, createProxy, isChanged
- createTrackedSelector - useSelector -> useTrackedSelector
- 访问属性会被 watch、select
- createContainer
- 提供类似 useReducer 的 hook
- 返回 Provider, useTracked, useUpdate, useTrackedState, useSelector,
- concurrentMode -> useContextUpdate use-context-selector笔记use-context-selector支持 context 选取部分 - 监听部分变化 · 可以传递更新逻辑 - 支持 suspense · 支持 concurrent 模式 · 提供 BridgeProvider - 多个 render 上下文 · 无 Consumer · 参考打开:/notes/web/react/use-context-selector
- useContextUpdateGitHub PRreactjs/rfcs#119
- memo - 会处理 proxy 对象值变化
- getUntrackedObject - 获取原始值
- useTrackedState 每次返回新的 proxy 对象 - 不等
- React.memo 无法处理传入 proxy 对象,导致值变化但不 rerender
- 传值到 render 之外时记得 getUntrackedObject
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 条
- dai-shi/react-trackedgithub.com/dai-shi/react-tracked
- reactjs/rfcs#119github.com/reactjs/rfcs/pull/119