hook -- Reducer

对于拥有许多状态更新逻辑的组件来说,过于分散的事件处理程序可能会令人不知所措。对于这种情况,你可以将组件的所有状态更新逻辑整合到一个外部函数中,这个函数叫做 reducer

Reducer 是处理状态的另一种方式

使用 useReduer

import { useReducer } from "react"

// 由着reducer函数完成外部逻辑的统一处理
function listReducer(state,action) {
    switch (action.type) {
        case 'add':
            return [...state,{id:4,text:'ddd'}]
        case 'edit':
            return state.map((item) => {
                            if (item.id===action.id) {
                                return {...item,text:'new'+item.text}
                            }
                            else {
                                return item
                            }
                        })
        case 'remove':
            return state.filter((item) => {
                            if (item.id===action.id) {
                                return false
                            }
                            else {
                                return true
                            }
                        })
    }
}

export default function App() {

    const [list, listDispatch] = useReducer(listReducer, [
        {id:1,text:'aaa'},
        {id:2,text:'bbb'},
        {id:3,text:'ccc'},
    ])

   
    return (
        <div>
            hello App
            <input type="text" /><button onClick={()=>listDispatch({type:'add'})}>添加</button>
            <ul>
                {list.map((item) => {
                    return (
                        <li key={item.id}>
                            {item.text}
                            <button onClick={() => listDispatch({type:'edit',id:item.id})}>编辑</button>
                            <button onClick={() => listDispatch({type:'remove',id:item.id})}>删除</button>
                        </li>
                    )
                })}
            </ul>
        </div>
    )
}

使用 useImmerReducer

import { useImmerReducer } from 'use-immer'

// 由着reducer函数完成外部逻辑的统一处理
function listReducer(draft, action) {
    let value = draft.find((item) => item.id === action.id)
    let index = draft.findIndex((item) => item.id === action.id)
    switch (action.type) {
        case 'add':
            draft.push({ id: 4, text: 'ddd' })
            break
        case 'edit':
            value.text = 'new' + value.text
            break
        case 'remove':
            draft.splice(index,1)
            break
        
    }
}

export default function App() {

    const [list, listDispatch] = useImmerReducer(listReducer, [
        {id:1,text:'aaa'},
        {id:2,text:'bbb'},
        {id:3,text:'ccc'},
    ])

   
    return (
        <div>
            hello App
            <input type="text" /><button onClick={()=>listDispatch({type:'add'})}>添加</button>
            <ul>
                {list.map((item) => {
                    return (
                        <li key={item.id}>
                            {item.text}
                            <button onClick={() => listDispatch({type:'edit',id:item.id})}>编辑</button>
                            <button onClick={() => listDispatch({type:'remove',id:item.id})}>删除</button>
                        </li>
                    )
                })}
            </ul>
        </div>
    )
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值