[TypeScript/React Hooks] useReducer + useContextで死ぬほど簡単にグローバルなストアを作る
7244 ワード
import React, {
createContext,
FC,
useContext,
useEffect,
useReducer,
} from 'react'
type NewStateAction = Partial<S> | ((prevState: S) => Partial<S>)
type ContextValue = {
globalState: S
setGlobalState: (newState: NewStateAction) => void
}
type S = typeof initialState
const initialState = {
count: 0,
}
export const Store = createContext({} as ContextValue)
export const Provider: FC<{}> = ({ children }) => {
const [globalState, setGlobalState] = useReducer(
(prev: S, newState: NewStateAction) => {
const _newState =
typeof newState === 'function' ? newState(prev) : newState
return { ...prev, ..._newState }
},
initialState,
)
useEffect(() => {
// count が変更された場合の処理
}, [globalState.count])
return (
<Store.Provider value={{ globalState, setGlobalState }}>
{children}
</Store.Provider>
)
}
おわり。勢いで書いたのでどっか間違ってるかもしれません。
コンポーネントでは以下のように使います。
const Component = props => {
const { globalState, setGlobalState } = useContext(Store)
globalState.count // get
setGlobalState({ count: 1 }) // set
setGlobalState(({ count }) => ({ count: count + 1 })) // set
}
const App = () => (
<Provider>
<Component></Component>
</Provider>
)
useEffect など通常の React Hooks の API が使えるので統一感があっていいですね!!
Author And Source
この問題について([TypeScript/React Hooks] useReducer + useContextで死ぬほど簡単にグローバルなストアを作る), 我々は、より多くの情報をここで見つけました https://qiita.com/yarnaimo/items/28b409f7a4de7d65e490著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .