React函数式编程Hook之useContext,useReducer

新特性学习之useContext

context就是⽤来更⽅便的实现全局数据共享的,但是由于他并不是那么好⽤,所以我们⼀般会使⽤第三⽅状态管理器(redux,dva,mobx)来实现全局数据共享。

useContext(context)

针对context上下⽂提出的⼀个Hooks API,它接受React.createContext()的返回值作为参数,即context对象,并返回最近的context。使⽤useContext是不需要再使⽤Provider和Consumer的。当最近的context更新时,那么使⽤该context的hook将会重新渲染

为了体现useContext的全局数据共享的特性,我将数据源放在test.jsx文件中,代码如下:

import React from 'react'
const context=React.createContext({name:'tim',age:18});
export default context ;

通过React.createContext()创建了一个上下文对象,并传入了对象的属性,并将这个上下文context暴露出去。
App.jsx中通过引入获取到这个context

import React, { useContext} from 'react'
import context from './test'
const App = () =>{
    const obj=useContext(context)
    return (
        <div>
           <h2>name:{obj.name}</h2>
           <h2>age:{obj.age}</h2>
        </div>
    )
}
export default App;

通过useContext(),访问上下文context中传递进来的数据,并重新复制给obj对象,obj对象就可以访问context的全部属性,并展示在页面上

新特性学习之useReducer

useReducer是useState的⼀个增强体,可以⽤于处理复杂的状态管理,useReducer可以完全替代useState,只是我们简单的状态管理用useState比较方便,useReducer的设计灵感源自于redux的reducer

useReducer的使用方法

const [ state , dispath ] = useReducer( reducer , initState , initAction )

useReducer 参数介绍:

  • reducer:是一个函数,根据action的状态处理并更新state
  • initState:初始化state值
  • initAction:useReducer初次执行时被处理的action

返回值state,dispatch 介绍

  • state状态值
  • dispatch是更新state的方法,他接受action作为参数

useReducer只需要调用dispatch(action)方法传入action即可更新state,使用如下

dispatch({action:'add'})

dispatch是用来更新state的,当dispatch被调用的时候,reducer方法也会被调用,同时根据action的传入内容去更新state,这里的action时传入的一个描述操作的对象

简单的理解就是我现在要去更新一个数据,但是我要告诉reducer我要怎么去更新这个对象,是要加呢还是减呢还是什么呢,通过action,我传输了我的操作,这个操作在reducer中我们会有对应操作去执行的方法。

reducer来源于redux,是一个函数,主要用于处理action,然后返回最新的state,简单的理解成reducer是action和state的转换器,会根据action的描述去更新state,例子如下:

import React, { useReducer} from 'react'
const initState={count:0}
const reducer=(state,action)=>{
    switch(action.type){
        case 'add':return {count:state.count+1};
        case 'sub':return {count:state.count-1};
        case 'reset': return initState;
        default :return state
    }
}
const App = () =>{
   const [state,dispatch]=useReducer(reducer,initState)
    return (
        <div>
          <h2>{state.count}</h2>
          <button onClick={()=>dispatch({type:'add'})}>+</button>
          <button onClick={()=>dispatch({type:'sub'})}>-</button>
          <button onClick={()=>dispatch({type:'reset'})}>reset</button>
        </div>
    )
}
export default App;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值