KO
|
EN
gitlite — search
Search
#python
#java
#python3
#arduino
#golang
#machine-learning
#rust
#html
#flask
#javascript
#seismology
#nodejs
zustand-computed-state
★ 20
Open GitHub ↗
No description available.
Download README (.md)
Explore Similar Repositories
trekker
:
A hackable browser for Emacs
TG-DL-Api-Workers
:
Creates download links to telegram files stored in channel. Deployable to cloudflare workers
modelscope-agent-with-local-llm
:
本项目基于modelscope-agent-v0.3和 api-for-open-llm 或 llamacpp 组件共同实现了一个AI Agent,能够利用本地的大模型(LLM)实现使用自定义工具功能。使用了Qwen1.5大模型。
LLM4CodeSummarization
:
No description available.
Deep_Motor_SDK
:
SDK For J60 Joint Module Control
// repository documentation
Was this content helpful?
★ 0
(0 ratings)
Select Rating:
★
★
★
★
★
Submit Feedback
Recent Feedback
×
Download README
Do you want to download the
README.md
file for
zustand-computed-state
?
Download (.md)
# zustand-computed-state [![npm package][npm-img]][npm-url] [![Release Status][release-img]][release-url] [![Downloads][downloads-img]][downloads-url] [![Issues][issues-img]][issues-url] zustand-computed-state is a lightweight, TypeScript-friendly middleware for the state management system [Zustand](https://github.com/pmndrs/zustand). It's a simple layer which adds a transformation function after any state change in your store. ## Install ```bash yarn add zustand-computed-state npm install zustand-computed-state pnpm add zustand-computed-state ``` ## Usage The middleware layer takes in your store creation function and a compute function, which transforms your state into a computed state. It does not need to handle merging states. ```js import { computed, compute } from 'zustand-computed-state'; const useStore = create( computed((set, get) => ({ count: 1, inc: () => set(state => ({ count: state.count + 1 })), dec: () => set(state => ({ count: state.count - 1 })), // get() function has access to computed states square: () => set(() => ({ count: get().countSq })), root: () => set(state => ({ count: Math.floor(Math.sqrt(state.count)) })), ...compute(get, state => ({ countSq: state.count ** 2, })), })) ); ``` With types, the previous example would look like this: ```ts import { computed } from 'zustand-computed-state'; type Store = { count: number; inc: () => void; dec: () => void; countSq: number; }; const useStore = create<Store>()( computed((set, get) => ({ count: 1, inc: () => set(state => ({ count: state.count + 1 })), dec: () => set(state => ({ count: state.count - 1 })), square: () => set(() => ({ count: get().countSq })), root: () => set(state => ({ count: Math.floor(Math.sqrt(state.count)) })), ...compute(get, state => ({ countSq: state.count ** 2, })), })) ); ``` The store can then be used as normal in a React component or via the Zustand API. ```tsx function Counter() { const { count, countSq, inc, dec } = useStore(); return ( <div> <span>{count}</span> <br /> <span>{countSq}</span> <br /> <button onClick={inc}>+1</button> <button onClick={dec}>-1</button> </div> ); } ``` ## With Getters Pattern Here's an example with the Getters Pattern ```ts const useStore = create<Store>()( devtools( computed((set, get) => compute<Store>({ count: 1, inc: () => set(prev => ({ count: prev.count + 1 })), dec: () => set(state => ({ count: state.count - 1 })), get countSq() { return this.count ** 2; }, }) ) ) ); ``` ## With Middleware Here's an example with the Immer middleware. ```ts const useStore = create<Store>()( devtools( computed( immer((set, get) => ({ count: 1, inc: () => set(state => { // example with Immer middleware state.count += 1; }), dec: () => set(state => ({ count: state.count - 1 })), ...compute(get, state => ({ countSq: state.count ** 2, })), })) ) ) ); ``` ## With Slice Pattern Only difference is sending an ID to compute function to separate computed states for each slide. ```diff - ...compute(get, state=>({xSq: state.x **2 })) + ...compute('x_slice', get, state=>({xSq: state.x **2 })) ``` ```ts type XSlice = { x: number; xSq: number; incX: () => void; }; type YSlice = { y: number; ySq: number; incY: () => void; }; type Store = YSlice & XSlice; const createCountSlice: StateCreator<Store, [], [], YSlice> = (set, get) => ({ y: 1, incY: () => set(state => ({ y: state.y + 1 })), ...compute('y_slice', get, state => ({ ySq: state.y ** 2, })), }); const createXySlice: StateCreator<Store, [], [], XSlice> = (set, get) => ({ x: 1, incX: () => set(state => ({ x: state.x + 1 })), ...compute('x_slice', get, state => ({ xSq: state.x ** 2, })), }); const store = create<Store>()( computed((...a) => ({ ...createCountSlice(...a), ...createXySlice(...a), })) ); ``` [release-img]: https://github.com/yasintz/zustand-computed-state/actions/workflows/release.yml/badge.svg [release-url]: https://github.com/yasintz/zustand-computed-state/actions/workflows/release.yml [downloads-img]: https://img.shields.io/npm/dt/zustand-computed-state [downloads-url]: https://www.npmtrends.com/zustand-computed-state-state [npm-img]: https://img.shields.io/npm/v/zustand-computed-state [npm-url]: https://www.npmjs.com/package/zustand-computed-state [issues-img]: https://img.shields.io/github/issues/yasintz/zustand-computed-state [issues-url]: https://github.com/yasintz/yasintz/zustand-computed-state/issues