LoginSignup
0
0

useReducerがよくわからないので、整理する

Posted at

userReducerについて本で学習したがいまいちわからなかったので、自分用にアウトプットします

useReducerとは

状態を扱うためのフック。useStateよりも複雑な状態管理に向いている。状態が配列はオブジェクトなど複数あるときに便利。

構文

type Action = '状態1' | '状態2' | '状態3'

const reducer(現在の状態, action: Action) {
    return 次の状態
}

const [現在の状態, dispatch] = useReducer(reducer, reducerに渡される初期状態)

// dispatch('状態1')で状態を更新させる

言語化すると、更新関数dispatchに引数としてactionを渡すと、reducerが現在の状態を更新してくれる

ボタンによってCountが変化するコンポーネントを作成してみます

import { useReducer } from 'react'

type Action = 'INCREMENT' | 'DECREMENT' | 'DOUBLE' | 'RESET'

// actionに応じて次の状態を返す
const reducer = (currentCount: number, action: Action) => {
    switch (action) {
        case 'INCREMENT':
            return currentCount + 1
        case 'DECREMENT':
            return currentCount - 1
        case 'DOUBLE':
            return currentCount * 2
        case 'RESET':
            return 0
        default:
            return currentCount
    } 
}

type CounterProps = {
    initialValue: number
}

// Counterコンポーネント
const Counter = (props: CounterProps) => {
    const {initialValue} = props
    const [count, dispatch] = useReducer(reducer,initialValue)

    return (
        <>
            <p>Count: {count}</p>
            <button onClick={() => dispatch('INCREMENT')}>+</button>
            <button onClick={() => dispatch('DECREMENT')}>-</button>
            <button onClick={() => dispatch('DOUBLE')}>×2</button>
            <button onClick={() => dispatch('RESET')}>reset</button>
        </>
    )
}

export default Counter

型エイリアスでActionを4つの状態で定義しています

type Action = 'INCREMENT' | 'DECREMENT' | 'DOUBLE' | 'RESET'

boolean型のuseStateを使用すると、2種類の状態でしか管理できません。しかし、useReducerを用いれば、3つ以上の状態を管理することができます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0