React Hooks 的基本使用

124 阅读3分钟

前言

React Hooks 是 React 16.8 版本引入的一个特性,它允许你在函数组件中使用状态和其他 React 特性。

hooks 引入一个不受函数组件重复执行影响的外部变量作为组件内的状态,当状态变更时,函数组件会重新渲染页面。

React hooks 解决的问题

  • 使状态逻辑的重用变的简单可行
  • 解决代码分割困难的问题
  • 告别难以理解的类组件
  • 提高对 React 新特性的适应性

Hook 的规则

  • Hook 应该在组件的顶层或自定义Hook中调用
  • 不要在循环、条件语句、嵌套函数中调用 Hook
  • 不要在类组件中调用 Hook

下面是一些常用的 React Hooks 的基本使用方法。

  • useState()
  • useEffect()
  • useRef()

useState

useState 是最基本的 Hook,它允许你向组件添加一个 状态变量

const [state, setState] = useState(initialValue);

state 是一个状态变量,setState 是用于修改状态的 Setter 函数,当 state 改变了,该组件会重新渲染,而 initialValue 则是状态的初始值。

计时器

import { useState } from 'react';

export default function Counter() {
  const [count, setCount] = useState(0);

// 写法一:定义handleClick方法
  function handleClick() {
  // 更新 count
    setCount(count + 1);
  }
  return (
    <button onClick={handleClick}>
      You pressed me {count} times
    </button>
  );
// 写法二:使用箭头函数
 return (
    <button onClick={() => setCount(count + 1)}>
      You pressed me {count} times
    </button>
  );
}

写法二 这样写会报错

// 应该要点击后才调用,如果没有箭头函数会在页面加载时立即调用,就会触发一个setState动作,组件就会无限重新渲染
<button onClick={setCount(count + 1)}>You pressed me {count} times
</button>

image.png

目前,在事件处理函数内部的 setState 是异步的。调用setState,组件的state并不会立即改变。

所以不要依赖当前的state,计算下个state。

如何更新那些依赖于当前的 state 的 state 呢? 可以给 setState 传递一个函数,而不是一个对象,就可以确保每次调用的都是最新版的 state。

更新 state 中的对象

更新 state 中的对象时,我们需要创建一个新的对象,然后将 state 更新为此对象。而不应该直接修改存放在 React state 中的对象。

obj.x = 10; // 🚩 错误:直接修改现有的对象  
setObj(obj); // 🚩 不会触发渲染
// ✅ 正确:创建一个新对象
setObj({
  ...obj,
  x: 10
});

useEffect

用来执行一段和当前渲染无关的副作用代码,可用于弥补函数组件没有生命周期的缺陷。

useEffect(setup, dependencies?)

  • setup:处理 Effect 的函数(例如数据获取、设置/销毁定时器、异步请求等)。setup 函数选择性返回一个清理函数(cleanup)
  • 可选 dependencies(依赖项):setup 代码中引用的所有响应式值的列表。响应式值包括 props、state 以及所有直接在组件内部声明的变量和函数。

React 会在每次渲染后都运行 Effect,而依赖数组就是用来控制是否触发 Effect,从而能够减少不必要的计算,优化性能。

useEffect(() => {  
    const intervalId = setInterval(doSomething(), 1000);  
    // useEffect()允许返回一个函数,在组件卸载时,执行该函数,清理副效应    
    return () => clearInterval(intervalId);  
});

useEffect 可以模拟类组件的生命周期:componentDidMountcomponentDidUpdatecomponentWillUnmount

React useEffect 使用指南 - 掘金 (juejin.cn)

useRef

useRef 可以用来获取元素,缓存状态,设置初始值 initState,返回一个 ref 对象。

const ref = useRef(initialValue)
  • initialValue:ref 对象的 current 属性的初始值

在 React 中,ref(引用)是一个特殊的属性,它允许你直接访问 DOM 元素或组件实例。改变 ref 不会触发重新渲染,所以 ref 适合用来保存跨渲染周期的数据。

使用 ref 操作 DOM

import { useRef } from 'react';
const inputRef = useRef(null);
<input ref={inputRef} type="text" />

要访问该 ref 的值,需要通过 ref.current 属性

myRef.current.scrollIntoView();

总结

本文是我在学习react hooks时记录再加以整理的,希望对你有所帮助。

参考

React 官方中文文档