A tiny state management library based on Immer and useSyncExternalStoreExtra
yarn add @bete/mut
或 npm install @bete/mut
import * as React from 'react'
import * as ReactDOM from 'react-dom'
import { createStore, useSelector, Provider } from '@bete/mut'
interface State {
count: number
value: number
}
const store = createStore<State>({
count: 0,
value: 0
})
function App() {
return (
<Provider store={store}>
<Label />
<Label2 />
<Buttons />
<Reset />
</Provider>
)
}
function Label() {
const selector = React.useCallback(state => state.count, [])
const count = useSelector<State, number>(selector)
console.log('render count:', count)
return <div>count: {count}</div>
}
function Label2() {
const selector = React.useCallback(state => state.value, [])
const value = useSelector<State, number>(selector)
console.log('render value:', value)
return <div>value: {value}</div>
}
function Reset() {
const reset = () => {
store.reset()
}
return (
<button onClick={reset}>decreaseValue</button>
)
}
function Buttons() {
const handleIncrease = () => {
store.mutate(state => {
state.count++
})
}
const handleDecrease = () => {
store.mutate(state => {
state.count--
})
}
const handleIncreaseV = () => {
store.mutate(state => {
state.value++
})
}
const handleDecreaseV = () => {
store.mutate(state => {
state.value--
})
}
return (
<div>
<button onClick={handleIncrease}>increase</button>
<button onClick={handleDecrease}>decrease</button>
<button onClick={handleIncreaseV}>increaseValue</button>
<button onClick={handleDecreaseV}>decreaseValue</button>
</div>
)
}
ReactDOM.render(<App />, document.getElementById('root'))
function createStore<T>(initialState: T): Store<T>
interface Store<T> {
subscribe: (listener: Listener) => () => void
unsubscribe: (listener: Listener) => void
reset: () => void
mutate: (updater: (draft: Draft<T>) => void | T) => void
setState: (nextState: T | UpdateFn<T>) => void
getState: () => T
}
const store = createStore()
<Provider store={store}>
{children}
</Provider>
function useSelector<T, K = unknown>(selector: (state: T) => K, equalityFn?: (a: K | undefined, b: K | undefined) => boolean): K
Example
const selector = React.useCallback(state => state.value, [])
const value = useSelector<State, number>(selector)