React/react hooks:状态更改后子组件不重新渲染?

2024-01-02

我正在react/react hooks中编写一段代码,尝试执行以下操作。

从父组件获取对象数组作为 prop 使用将其设置为状态useState钩。 根据预期的过滤器(时间和评级)对状态进行排序,然后重新渲染子组件。 我看到的是,下面的代码在排序后更新了状态,但即使更新了状态,依赖于状态的子组件也不会重新渲染。我认为只要状态改变,子组件就会自动重新渲染?

import React, {useState} from 'react';
import ProfilePostspreview from './ProfilePostspreview';

function ProfileNavigation(props){
   const [newarray, setnewarray]=useState(props.parray);   //'parray' object passed as props and saved as 'newarray' state    
   const otc = () => {  //Function to sort the state by time and set a new state
       let k=newarray;
       setnewarray(k.sort((a, b) => (a.time > b.time) ? -1 : 1 ));
   }
   const orc = () => {  //Function to sort the state by rating and then time and set a new state
       let k=newarray;
       setnewarray(k.sort((a, b) => (a.rating > b.rating) ? -1 : (a.rating === b.rating) ? ((a.time > b.time) ? -1 : 1) : 1 ));
   }

return (
   <div>
      <div className="sm_options">    //Component to trigger the otc and orc functions
          <div className="sm_button" id="order_t" onClick={otc}>Sort by time</div>    
          <div className="sm_button" id="order_r" onClick={orc}>Sort by rating</div>    
      </div>
      <div className="posts_preview_columns_p"> //This is dependent on the 'newarray' state but is not re-rendering even after the state is sorted and updated?
      {newarray.map(na=>
      <ProfilePostspreview
          postThumbnail={na.photolink}
          rating={na.rating}
          time={na.time}
          target={na.target}
      />
      )}
      </div>
   </div>
);
}

export default ProfileNavigation;

这可能是什么原因?代码是否有问题,或者状态排序是否被认为不够强大,不足以让 React 重新渲染子组件?如果是后者,如何在排序后强制重新渲染?

有什么建议吗?谢谢!


数组::排序 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

The sort()方法对数组的元素进行就地排序并 返回排序后的数组。默认排序顺序是升序,构建 将元素转换为字符串,然后比较它们 UTF-16 代码单元值的序列。

这对您来说意味着存储在数组中的元素的顺序可能会改变,但数组会就地排序,这意味着返回相同的数组引用(与返回的其他数组函数不同)new数组)。

React 协调是通过检查状态和 props 进行的,并做出一个整体假设:如果下一个状态/prop 引用没有改变,那么值也没有改变,从而返回最后计算的渲染 DOM。这是更新反应状态的重要细节......每次更新都需要引用一个新对象。

就你而言,你只是saving的参考current状态数组,改变它,然后重新保存它。由于引用是稳定的并且不会改变,因此反应不会重新渲染。

const otc = () => {
  let k = newarray; // <-- saved array reference!!
  setnewarray(k.sort((a, b) => (a.time > b.time) ? -1 : 1 ));
}

正确的反应方式是复制当前数组值into a new数组,因此它将有一个新的对象引用。

const otc = () => {
  const newSortedArray = [...newArray].sort(
    (a, b) => (a.time > b.time) ? -1 : 1
  ); // spread old array values into new array, then sort
  setNewArray(newSortedArray);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React/react hooks:状态更改后子组件不重新渲染? 的相关文章

  • 如何使用 AngularJS、Devise 和 UI Router 全局实现身份验证?

    我对 Angular 很陌生 所以这可能是一个新手问题 我正在尝试实现一个简单的任务管理器 只是一个练习 以 Rails 作为后端 以 Angular 作为前端 到目前为止 我遵循了教程 一切正常 现在我想在全球范围内实施身份验证 这意味着
  • 标点符号加载“动画”,javascript?

    我正在寻找一种好方法来显示一些标点符号加载 动画 我想要的是这样的 This will display at second 1 Waiting for your input This will display at second 2 Wai
  • 如何延迟 NavLink 的反应?

    Delay e gt e preventDefault setTimeout gt e unpreventDefault make this work 500 render
  • 有什么方法可以在不重新加载的情况下更改标头 URL? [复制]

    这个问题在这里已经有答案了 可能的重复 修改URL而不重新加载页面 https stackoverflow com questions 824349 modify the url without reloading the page 使用新
  • JQuery 可排序嵌套可排序 div

    这个问题与这个有关Nest jQuery UI 可排序 https stackoverflow com questions 19129476 nest jquery ui sortables 但我无法解决我的问题 问题是 我有一个包含项目的
  • 在调试模式下运行 NPX 命令

    我有一些npx create react app命令卡住了 终端上没有显示任何错误 所以 我需要运行npx in 调试模式 有没有办法获得debug登录npx命令来识别问题 edit 我运行的命令 npx create react app
  • json、rails、javascript 中的解析错误

    我需要将 ruby 数组放入 javascript 数组中 但出现解析错误 var characters 这就是我将 ruby 嵌入到内联 javascript 中的方式 但它出现了解析错误 我应该如何将此 ruby 数组放入 javasc
  • 测量填写部分的时间 - 谷歌表单

    我正在尝试使用谷歌表单进行研究调查问卷 对于某些部分 我想自动测量用户填写所需的时间 谷歌表单中没有这样的选项 我尝试复制表单源 并用 javascript 填充时间 但它不起作用 跨源问题 未能成功托管复制的表单 如何做到 我如何衡量回答
  • 将数字限制为段的最优雅的方法是什么?

    比方说x a and b是数字 我需要限制x到段的边界 a b 换句话说 我需要一个钳位功能 https math stackexchange com q 1336636 clamp x max a min x b 有人能想出一个更易读的版
  • 如何按值删除数组中的多个项目?

    我正在尝试做一个removeAll 函数 它将删除具有该特定值 而不是索引 的数组的所有元素 当我们对循环进行任何更改时 棘手的部分就出现了 索引往往会移动 使其很难像我们想要的那样工作 并且每次更改时都重新启动循环 这在大数组上效率非常低
  • 是否可以让 webpacks System.import 使用 ajax (用于进度事件)?

    所以我刚刚更新到 webpack 2 并进行了第一个工作设置 其中 webpack 通过查看 System import 调用自动创建块 相当甜蜜 但是 我使用 ajax 调用加载初始块 以便我可以加载时显示进度 https stackov
  • 使用默认值反应路由参数

    我正在使用 React 功能组件和 React Router v5 我正在使用 useParam 函数来获取参数 当参数不可用或未定义时 如何设置参数的默认值 我的路由器代码
  • select 元素是否具有标准值属性?

    这是一个简单的问题 但我找不到任何参考资料 所以就在这里 假设我有一个选择元素
  • 替换打字稿中字符串中字符的所有实例?

    我正在尝试用 x 字符替换电子邮件中的所有句号 例如 电子邮件受保护 cdn cgi l email protection 将变为 myxemail emailxcom 电子邮件设置为字符串 我的问题是它不只是替换句号 而是替换每个字符 所
  • 从 html 页面和 javascript 调用 java webservice

    我正在尝试从 javascript 调用 java 实现的 Web 服务 使用 NetBeans IDE 我读过很多关于 jQuery 和 AJAX 的内容 但我似乎无法掌握它 假设我的 Web 服务 WSDL 位于 http localh
  • backbone.js:视图中影响集合中不同模型的按钮

    我刚刚开始使用backbone js 到目前为止 我真的很喜欢它 我有这样的事情 ModelA ModelB ViewA ViewB ModelA 持有 ModelB 的集合 如何使用按钮构建模型 B 的视图 单击该按钮会更改集合中下一个
  • 需要根据用户选择有条件地渲染具有 X 行数的部分

    我有一个反应组件 其中包含一个下拉列表 其中的选项包括none 1 5 and 13 根据用户选择的数字 我需要渲染一个部分 其中包括许多行 每个行都有字段名称和下拉列表 如果用户不选择任何一个 我需要整个附加配置部分消失 新部分中的每个下
  • 如何在 JSP 编辑器中激活 javascript 的语法着色 - Eclipse

    在某些情况下 javascript 确实必须位于 JSP 页面中 而不是位于单独的文件中 有些框架还使用Javascript做一些事情 以便用户将其包含到JSP标签中 这样JS就不会出现在
  • 右列固定的 Div 表

    我最近接手了一个非营利网站作为一个项目 我正在使用一个现有的网站 所以我必须使用很多已经编程的东西 所以我所要做的就是创建设计 I made a diagram of basically what I can t figure out ho
  • 允许 iframe 跨域链接到目标父框架

    我有 2 个域 域 1 上的一个页面使用 iframe 加载域 2 中的内容 如何允许来自domain2 iframe 内 的链接在domain1 的完整父框架中打开 我一直在关注IE和w3c的新沙箱属性 http www w3 org T

随机推荐

  • 导入错误:没有名为 django.core.wsgi 的模块(ubuntu)

    我按照本指南为我的 Django Web 应用程序配置 apache https docs djangoproject com en 1 9 howto deployment wsgi modwsgi basic configuration
  • 在 Node.js 中调整图像大小的简单方法? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 从文件系统加载数据后 值得使用哪种模型来调整图像大小并返回客户端 fs readFile process env OPENSHIFT
  • 如何使用 servlet 创建 CSV 文件?

    我想从以下位置下载 CSV 文件servlet 我在对象数组中有数据 object 我需要将其写入CSV并下载 你能帮我如何在 servlet 类中做到这一点吗 How can Object 曾经表示过 CSV 数据吗 它包含一行多列还是多
  • 经典 ASP 中的线程休眠?

    我正在对用经典 ASP VbScript 编写的旧应用程序进行一些修改 它具有向应用程序的成员发送电子邮件的功能 但由于成员列表相当大 因此在发送前一百封左右后 服务器会拒绝新的电子邮件 我已经编写了一些代码 让它能够突发发送 20 封电子
  • Python中的栈是什么?

    Python 中的 堆栈 是什么 是CPython的C栈吗 我读到Python 堆栈帧是在堆中分配的 但我认为堆栈的目标是 堆栈堆栈帧 那么堆栈做什么呢 Python的栈帧是在堆上分配的 但它们相互链接形成一个堆栈 当函数a调用函数b th
  • 我应该通过什么方式检查 JNI 中的异常?

    我们知道 JNI 中的很多方法都可能会引发异常 并且异常引发后无法调用 从而可能导致 JVM 崩溃 我们不仅可以使用 ExceptionOccurred 或 ExceptionCheck 来确定是否发生异常 还可以简单地检查不等于 NULL
  • 如何在 Python 中从包含 N 行的 csv 文件创建嵌套字典

    我正在寻找一种方法将具有未知列数的 csv 文件读取到嵌套字典中 即用于输入表格 file csv 1 2 3 4 1 6 7 8 9 10 11 12 我想要一本以下形式的字典 1 2 3 4 6 7 8 9 10 11 12 这是为了允
  • 有没有一种安全的方法可以从Python中的线程创建子进程?

    我正在使用一些现有代码 这些代码创建了许多不同的工作线程 然后这些线程又使用子进程 多重处理调用一些 shell 脚本 据我所知 这是一个禁忌 因为互斥锁可能会在 exec 发生之前嵌入子进程的解释器中 这是一个合理的担忧吗 如果是这样 是
  • 更改 Oracle 客户端注册表中的 NLS_LANG 设置的影响

    我们正在从 NET Microsoft oracle 驱动程序迁移到 ODP NET 驱动程序 我们遇到的问题之一是这个错误 ORA 12705 无法访问 NLS 数据文件或指定的环境无效 我们能够通过修改注册表和更改设置来阻止错误 看到这
  • dom元素样式更改后如何调用函数Javascript/jquery

    我已经浏览了多个示例 并实现了示例所述的相同行为 页面加载后 如果 dom 元素的样式发生变化 我需要触发一个方法 即使我在浏览器控制台中更改任何内容 样式更改事件也应该触发 该事件将显示为 无 和 显示块 在我的代码中 如果在浏览器控制台
  • 如何为 Window Store 构建 Electron 应用程序?

    帮助构建 Window Store 的 Electron 应用程序 我为电子编译了一个简单的应用程序 我按照官方网站的说明进行尝试 我运行命令 electronics windows store input directory C Brai
  • spring-boot 如何提供特定的 url?

    以我之前的经验来看 当使用纯servlet 我们定义 servlet 以便它可以处理与特定 url 匹配的请求 使用时struts2 我们定义一个过滤器 以便它为匹配特定 url 的请求提供服务 使用时springMVC在传统的 xml 配
  • 简约 Qt 构建的推荐标志

    我正在尝试构建 Qt 因为 Visual Studio 2010 需要它 构建脚本 configure exe 非常简单 但默认情况下需要很长时间才能编译 在配备 SSD 的快速笔记本电脑上等待了一个小时后 我放弃了 不使用任何标志 仅使用
  • Visual Studio 2019 无法识别 tsconfig.json

    我刚刚安装了 Visual Studio 2019 并尝试了我当前的解决方案 似乎它忽略了tsconfig json文件 而它在 VS 2017 中工作 在 Visual Studio 2017 中的项目属性 TypeScript Buil
  • 如何使用PHP调用python脚本实时返回结果?

    我使用PHP调用python脚本成功并得到了结果 但我必须等待脚本运行结束而没有任何输出 它看起来对我的客户不友好 如何将脚本结果实时返回到PHP Web 例如 对于下面的代码 我希望 PHP Web 将实时显示输出消息 而不是在最后一起显
  • Xamarin Monodroid:WP7 => Android 和自定义控件?

    我正在使用 Xamarin Monodroid 将一些 Windows Phone 应用程序移植到 Android 我对 Xamarin 的东西还很陌生 实际上刚刚购买了许可证 到目前为止 在 AXML 中重新创建 XAML UI 方面效果
  • Heroku 推送问题

    我在将应用程序推送到 Heroku 时遇到问题 以下是我尝试使用 git push heroku master 时的终端输出 Counting objects 22 done Delta compression using up to 8
  • 谷歌在搜索结果中以不同方式显示网站标题

    Google 以与预期不同的方式显示我网站的页面标题 页面标题应该是 布莱顿和刘易斯 平面设计师刘易斯 沃利斯平面设计 它在必应 雅虎和我的实际网站上显示良好 然而 谷歌以不同的方式显示它 刘易斯 沃利斯平面设计 平面设计师布莱顿和刘易斯
  • 如何在 Power BI 中按度量筛选结果

    我需要能够按度量进行筛选 以便在 Power BI 中显示更精细的结果 我希望能够选择百分比在某个范围内的位置 或者 100 我对度量的计算是这样的 每列只能是 1 或 0 errorPercentage CALCULATE SUM mis
  • React/react hooks:状态更改后子组件不重新渲染?

    我正在react react hooks中编写一段代码 尝试执行以下操作 从父组件获取对象数组作为 prop 使用将其设置为状态useState钩 根据预期的过滤器 时间和评级 对状态进行排序 然后重新渲染子组件 我看到的是 下面的代码在排