«

怎么理解React中的Hooks

daidaini 发布于 阅读:42 程序员学习


Hooks是什么?

React Hooks允许你在函数组件中使用 state和其他React特性,而无需编写class。
简单说,Hooks 就是一些函数,可以让你在函数组件中 "钩入" React 的 state 和生命周期等特性。

Hooks 是一套为函数组件设计的,用于访问React 内部状态或执行副作用的操作,以函数形式存在的 React API

为什么使用Hooks

常用Hooks

Hooks的工作原理

Hooks的优势

使用Hooks的注意事项

useState

useState 的作用

useState 是 React Hooks 中最基础的一个,它的主要作用是在函数组件中添加状态。简单来说,就是让一个原本静态的函数组件拥有了动态变化的能力。

什么时候使用 useState

使用场景示例

简单计数器

import {useState} from 'react';
function Counter() {
    const [count, setCount] = useState(0);

    return (
        <div>
            <p> You clicked {count} times</p>
            <button onClick={ () => setCount(count + 1)}>
                Click me
            </button>
        </div>
    );
}

创建一个表单

import {useState} from 'react';
function MyForm() {
  const [username, setUsername] = useState('');

  const handleSubmit = (event) => {
    event.preventDefault();
    console.log('Username:', username);
  };

  return (
    <form onSubmit={handleSubmit}>
      <label>
        Name:
        <input type="text" value={username} 
        onChange={(e) => setUsername(e.target.value)} />
      </label>
      <button type="submit">Submit</button>
    </form>
  );
}

总结

useState 是 React Hooks 中非常基础且常用的一个 Hook,它为函数组件带来了状态管理的能力。只要组件内部需要保存数据并随时间变化,都可以考虑使用 useState

何时使用 useState 的一个简单判断标准是:
如果数据是需要在组件内部维护的,并且随着时间的推移或者用户交互而变化,那么就需要使用 useState。

useEffect

useEffect 主要用于在函数组件中执行副作用操作。
所谓副作用,就是指组件除了渲染 UI 之外,还会对外部系统产生影响,比如:

示例:

import { useEffect, useState } from 'react';

function MyComponent() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    document.title = `You clicked ${count} times`;
  });

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}

useEffect 接收两个参数:

useEffect 的执行时机

useEffect 的常见使用场景

useEffect 的注意事项

示例二

import { useState, useEffect } from 'react';

function Example() {
  const [count, setCount] = useState(0);
  const [name, setName] = useState('Alice');

  useEffect(() => {
    console.log('useEffect: component mounted');
    // 组件挂载时执行,只执行一次

    return () => {
      console.log('useEffect: component unmounted');
      // 组件卸载前执行
    };
  }, []);

  useEffect(() => {
    console.log('useEffect: count changed');
    // count 发生变化时执行
  }, [count]);

  useEffect(() => {
    console.log('useEffect: name changed');
    // name 发生变化时执行
  }, [name]);

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>Click me</button>
      <p>Your name is: {name}</p>
      <button onClick={() => setName('Bob')}>Change name</button>
    </div>
  );
}

其他

useContext

从Context中读取值。
使用场景:

useReducer

用于管理复杂的状态逻辑。
使用场景:

useRef

获取DOM元素的引用,或者保存一个不变的ref
使用场景:

useMemo

缓存计算结果,避免重复计算

useCallback

缓存回调函数,避免不必要的重新渲染

学习建议

首先精通三个基础Hooks,useStateuseEffectuseContext,然后在此基础上:

  1. 掌握 useRef 的一般用法
  2. 当需要优化性能,减少不必要的渲染时,学习掌握 useMemouseCallback
  3. 当需要在大中型React项目中处理复杂state时,学习掌握 useReducer
  4. 当需要封装组件,对外提供命令式接口时,学习掌握useRefuseImperativeHandle
  5. 当页面上用户操作直接相关的紧急更新(Urgent Updates,如输入文字、点击、拖拽等),受到异步渲染拖累而 产生卡顿时,学习掌握 useDeferredValueuseTransition

react web