React:更新列表中的一项而不重新创建所有项目

2024-03-07

假设我有一个包含 1000 个项目的列表。我用 React 渲染它,如下所示:

class Parent extends React.Component {
  render() {
    // this.state.list is a list of 1000 items
    return <List list={this.state.list} />;
  }
}

class List extends React.Component {
  render() {
    // here we're looping through this.props.list and creating 1000 new Items
    var list = this.props.list.map(item => {
      return <Item key={item.key} item={item} />;
    });
    return <div>{list}</div>;
  }
}

class Item extends React.Component {
  shouldComponentUpdate() {
    // here I comparing old state/props with new
  }
  render() {
    // some rendering here...
  }
}

对于相对较长的列表,map() 大约需要 10-20 毫秒,我可以注意到界面中有一点延迟。

当我只需要更新一个 React 对象时,我可以防止每次重新创建 1000 个 React 对象吗?


您可以使用任何状态管理库来完成此操作,以便您的Parent不跟踪this.state.list=> 你的List仅在新时重新渲染Item被添加。还有个人Item更新时将重新渲染。

假设你使用redux.

你的代码将变成这样:

// Parent.js
class Parent extends React.Component {
  render() {        
    return <List />;
  }
}
// List.js
class List extends React.Component {
  render() {        
    var list = this.props.list.map(item => {
      return <Item key={item.key} uniqueKey={item.key} />;
    });
    return <div>{list}</div>;
  }
}

const mapStateToProps = (state) => ({
  list: getList(state)
});

export default connect(mapStateToProps)(List);
 
// Item.js
class Item extends React.Component {
  shouldComponentUpdate() {
  }
  render() {
  }
}

const mapStateToProps = (state, ownProps) => ({
  item: getItemByKey(ownProps.uniqueKey)
});

export default connect(mapStateToProps)(Item);

当然,你必须实现reducer和两个选择器getList and getItemByKey.

有了这个,你List如果添加新元素或者更改,将触发重新渲染item.key(你不应该这样做)

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

React:更新列表中的一项而不重新创建所有项目 的相关文章

随机推荐

  • C++ 打印指针的值

    我有一个双指针数组 但每次我尝试打印其中一个值时 都会打印地址 如何打印实际值 cout 有人知道吗 如果它确实是一个 初始化的 双指针数组 即 double arr Initialize individual values 所有你需要的是
  • UIDatePicker设置最小和最大小时

    如何设置 UIDatePicker 的最小和最大小时 到底有可能吗 我知道如何设置最小和最大日期 datePicker setMinimumDate 今天 datePicker setMaximumDate nextMonthDay 我想要
  • 如何进行多对多 Django 查询来查找具有 2 个给定作者的书籍?

    我有一个查询 需要使用 ID 精确过滤 2 位作者 理论上 Book objects filter author id 1 author id 2 这是不可能的 我怎么解决这个问题 干杯 米奇 一开始并不直观 但答案就在我们面前 Book
  • knex.js 查询“承诺”何时执行/解析?

    对于正常的承诺 一旦当前代码停止 承诺就会尽快解决 考虑以下伪代码 const p SomePromiseDoingLoad calculatethings await sleepPromise during sleep the promi
  • VB:游戏之上的应用

    我想编写一个应用程序 在全屏游戏上绘制某个视觉对象 例如半透明三角形 该游戏具有 强置顶 属性 因为它涵盖了所有其他分类为 置顶 的应用程序 我需要我的应用程序是最上面的应用程序 并且始终处于焦点 而不影响后面游戏的顺利运行 如何才能有效地
  • 查找 Maven Google App Engine 项目的原型

    我正在使用 Eclipse 和 m2eclipse 插件为 Google App Engine 创建一个新的 Java 项目 创建新的 Maven 项目时 Eclipse 找不到原型 com google appengine archety
  • 由 javascript 更新的 asp.net mvc 禁用文本框不会发布新值

    我正在使用强类型模型来表达我的观点 我有一个禁用的文本框 我使用 javascript 更新其值 文本框是使用这个渲染的 这将呈现一个文本框 其中 NAME 和 ID 为 TotalAmount TotalAmount 也是我的模型上绑定到
  • cx_Freeze 后 Paramiko 无法正常工作?

    所以我编写了这段代码 我使用 Paramiko 通过 SSH 连接到计算机 脚本正常工作 但是当我使用 cx Freeze 将其转换为 exe 时 程序在 self ssh load system host keys 处停止工作 所以我从脚
  • 将表示列表的字符串转换为实际的列表对象[重复]

    这个问题在这里已经有答案了 我有一个代表列表的字符串 22 33 36 41 46 49 56 72 85 92 95 98 107 118 120 123 124 126 127 130 149 157 161 171 174 177 1
  • flutter中的webview是否缓存网页?

    我想缓存在 flutter webview 中显示的网页 以便提高性能 无需重新加载页面 可以用吗 我可以实施吗 flutter inappwebview 前 flutter inappbrowser 有参数cacheEnabled默认为
  • 如何从 Google Places API 获取地点描述

    我正在尝试使用 Google 地点 API 来获取某些地点的信息 我有一个 来自谷歌搜索的示例 这是我试图找到的 我认为 Places API 文本搜索的 类型 字段将包含它 但该文本似乎不同 并且不在提供的选项列表中 如果有人可以提供一些
  • .Net 中的 Oracle 连接池

    我们有一个使用 Oracle 数据库的系统 有人问我系统是否使用连接池 但我不确定 我们正在使用Oracle DataAccess Client OracleConnection 在阅读该主题时 我发现连接字符串中的连接池设置为 true
  • 在vagrant box上创建虚拟主机

    我正在尝试设置一个基于 Chef 提供的 vagrant 的开发环境 我使用 Apache 使用 Chef 创建了一个环境 并且可以通过端口转发从我的主机访问 Web 服务器 我想让我的流浪盒包含多个虚拟主机 并且通过共享文件夹 我将定义不
  • spring-boot oauth2 拆分授权服务器和资源服务器

    我试图在 spring boot 中将资源服务器与授权服务器分开 我有两个单独运行的不同应用程序 在授权服务器中 我可以从 oauth token 获取不记名令牌 但是当我尝试访问资源 在标头中发送令牌 时 我收到无效令牌错误 我的目的是使
  • AZURE Active Directory - 服务主体和企业应用程序之间有什么区别?

    我经常对 Azure AD 中的三个主题感到困惑 服务负责人 企业应用 应用程序注册 有什么不同 我可以轻松进入 应用程序注册 并注册一个 应用程序 而该 应用程序 甚至不需要存在 它所需要的只是一个 URL 也可以是完全随机的 然后 此应
  • 如何对命令行参数进行单元测试?

    我正在尝试向 Python 提供命令行参数unittest并面临一些问题 我在互联网上搜索并找到了一种提供参数的方法 unittest main argv myArg 问题是这对于单个命令行参数工作正常 但对于多个参数则失败 unittes
  • 为 Heroku 静态编译 pdftk。需要将PDF分割成单页文件

    所以我们使用 heroku 来托管我们的 Rails 应用程序 我们已经搬到雪松堆了 该堆栈没有安装 pdftk 库 我联系了支持人员 并被告知为 amd64 ubuntu 静态编译它并将其包含在我的应用程序中 事实证明这比我想象的要困难
  • 工厂方法更适合框架,抽象工厂更适合库吗?

    抽象工厂和工厂方法模式都是创建型设计模式 解决了不同场景下的对象创建问题 根据 GOF工厂方法 pattern 定义一个用于创建对象的接口 但让子类决定实例化哪个类 工厂方法让类将实例化推迟到子类 我的理解 动机Client是获取执行的工厂
  • 将 Excel 导入到 DataTable 字符串为空

    要将 Excel 导入数据表 我使用简单的代码 string connectionString string Format Provider Microsoft ACE OLEDB 12 0 data source 0 Extended P
  • React:更新列表中的一项而不重新创建所有项目

    假设我有一个包含 1000 个项目的列表 我用 React 渲染它 如下所示 class Parent extends React Component render this state list is a list of 1000 ite