📜  更改 useEffect 中的状态...避免由于 useEffect 而重新渲染... ...仅调用一次 useEffect ....无限循环 useEffect (1)

📅  最后修改于: 2023-12-03 14:55:13.939000             🧑  作者: Mango

更改 useEffect 中的状态

在React中,使用useEffect来进行组件的生命周期管理。当状态发生改变时,useEffect函数会自动被调用,重新渲染组件。然而,由于useEffect函数的工作机制,很容易引起无限循环的问题。

为了避免由于useEffect而重新渲染组件,应该确保在useEffect中不会改变相关状态。如果需要更改相关状态,可以将状态提升到父组件中或使用useRef来缓存状态。

下面是一个简单的例子,演示了如何使用useRef来避免重新渲染组件:

import React, { useState, useEffect, useRef } from 'react';

function App() {
  const [count, setCount] = useState(0);
  const isMounted = useRef(false);
  
  useEffect(() => {
    if(isMounted.current) {
      setCount(count + 1);
    } else {
      isMounted.current = true;
    }
  }, [count]);
  
  return (
    <div>
      <button onClick={() => setCount(count + 1)}>Click me</button>
      <p>Count: {count}</p>
    </div>
  );
}

在这个例子中,我们使用了useRef来创建一个不可变的isMounted变量,并将其初始化为false。我们在useEffect中检查isMounted.current是否为true,以确定当前是否首次渲染。如果不是首次渲染,我们将状态count自增1,以达到更改状态的目的。

仅调用一次 useEffect

当需要仅在组件挂载时调用useEffect,可以将依赖项数组留空,这样useEffect就不会检查任何依赖项,只会在初始渲染时被调用。

比如下面的组件只需要在挂载时打印一次日志:

import React, { useEffect } from 'react';

function App() {
  useEffect(() => {
    console.log('Component mounted');
  }, []);

  return (
    <div>
      <p>Hello, world!</p>
    </div>
  );
}
无限循环 useEffect

当状态发生改变时,useEffect函数会重新调用,这可能导致无限循环的问题。为了避免这种问题,需要在依赖项数组中正确地定义状态和函数。

下面是一个例子,演示了如何在依赖项数组中正确地使用状态和函数:

import React, { useState, useEffect } from 'react';

function App() {
  const [count, setCount] = useState(0);
  
  useEffect(() => {
    function handleClick() {
      setCount(count + 1);
    }
    
    window.addEventListener('click', handleClick);
    
    return () => window.removeEventListener('click', handleClick);
  }, [count]);
  
  return (
    <div>
      <p>Count: {count}</p>
    </div>
  );
}

在这个例子中,我们在useEffect中定义了一个handleClick函数,并将其绑定到window对象的click事件上。为了避免无限循环,我们将count作为依赖项。当count发生改变时,useEffect函数会被重新调用,重新绑定handleClick函数,反之则会卸载handleClick函数。