反応フックによる状態管理
22242 ワード
私はここで反応フックを使用して状態管理を提示するビデオに基づいて.
州管理によって、私はどんなコンポーネントにも属していないが、プロバイダーコンポーネントの内部で作成された共有状態を作成することを意味します.そのためには、コンテキストを作成する必要があります.ここでは、ストアに対処するために必要な機能をすべて提供します.
どのように、我々はこのユーティリティ機能を使いますか?さて、私たちは、私たちが提供したい店でより具体的に定義されたものに基づいて、他のユーティリティ機能を定義したいかもしれません.たとえば、我々はカウンタアプリの状態を管理したいとしましょう.そのためには店が必要です.
ご存知のように、両方のケースでは、特定の種類のストア(この場合、「カウンター」タイプのストア)を扱うAPIを定義しています.そして、APIは両方のケースで同じです.
だから、いくつかの店を作成し、アプリでそれらを使用する時間です.
を使いましょう
ここではどのように我々は
に戻る
我々のカウンターストアのバージョン2を使いたいと言いましょう
これにより、ストアのバージョン2で状態を管理する必要があります.The
州管理によって、私はどんなコンポーネントにも属していないが、プロバイダーコンポーネントの内部で作成された共有状態を作成することを意味します.そのためには、コンテキストを作成する必要があります.ここでは、ストアに対処するために必要な機能をすべて提供します.
import {useState,createContext,useContext} from 'react'
const makeStore=(initialValue)=>{
const context=createContext()
const StoreProvider=({children})=>{
const ctxValue=useState(initialValue)
return <context.Provider value={ctxValue}>{children}</context.Provider>
}
const useStore=()=>useContext(context)
return {useStore,StoreProvider}
}
export default makeStore
ご覧のように、この関数はプロバイダーコンポーネントの状態を宣言しますuseState
フック.我々が代わりに使用するならばuseReducer
そうすることもできます.import {useReducer,createContext,useContext} from 'react'
const makeStoreBis=(reducer,initialValue)=>{
const context=createContext()
const StoreProvider=({children})=>{
const ctxValue=useReducer(reducer,initialValue)
return <context.Provider value={ctxValue}>{children}</context.Provider>
}
const useStore=()=>useContext(context)
return {useStore,StoreProvider}
}
export default makeStoreBis
この最後のケースでは、状態の初期値をプラスする還元関数を供給する必要があります.どのように、我々はこのユーティリティ機能を使いますか?さて、私たちは、私たちが提供したい店でより具体的に定義されたものに基づいて、他のユーティリティ機能を定義したいかもしれません.たとえば、我々はカウンタアプリの状態を管理したいとしましょう.そのためには店が必要です.
import makeStore from './makeStore'
const makeCounterStore=(initialValue)=>{
const counterStore= makeStore(initialValue)
const {useStore,StoreProvider:CounterProvider} = counterStore
const useCounter=()=>{
const [counter]=useStore()
return counter
}
const useIncrement=()=>{
const [,setCounter]=useStore()
return ()=>setCounter(counter=>counter+1)
}
const useDecrement=()=>{
const [,setCounter]=useStore()
return ()=>setCounter(counter=>counter-1)
}
return {CounterProvider,useCounter,useIncrement,useDecrement}
}
export default makeCounterStore
ここではmakeCounterStore
ユーティリティ機能.それは状態の初期値だけを必要とします.また、定義することができますmakeCounterStoreBis
他のバージョンのmakestoreを使用する関数useReducer
フック):import makeStoreBis from './makeStoreBis'
export const INCREMENT='INCREMENT'
export const DECREMENT='DECREMENT'
const getIncrement=()=>({type:INCREMENT})
const getDecrement=()=>({type:DECREMENT})
const makeCounterStoreBis=(reducer,initialValue)=>{
const counterStore= makeStoreBis(reducer,initialValue)
const {useStore,StoreProvider:CounterProvider} = counterStore
const useCounter=()=>{
const [counter]=useStore()
return counter
}
const useIncrement=()=>{
const [,dispatch]=useStore()
return ()=>dispatch(getIncrement())
}
const useDecrement=()=>{
const [,dispatch]=useStore()
return ()=>dispatch(getDecrement())
}
return {CounterProvider,useCounter,useIncrement,useDecrement}
}
export default makeCounterStoreBis
この最後のケースでmakeCounterStoreBis
関数はパラメータとして供給される減速器を必要とする.ご存知のように、両方のケースでは、特定の種類のストア(この場合、「カウンター」タイプのストア)を扱うAPIを定義しています.そして、APIは両方のケースで同じです.
だから、いくつかの店を作成し、アプリでそれらを使用する時間です.
を使いましょう
makeCounterStore
, 状態の初期値を必要とするもの.ここではどのように我々は
App
コンポーネントimport counterStore from './stores/counter'
import Counter from './components/Counter'
const {CounterProvider}=counterStore
function App() {
return (
<CounterProvider>
<Counter />
</CounterProvider>
);
}
export default App;
ご覧のように、我々は2009年に作成されたストアをインポートしている./stores/counter
. このファイルの内容を見てみましょう.import makeCounterStore from "../utils/makeCounterStore"
export default makeCounterStore(0)
我々は、新しい店を呼び出すことによってmakeCounterStore(0)
(状態の初期値は0
).に戻る
App
コンポーネントを参照してくださいCounter
コンポーネント.これがcounter
コンポーネントのようになります.import counterStore from '../stores/counter'
const {useCounter,useDecrement,useIncrement}=counterStore
function Counter(){
const counter=useCounter()
const increment=useIncrement()
const decrement=useDecrement()
return <div>
<button onClick={increment}>+</button>{counter}<button onClick={decrement}>-</button></div>
}
export default Counter
そしてそれはすべてのカウンタのアプリを持っているとフックの状態(共有状態)を管理して実行する必要があります.我々のカウンターストアのバージョン2を使いたいと言いましょう
makeCounterStoreBis
. この場合、供給される還元関数を必要とします.でもまずどうやって見ましょうApp
コンポーネントの変更import counterStore from './stores/counterBis'
import Counter from './components/Counter'
const {CounterProvider}=counterStore
function App() {
return (
<CounterProvider>
<Counter />
</CounterProvider>
);
}
export default App;
ご存知のように、我々は我々のカウンターストアを輸入しているという例外で、前と全く同じコンポーネントです./stores/counterBis
の代わりに./stores/counter
前と同じ.では、見てみましょうcounterBis
file (ストアを作成するファイル)import makeCounterStoreBis,{INCREMENT,DECREMENT} from '../utils/makeCounterStoreBis'
const reducer=(counter,action)=>{
switch(action.type){
case INCREMENT:
return counter+1
case DECREMENT:
return counter-1
default:
return counter
}
}
export default makeCounterStoreBis(reducer,0)
このファイルではカウンターストアをインスタンス化します.私たちはまた、還元される還元器を定義しますmakeCounterStoreBis
とこのストアの初期状態0
).これにより、ストアのバージョン2で状態を管理する必要があります.The
Counter
今、私たちが店を輸入するという意味でのコンポーネントの変更stores/counterBis
の代わりにstores/counter
, しかし、残りは同じです.なぜなら、2つの店が同じAPIを使って対話するからです.import counterStore from '../stores/counterBis'
const {useCounter,useDecrement,useIncrement}=counterStore
function Counter(){
const counter=useCounter()
const increment=useIncrement()
const decrement=useDecrement()
return <div>
<button onClick={increment}>+</button>{counter}<button onClick={decrement}>-</button></div>
}
export default Counter
これで、私の記事のプレゼンテーションを終えます.閉じるこの動画はお気に入りから削除されています.ありがとう.Reference
この問題について(反応フックによる状態管理), 我々は、より多くの情報をここで見つけました https://dev.to/roggc/state-management-with-react-hooks-3608テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol