这是我参与8月更文挑战的第28天,活动详情查看: 8月更文挑战
什么是useReducer?
useReducer是一种让函数组件保存状态的方式,是useState的替代方案.通过useReducer可以向子组件传递dispatch.
useReducer接受什么?
接收的第一个参数是一个reducer函数,第二个参数是一个初始的状态值.
userReducer返回的是什么?
返回的是一个数组,数组的第一个元素是存储的状态,第二个元素是出发action的dispatch方法.
定义的reducer函数接收什么,返回什么?
接收两个参数,第一个是以前的状态值,第二个是action对象
function reducer(state,action) {
switch (action.type) {
case 'increment':
return state + 1
default:
return state;
}
}
function App(props) {
const [count, dispatch] = useReducer(reducer,0);
return (
<div>
<span>{count}</span>
<button onClick={() => dispatch({type: 'increment'})}>+1</button>
</div>
)
}
复制代码
什么是useContext?
在跨组件层级获取数据时简化获取数据的代码。下面详细讲解下useContext的使用步骤。
- 通过createContext()创建一个xxxContext.
- 通过xxxContext.Provider包裹并将value传递给目标组件。
- 目标组件通过useContext(xxxContext)获取到value传递的值。
// 1. 创建一个xxxContext
const countContext = createContext();
// 2. 通过xxxContext.Provider 包裹传递value给目标组件
function App() {
return (
<countContext.Provider value={666}>
<Foo />
</countContext.Provider>
)
}
// 3. 目标组件通过useContext(xxxContext)获取value传递的值
function Foo() {
const count = useContext(countContext)
return (
<div>
{count}
</div>
)
}
复制代码
注意:useContext的参数必须是context对象本身,调用了useContext的组件会在context值变化时重新渲染。当前的context值由上层组件中距离当前组件最近的<xxxContext.Provider>的value prop决定。当Provider的value值发生变化时,它内部的所有消费组件都会被重新渲染,并且Provider及其内部consumer组件都不受制于shouldComponentUpdate函数,当consumer组件在其祖先组件退出更新的情况下也能更新。