理解React中的Hooks

2024-09-29

Hooks是什么?

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

为什么使用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

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