认识 React Hooks 之二

今天是延续昨天的 Hooks 探索,要学习的是 useReduceruseCallbackuseMemouseRef

就让我们来看看这些 Hooks 可以带给我们怎麽样更简便的使用方式吧!

useReducer

在前面的天数我们学习到了 Redux 的使用,如果能够理解的话,相信 useReducer 使用起来就不会那麽陌生。

因为 useReducer 会回传一个 statedipatch 的方法,然後就跟 Redux 一样透过 dispatch 一个 action 来更新 state 中的状态。

这里我们来看看官方提供的范例程序码:

const initialState = {count: 0};

function reducer(state, action) {
  switch (action.type) {
    case 'increment':
      return {count: state.count + 1};
    case 'decrement':
      return {count: state.count - 1};
    default:
      throw new Error();
  }
}

function Counter() {
  const [state, dispatch] = useReducer(reducer, initialState);
  return (
    <>
      Count: {state.count}
      <button onClick={() => dispatch({type: 'decrement'})}>-</button>
      <button onClick={() => dispatch({type: 'increment'})}>+</button>
    </>
  );
}

上方的程序码是一个简单的加减计数器,可以执行加一、减一的操作。

而基本上设定 statedipatch 一个 action 到 reducer 更新 state 的状态,根本和使用 Redux 没什麽差异。

不过有一个小细节需要注意的部分是, initialState 原本在 Redux 中会作为 reducer 的预设值,而使用 useReducer 的话,则是将 initialState 当作第二个参数传入

useCallback

useCallback 会回传传入的 callback function 的 memoized 版本,让这个 callback 只会在依赖改变时才会更新。

而这麽做的原因在於要避免不必要的 render,优化效能。

这里来看看官方提供的一个示意程序码:

const memoizedCallback = useCallback(
  () => {
    doSomething(a, b);
  },
  [a, b],
);

callback function 传入一个 doSomething 方法,而这个方法会在当 a, b 发生改变时才会执行。

useMemo

useMemo 使用方式与 useCallback 类似,都是为了优化效能,但是其 memoized 的是一个值,而且需要注意的是 useMemo 的 function 是在 render 期间执行,所以避免在 render 期间处理 side effect。

useRef

今天的最後要学习的是 useRef,如果还记得第十四天的createRef 学起来,focus 元素不麻烦,那这个部分也不会太难理解,因为 useRef 可以让我们在 function component 中更简单的 focus 元素。

直接来看看底下这个例子:

相关测试范例,点击前往

import React, { useRef } from "react";
import "./styles.css";

export default function App() {
  const myRef = useRef(null);

  const focusInputByUseRef = () => {
    myRef.current.focus();
  };

  return (
    <div className="App">
      <h2 onClick={focusInputByUseRef}>
        functional Componet: useRef - 点击本段文字
      </h2>
      <input ref={myRef} />
    </div>
  );
}

useRef 中传初始值传入 null 是告诉 React 目前在一开始时还没有任何 ref 依附在 React element 中,而之後当我们在元素中设定 ref 时,此时就会拿到这个元素了。

今天学习了 React Hooks 中的 useReduceruseCallbackuseMemo 以及 useRef 的基础概念。

明天再继续探索其他的 Hooks吧!

铁人赛文章与程序码同步发布於:

  1. 个人部落格
  2. Github

资源


<<:  【验证模型】3-7 「今晚,我想来点⋯⋯」动手做的餐点选择器进化!(中集)

>>:  乔叔教 Elastic - 28 - Elasticsearch 的优化技巧 (2/4) - Searching 搜寻效能优化

30天学会 Python: Day 18-try try 看

有时候虽然编写的语法正确,但因为使用者没有依照原先设计操作,而导致程序执行错误 例如用 int() ...

Day 30: 完赛总结

终於完赛啦! 这次挑战赛仅聚焦於结构化资料的资料分析,非结构化资料(图片声音影片等等),就需要用到深...

WP Rocket 一整年难得的7折优惠+7款外挂测速比较

黑色购物节,只有9天:所有方案7折 折扣内容:所有方案皆享「7折」优惠 折扣期间:2020/11/...

IT 铁人赛 k8s 入门30天 -- day15 k8s Workload 简介

前言 今天要讲的是 k8s 丛集对於 Workload 管理做讲解 Pod 的管理 以下将会解释一些...

浏览铁人赛众多优质文章时,也别忘了做好备份 etcd 基本功.

etcd 是 OpenShift平台的键值存储资料库(key-value store),可储存整个系...