使用 useState hook 时 React 组件渲染两次

2023-12-22

我无法理解为什么我的应用程序反应组件渲染两次,如下面的 gif 所示。

我在返回组件之前插入了一个 console.log 以查看组件渲染了多少次。

每当我删除 useState 挂钩时,我的应用程序就会像我想象的那样只渲染一次。欢迎任何关于为什么会发生这种情况的指导

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

const ListItem = ({ title, url, author, num_comments, points }) => {
  return (
    <div>
      <span>
        <a href={url} target='_blank' rel='noopener noreferrer'>
          {title}
        </a>{' '}
        by {author}
      </span>
      <br />
      <span>Comments: {num_comments}</span>
      <br />
      <span>Points: {points}</span>
      <hr />
    </div>
  );
};

const List = ({ list }) => {
  return list.map(({ objectID, ...item }) => (
    <ListItem key={objectID} {...item} />
  ));
};

const Search = ({ search, onSearch }) => {
  return (
    <div>
      <label htmlFor='search'>Search: </label>
      <input id='search' type='text' value={search} onChange={onSearch} />
      <p>
        Searching for <strong>{search}</strong>
      </p>
    </div>
  );
};

const App = () => {
  const stories = [
    {
      title: 'React',
      url: 'https://reactjs.org/',
      author: 'Jordan Walke',
      num_comments: 3,
      points: 4,
      objectID: 0,
    },
    {
      title: 'Redux',
      url: 'https://redux.js.org/',
      author: 'Dan Abramov, Andrew Clark',
      num_comments: 2,
      points: 5,
      objectID: 1,
    },
  ];

  const [search, setSearch] = useState(localStorage.getItem('search') || '');

  useEffect(() => {
    localStorage.setItem('search', search);
  }, [search]);

  const handleSearch = (event) => {
    setSearch(event.target.value);
  };

  console.log('rendered');

  return (
    <div className='App'>
      <h1>My Hacker Stories</h1>
      <Search search={search} onSearch={handleSearch} />
      <hr />
      <List
        list={stories.filter((story) =>
          story.title.toLowerCase().includes(search.toLowerCase())
        )}
      />
    </div>
  );
};

export default App;

甚至我也想知道为什么我的控件会渲染两次。

我的大多数组件中都没有 useEffect 挂钩,并且大多数情况下我只是在用户在输入框中输入数据时设置状态(不可改变)。这种情况也发生在每个具有两个 Why 绑定的组件中。

开发工具:我在没有安装开发工具的浏览器中尝试了我的应用程序,但仍然存在同样的问题。

React.StrictMode我认为这是潜在的罪魁祸首。当我从 index.js 中删除此标签时,所有组件都开始正常工作。 我还在官方文档中读到,strictMode 检查仅在开发模式下执行,在生产构建中被忽略。

这让我认为我们的代码是正确的,我们可以忽略dev中的重新渲染问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 useState hook 时 React 组件渲染两次 的相关文章

随机推荐

  • 对数刻度(x 轴)直方图

    我需要的是 X 轴以对数刻度显示的直方图 但是 我仍然希望直方图中的每个条形都具有相同的宽度 不管怎样 我想出了 或发现 具有较高值的 显示条与较窄的显示条 它们在普通比例上具有相同的宽度 而不是在对数比例上 这是我现在正在做的事情 edg
  • Python c-api 和 unicode 字符串

    我需要在 python 对象和各种编码的 c 字符串之间进行转换 使用 PyUnicode Decode 从 C 字符串到 unicode 对象相当简单 但是我不知道如何走另一条路 char can be a wchar t or any
  • 基于 Rails 中每个下拉菜单的嵌套下拉框和多选框?

    我有一个要求 但如何开始有点困难 我寻求一些帮助 我有三个表 即服装 类别和材料 考虑服装表包含 男装 童装 我有一个页面来添加服装 在添加服装时 我需要一个下拉菜单 其中应列出类别 选择类别后 属于所选类别的材料应出现在多选框中 我们可以
  • angular-cli如何添加全局样式?

    我使用 Sass 创建了一个全局样式表并将其放在public style styles scss 我只指定背景颜色 在索引中 我添加了一个链接 背景颜色不适用于 body 标记 检查正文标签后 我可以看到背景颜色已应用但被否决scaffol
  • 如何在面板中的另一个 WPF 窗口内加载 WPF (xaml) 窗口?

    这可能吗 我使用了 Frame 控件并且 显示 例如 showwindow xaml 但我收到这个错误 根元素对于导航无效 确保您可以使用以下方式导航 显示 窗口 YourFrame Navigate YourWindow 然而 我不太喜欢
  • 如何使用张量板制作散点图-tensorflow

    现在 我正在研究张量流 但是 我无法使用张量板绘制点图 如果我有训练样本数据 就像那样 train X numpy asarray 3 3 4 4 5 5 6 71 6 93 4 168 9 779 train Y numpy asarra
  • jQuery - 如何按属性名称开头选择值

    我想通过给出属性名称 仅开头 来选择属性值 例如 如果我们有 html 标签 div class slide div 我想从属性中选择以以下开头的值data 先谢谢您的帮助 如果您想要所有 data 属性 您可以迭代 jq 数据对象 sli
  • 如何使用图像作为提交按钮?

    有人可以帮助更改此设置以合并名为的图像BUTTON1 JPG而不是标准submit button
  • python中编译的正则表达式对象的类型

    python中编译后的正则表达式是什么类型 我特别想评价一下 isinstance re compile 是真实的 出于内省的目的 我的一个解决方案是 有一些全局常量REGEX TYPE type re compile 但看起来不太优雅 E
  • 使用 int 与 Integer

    我遇到一个类 它使用整数变量来捕获要在 for 循环中使用的大小 这是好的做法还是我们应该使用 int 原始数据类型 Integer size something getFields size for Integer j 0 j lt si
  • 将自定义对象的数据绑定到MvvmCross中的TextView

    I have one custom object in my ViewModel I want to bind only one of its member to textview in my droid view 我只想将该对象的字符串成
  • jQuery 显示一个 Div 并隐藏其他 Div

    http jsfiddle net yrM3H 2 http jsfiddle net yrM3H 2 我有以下代码 jQuery document ready function jQuery toggle next hidden hide
  • 检查变量是否已设置然后回显而不重复?

    是否有一种简洁的方法来检查变量是否已设置 然后回显它而不重复相同的变量名称 而不是这个 我正在考虑这个 C 风格伪代码中的一些内容 PHP has sprintf http www php net manual en function sp
  • 如何更改@NotNull注释对应返回的响应JSON

    我有一个简单的代码 当 RequestBody 中不存在 customerId 时 它返回错误 json VO 类 public class OrderVO private int orderId NotNull message Custo
  • 如何向 html 5 视频添加嵌入链接

    如果您在 Discord 中链接 YouTube 视频 它会在 Discord 上显示为可播放的视频 而不仅仅是链接 对于我的视频 如果我从我的网站链接它们 不和谐会将它们显示为链接而不是视频 我听说我需要在其中嵌入链接 但我不知道我在寻找
  • 打印机 println:未创建新行

    我正在尝试使用 Apache POI 类将 Outlook MSG 文件解码为文本文件 一切正常 除了println的方法PrintWriter 它不会创建新行 它只是将每个句子直接一个接一个地连接起来 下面代码片段的结果是 De text
  • 正则表达式将数字与逗号和点匹配

    我想使用匹配整数和浮点数re模块 因此 如果有人键入以下输入类型之一 它应该验证它是否是一个数字 1000 1 000 1 000 1 000 98 1 000 1 0 1 0000 现在我正在使用以下内容 0 9 任何帮助表示赞赏 对于给
  • 将 JSON 反序列化为对象

    我正在将 JSON 字符串反序列化为对象 我无法使用Dictionary
  • 是否可以为基于 Click 的界面中的所有子命令添加全局参数?

    我正在 virtualenv 下使用 Click 并使用entry pointsetuptools 中的指令将根映射到名为调度的函数 我的工具公开了两个子命令serve and config 我在顶级组上使用一个选项来确保用户始终通过 pa
  • 使用 useState hook 时 React 组件渲染两次

    我无法理解为什么我的应用程序反应组件渲染两次 如下面的 gif 所示 我在返回组件之前插入了一个 console log 以查看组件渲染了多少次 每当我删除 useState 挂钩时 我的应用程序就会像我想象的那样只渲染一次 欢迎任何关于为