当 props 改变时,React 不会重新渲染组件

2024-04-20

我有一个问题,当 React 组件的 props 改变时,它们不会重新渲染。 GroupLabel 将 counter 作为 prop。

export const GroupLabel = (props) => {
    const change = () => {
        props.setCurrent(props.group);
        let newCounter = props.counter;
        newCounter[props.group.ID] = 0;
        props.setCounter(newCounter);
    };
    
    return (
        <li className="person" onClick={change}>
            <div className="user">
                <img src="..." 
            </div>
            <p className="name-time">
                <span className="name">{props.group.name}</span>
            </p>
            {props.counter[props.group.ID]>0?<span className="badge badge-primary float-right">{props.counter[props.group.ID]}</span>:null}
        </li>
    );
}

GroupLabel 由其父组件为其组中的每个组调用(组是对象和状态的列表)。

{groups.length!==0?groups.map(item => {return <GroupLabel counter={counter} setCounter={setCounter} key={item.ID} setCurrent={setCurrent} group={item}/>}):null}

父组件中的 counter 是一个将 groupID 映射到该组通过 websocket 接收的消息数的对象。改成这样:

let newCounter = counter; // counter is a current state
newCounter[msgJSON.group]++; // msgJSON.group is id of group to which message is directed
setCounter(newCounter);

一切正常,但 React 仍然不重新渲染。根据我的阅读,React 应该在以下情况下重新渲染其组件:

  • 他们的状态发生变化

  • 他们的道具改变了

  • 父组件被重新渲染

在这种情况下,GroupLabel 属性都会发生变化,父状态也会发生变化(因为它传递的计数器是他的状态)。我可以在 React Dev Tools 中看到 counter prop 已经改变(最初每个组都为零)。

我没有给出父组件的完整代码,因为它太长了。


问题是你正在改变状态,而不是创建一个新状态。当你在函数组件中设置状态时,react 会执行===旧状态和新状态之间。如果它们相等,则组件不会渲染。

要解决此问题,请更改以下内容:

let newCounter = props.counter;
newCounter[props.group.ID] = 0;
props.setCounter(newCounter);

To this:

let newCounter = {
  ...props.counter
};
newCounter[props.group.ID] = 0;
props.setCounter(newCounter);

和这个:

let newCounter = counter;
newCounter[msgJSON.group]++;
setCounter(newCounter);

To this:

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

当 props 改变时,React 不会重新渲染组件 的相关文章

随机推荐

  • jpa 标准比较两个字符串而不考虑空格

    我认为这是一个基本问题 但我正在努力寻找答案 问题是 使用CriteriaBuilder并谓词如何比较字符串而不考虑中间的空格 例如 CH 525 kV AREIA 1077 PR 没有 替换 功能CriteriaBuilder图书馆 cb
  • iOS Swift - 使用蓝牙外部扬声器时音质较差

    我正在使用从 url 广播应用程序 流式传输的 iOS 应用程序 一旦我尝试通过外部扬声器或汽车音响系统等蓝牙设备从应用程序进行流传输 音频质量就会非常差且刺耳 当从 iOS 设备本身播放时 一切听起来都很好 扬声器和耳机 override
  • django-cart 还是 Satchmo?

    我正在寻找实现一个非常基本的购物车 Satchmo http www satchmoproject com 似乎安装了一个lot我不需要的应用程序和额外的东西 我听别人提到过Django 购物车 http code google com p
  • 如何对 Google Cloud Storage 中存储的文件使用 cv2.imread?

    假设我有一张标题为 Sunset jpg 的图片存储在 Google 云存储 gs example bucket testing data 上的以下 URL 中 所以图像的完整 URL 是 gs example bucket testing
  • 复制列表初始化从概念上讲是否调用复制构造函数?

    在 C 11 之前 我们可以通过编写类似的代码来进行复制初始化A a 1 这或多或少相当于A a A 1 也就是说 首先创建一个临时对象 然后调用一个复制构造函数 不管复制省略如何 这在概念上都必须是这样 并且复制者必须是可访问的 通过 C
  • DX11 中的顶点缠绕顺序

    我试图用 dx11 绘制一个简单的正方形 但每个三角形的索引顺序决定了它是否显示 我在光栅化状态下将剔除模式设置为无 但它似乎没有改变任何东西 如果我将第一个三角形的顶点指定为 0 1 2 而不是 2 1 0 则该三角形不会显示 所以我的问
  • cuda cpu功能-gpu内核重叠

    我在尝试开发以练习 CUDA 的 CUDA 应用程序时遇到并发问题 我想通过使用 cudaMemecpyAsync 和 CUDA 内核的异步行为来共享 GPU 和 CPU 之间的工作 但我无法成功重叠 CPU 执行和 GPU 执行 它与主机
  • WebCL 在主要浏览器上的实现现状如何? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有这个问题是因为我找不到 Google Mozilla 或 Microsoft 的官方信息 我刚刚找到 2014 年日期的条目 我希
  • 计算边界球体半径时遇到一些问题

    我已经设法用两种方法计算边界球体半径 但没有一种方法能够准确地满足我的要求 我不需要 像素 完美边界球 但我想要比我目前拥有的更好的东西 我正在使用 Wavefront obj 模型并计算这些模型的边界球半径 我提取当前模型尺寸 我使用 N
  • 代码与日志的比率? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 理想的代码与日志记录比率是多少 我不习惯编写日志 因为我开发的大多数应用程序都没有太多日志记录 最近 虽然我换了工作 但我注意到您看不到调用 l
  • 克隆有效,远程推送无效。通过 copssh 的远程存储库

    我按照 Tim Davis 的方法 setup a msysgit server with copssh on windows guide http www timdavis com au git setting up a msysgit
  • 如何向自定义形状添加阴影图案

    我使用 iText 绘制了一个等边三角形 如下所示 canvas setColorStroke BaseColor BLACK int x start getX int y start getY canvas moveTo x y canv
  • 如何使用参数集合格式化 std::string ?

    可以格式化吗std string传递一组参数 目前我正在以这种方式格式化字符串 string helloString Hello s and s vector
  • rspec 与 devise 的集成测试抛出 NoMethodError 错误

    我在这里发布了类似的错误 但所有这些都无法解决我的问题 我的文件 spec request news controller spec rb 如下所示 require spec helper describe NewsController d
  • php 头问题

    你能帮我一下吗 我转移到新的托管 突然收到此错误 警告 无法修改标头信息 标头已由 输出从 home capital public html Google Connect php 1 开始 在 home capital public htm
  • AS3 瓦片地图渲染(具有 1000 个瓦片)

    首先我要说的是 这里的上下文是 Actionscript 3 0 IDE Flashbuilder 以及椋鸟框架 http gamua com starling 因此 我想创建一个可用于平台游戏或类似游戏的图块地图 我想在 800x600
  • R:在 data.frame 列中拆分不平衡列表

    假设您有一个具有以下结构的数据框 df lt data frame a c 1 2 3 4 b c job1 job2 job1a job4 job5 job6 job9 job10 job11 列所在的位置b是一个以分号分隔的列表 按行不
  • Apple Watch 应用程序无法本地化

    我已经为德语 法语 西班牙语和简体中文设置了 interface storyboard 字符串 我下载了 iOS 应用程序并将其加载到手表上 例如 我然后将手表语言设置为德语 但用户界面仍然是英文 以下是 interface storybo
  • 我的列表视图不会输出,是否需要 if 回发?

    所以我正在运行一个 C 函数 该函数应该根据值更改文本的颜色 当我从列表视图中删除该函数时 它会输出值 但是当我包含它时 它不会输出任何内容我现在终于发现我的函数没有任何问题 但我如何将数据绑定到列表视图 所以我想知道我做错了什么 这是我的
  • 当 props 改变时,React 不会重新渲染组件

    我有一个问题 当 React 组件的 props 改变时 它们不会重新渲染 GroupLabel 将 counter 作为 prop export const GroupLabel props gt const change gt prop