Hook
react-hook的出现让我们对无状态组件又有了一些新的认知,特别是它还提供各种各样的hook,比如useReducer,useRef,useEffect,useMemo,useCallback,useState,useContext....
在开发中,大家肯定用过Redux吧,这玩意就是一个状态管理容器,让我们很容易的就可以实现数据共享;那么我们不用redux,能不能实现状态共享呢?可能在hook出现之前,不用第三方的库(redux,mobx等)是比较难解决的一个问题。现在hook的闪亮登场,让我们很容易就能解决这个问题。
现在我们就用useReducer,useContext,createContext实现一下类redux的状态管理容器。
提示:前提是老哥们要知道这三个Api的用法,不懂的大哥自行补脑哈
基于Hook实现的状态管理容器
第一,在根目录建一个文件hookRedux/index.js
import React, { createContext, useReducer } from 'react'
export const HookContext = createContext()
function reducer(state = { footer: '一只脚' }, action) {
switch (action.type) {
case 'changeData': return {
...state,
footer: '两只脚'
}
default: return state
}
}
function HookRedux(props) {
let [data, dispatch] = useReducer(reducer,{ footer: '一只脚' })
return (
<div>
<HookContext.Provider value={{ data, dispatch }}>
{props.children}
</HookContext.Provider>
</div>
)
}
export default HookRedux
第二,把刚才写的HookRedux组件,套在App组件上,再在根目录建一个文件component/footer.js,并引进来使用
import React from 'react';
import HookRedux from './hookRedux';
import Footer from './component/footer';
function App() {
return (
<HookRedux>
<div className="App">
<header className="App-header">
<Footer></Footer>
</header>
</div>
</HookRedux>
);
}
export default App;
三,在HookRedux组件下的Footer组件就可以拿到HookRedux里面传下来的数据了
import React, { useContext } from 'react'
import { HookContext } from '../hookRedux/index'
function Footer(props) {
let { data, dispatch } = useContext(HookContext)
return (
<div>
<div>{data.footer}</div>
<button onClick={()=>{dispatch({type:'changeData',footer:"改成两只脚"})}}>改成两只脚</button>
</div>
)
}
export default Footer
通过三步,我们就可以实现一个类redux的状态管理容器,就是这么so easy!
