react hooks(二)

从 useContext, useReducer, createContext 到 useCallback, memo, useMemo
import {
  useContext, useReducer, createContext,
  useCallback, memo, useMemo, useState
} from "react";

function reducer(state, action) {
  switch (action.type) {
    case 'add':
      return {
        ...state,
        counter: state.counter + 1
      }
    case 'del':
      return {
        ...state,
        counter: state.counter - 1
      }
    case 'reset':
      return {
        ...state,
        counter: 0
      }
    default:
      return state
  }
}
/**
 * 融合useReducer、createContext
 */
const Store = createContext({});
function Provider(props) {
  const [state, dispatch] = useReducer(reducer, { counter: 0, otherState: "【我是其它的state】" });

  return (
    <Store.Provider value={{ state, dispatch }}>
      {props.children}
    </Store.Provider>
  )
}

export default function Parent() {
  return (
    <div style={{ width: 300, margin: "100px auto", fontSize: 20 }}>
      <Provider>
        <Child1></Child1>
        <Child2></Child2>
        <Child3></Child3>
      </Provider>
    </div>
  )
}
/**
 * 父组件使用useCallback防止inline函数引起的不必要更新
 * useContext获取store
 */
function Child1() {
  const { state } = useContext(Store);
  return (
    <div>
      {">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" + state.counter}
    </div>
  )
}
/**
 * 父组件使用useCallback防止inline函数引起的不必要更新
 * useContext获取dispatch
 */
const Child2 = function () {
  const { dispatch } = useContext(Store);
  const [value, setValue] = useState("");

  const functionWidthUseCallback = useCallback(() => dispatch({ type: "add" }), []);
  const functionWidthOutUseCallback = () => dispatch({ type: "add" });
  {/** input输入导入 functionWidthOutUseCallback多次更新*/}
  return (
    <div>
      <button onClick={() => dispatch({ type: "add" })}>加</button>
      <button onClick={() => dispatch({ type: "del" })}>减</button>
      <input value={value} onChange={e => setValue(e.target.value)} />
      <Child222 type="useCallback" onClick={functionWidthUseCallback} />
      <Child222 type="withOutUseCallback" onClick={functionWidthOutUseCallback} />
    </div>
  )
}
function Child3() {
  const { state } = useContext(Store);
  const otherState = useMemo(() => {
    return state.otherState
  }, []);

  return (
    <div style={{ margin: "100px auto", width: 200 }}>
      其它的state{otherState}
    </div>
  )
}

var Child222 = memo(function (props) {
  console.log("useCallback>>>>>>>>>>>>>>>>>>" + props.type)
  return (
    <div style={{ margin: "100px auto", width: 200 }} onClick={props.onClick}>
      Child222
    </div>
  )
})
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • React Hooks 在了解React Hooks之前, 我们先看一下 Class 和函数式 的一般写法 Cla...
    YM雨蒙阅读 2,902评论 0 1
  • 前言 本文全面介绍了React Hooks的所有API概念、用法、丰富的demo以及部分底层原理。 实际上,Rea...
    南宫__阅读 3,641评论 0 6
  • React-Hooks 1. React-hooks是什么 我们先来看一下官网的解释: Hook 是 React ...
    Linyqs阅读 934评论 0 0
  • useState 1.基本使用 等价于 2. 复杂的state 3.使用状态 4. 注意事项 1). 如果stat...
    sweetBoy_9126阅读 3,072评论 0 6
  • React Hooks 是 React v16.8 版本引入了全新的 API,其设计目的就是加强版函数组件,完全不...
    Amber886阅读 715评论 0 0