useReducer的基本使用

每天对自己多问几个为什么,总是有着想象不到的收获。 一个菜鸟小白的成长之路(copyer)


react的hooks提供了两种state管理的hook:useStateuseReducer

useState的语法很简单

useReducer这个语法也是很简单的,前提是你熟悉redux的reducer。


基本用法:

接受两个参数

import { useReducer } from 'react'

//初始化state
const initState = {
    count: 0
}

//定义一个reducer函数
function reducer(state, action) {
    switch(action.type) {
        case 'add': 
            return {...state, count: state.count + 1}
        case 'sub': 
            return {...state, count: state.count - 1}
        default:
            return state
    }
}

const TUseReducer = () => {
    const [state, dispatch] = useReducer(reducer, initState)
	//dispatch派发action,action是一个对象
    
    const add = () => {
        dispatch({type: 'add'})
    }
    const sub = () => {
        dispatch({type: 'sub'})
    }

    return (
        <div>
            Count: {state.count}
            <button onClick={add}>+</button>
            <button onClick={sub}>-</button>
        </div>
    )
}

接受三个参数:

import { useReducer } from 'react'

//初始化state
function init(initState) {
 	return {count: initState}   
}

//定义一个reducer函数
function reducer(state, action) {
}

const TUseReducer = ({initState}) => {
    const [state, dispatch] = useReducer(reducer, initState, init)
    //内部会执行 init(inistate)
}

这样的好处,就是初始值可以有外部环境提供


理论源码

let memoizedState;	
function useReducer(reducer, initialArg, init) {	
  let initState = void 0;	
   //就是判断是否存在第三个参数 
  if (typeof init !== 'undefined') {	
    initState = init(initialArg)	
  } else {	
    initState = initialArg	
  }	
  function dispatch(action) {	
    memoizedState = reducer(memoizedState, action)	
    render()	//dispatch触发render函数
  }	
  memoizedState = memoizedState || initState	
  return [memoizedState, dispatch]	
}	

useReducer的使用场景:

  • 处理复杂逻辑的state及state间有依赖的

总结:

可能我不会用useReducer,我在开发中,确实不知道何时使用useReducer,太菜了吧

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值