新特性学习之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;