javascript - React 重新渲染的条件是什么

标签 javascript reactjs

我不确定 react 何时重新渲染。我没有任何性能问题,我现在也没有尝试优化性能。 我只是好奇 React 何时重新渲染。

据我所知,react 会在运行 useEffect 之前绘制所有内容,并在 useEffect 运行后再次绘制。 这意味着它应该调用一次 NewLobby 的返回,然后调用 useEffect 一次,然后调用 NewLobby 一次,从而产生以下日志:

hello
rerun
hello

当我点击刷新按钮时也是如此。

实际行为有所不同 => 页面第一次加载时控制台打印:

hello
hello
hello
rerun
hello

刷新按钮按预期工作。为什么还要重新绘制 2 次?

我的组件

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

const NewLobby = () => {
  const initialStateFactory = () => {
    return {
      loading: false,
      error: false,
      lobbies: 'Loading ...',
    };
  };

  const [lobbies, setLobbies] = useState(initialStateFactory());
  const [refresh, setRefresh] = useState(0);

  useEffect(() => {
    (async () => {
      const fetchLobbies = async () => {
        const result = await (
          await fetch(`${BACKEND_URL}/play/lobbies`, {
            method: 'POST',
            credentials: 'include',
          })
        ).json();
        return result;
      };
      const lobbies = await fetchLobbies();
      console.log('rerun');
      setLobbies(s => {
        return { ...s, lobbies };
      });
    })();
  }, [refresh]);

  return (
    <>
      <div>{console.log('hello')}</div>
      <button onClick={() => setRefresh(s => s + 1)}>Refresh</button>
    </>
  );
};

export default NewLobby;

最佳答案

我通常建议使用Why did you render?对于这类问题。试一试,几乎肯定会指出你的问题。

关于javascript - React 重新渲染的条件是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61563975/

相关文章:

javascript - this.state 与此对象中的状态不同

javascript - Javascript 中处理元素和使用 Jquery 删除方法删除有什么区别

javascript - Gulp 将 ftp 部署到生产环境

javascript - 如何使用 React 将 React-Particles-Js 设置为后台?

javascript - 使用 CSS 类作为编程逻辑的一部分来实现业务规则是否不好?

reactjs - 通过在内部调用 navigation.navigate() 来制作共享组件 - React Native

JavaScript:为什么我的时钟不工作?

javascript - 未处理的拒绝(语法错误): Unexpected end of input

reactjs - addChangeListener 如何在 Facebook React Todo 示例中工作

reactjs - React Hook Forms - 添加动态字段行