强制重新渲染有哪些方式

#react

目录

1. 总结

  • 自定义 useForceUpdate
  • useReducer 中的 forceUpdate
  • useState 切换布尔值达到类似效果
  • 变更 key → 完全卸载并重新挂载组件

强制更新应该作为一种例外情况下的解决方案,而不是常规做法

2. 自定义 Hook: useForceUpdate

这是一种常见的模式,可以创建一个自定义 Hook 来强制组件重新渲染:

import { useState, useCallback } from 'react';

function useForceUpdate() {
  const [, setState] = useState({});
  return useCallback(() => setState({}), []);
}

// 使用方式
function MyComponent() {
  const forceUpdate = useForceUpdate();
  
  const handleClick = () => {
    // 进行一些操作
    forceUpdate();
  };

  return <button onClick={handleClick}>Force Update</button>;
}

这种方法通过更新一个空对象来触发重新渲染

3. 使用 useReducer

useReducer 也可以用来强制更新,有一个 forceUpdate

import { useReducer } from 'react';

const [, forceUpdate] = useReducer(x => x + 1, 0);

// 使用方式
function MyComponent() {
  const handleClick = () => {
    // 进行一些操作
    forceUpdate();
  };

  return <button onClick={handleClick}>Force Update</button>;
}

这种方法通过递增一个计数器来触发重新渲染

4. 使用 useState

简单地使用 useState 也可以达到强制更新的效果:

import { useState } from 'react';

function MyComponent() {
  const [, setToggle] = useState(false);

  const handleClick = () => {
    // 进行一些操作
    setToggle(prev => !prev);
  };

  return <button onClick={handleClick}>Force Update</button>;
}

这种方法通过==切换一个布尔值==来触发重新渲染

5. 使用 key 属性

对于整个组件的强制更新,可以使用 key 属性:

function ParentComponent() {
  const [key, setKey] = useState(0);

  const handleReset = () => {
    setKey(prevKey => prevKey + 1);
  };

  return (
    <>
      <button onClick={handleReset}>Reset Component</button>
      <MyComponent key={key} />
    </>
  );
}

通过改变 key 值,React 会==完全卸载并重新挂载组件==,相当于强制重新渲染