根据 ID 更新 React.js 中的特定组件实例

2024-05-02

在react.js应用程序中,我想知道为每个组件提供一个ID的最佳实践是什么,该ID可用于根据需要仅更新该组件的信息。

例如,如果我们有一个显示销售信息的组件,并且我们创建并显示其中 20 个组件,因为我们有 20 个产品,那么我们会每隔一段时间从服务器检索 JSON 以查询任何已更新的产品,然后希望只更新那些改变了,我们如何才能实现这一目标。

过去,我们会使用 PHP 创建小部件并根据 ID 赋予它们 id 属性(例如“sales”+ Productid)。然后,当 JSON 从我们的服务器返回且产品 ID 已更改时,我们可以仅定位需要更新的小部件。我们会知道它们的 id 属性,并可以使用以下内容更新它们:
this.element.find(“#”+“sales”+productid).html(“这里修改后的html”)

(是的,这很麻烦)

在 React 中,如何仍然拥有这种类型的控件来仅更新基于从服务器或数据库返回的某些有意义的 ID 的组件?有没有办法为组件提供 ID 并在以后使用/定位它?


下面是一个简单的示例,它模拟每秒获取产品列表并呈现该列表。产品 ID 用作key https://facebook.github.io/react/docs/lists-and-keys.html在渲染的列表中,并且将允许 React 在每次更新时有效地重新渲染列表。

class ProductsInfoContainer extends React.Component {
  constructor(props) {
    super(props);
    this.state = { products: [] };
    this.fetchProducts = this.fetchProducts.bind(this);
  }

  componentDidMount() {
    this.refreshTimer = setInterval(this.fetchProducts, 1000);
  }

  componentWillUnmount() {
    clearInterval(this.refreshTimer);
  }

  fetchProducts() {
    //simulate API fetch from server - we'll just create a list with random prices
    const products = [
      {id: "123-456", name: "Widget", price: this.getPrice()},
      {id: "234-567", name: "Widget Spinner", price: this.getPrice()},
      {id: "345-678", name: "Fidget", price: this.getPrice()},
      {id: "456-789", name: "Fidget Spinner", price: this.getPrice()},
    ];
    this.setState({ products });
  }

  getPrice() {
    return (Math.random() * 100).toFixed(2);
  }

  render() {
    return <ProductsInfo products={this.state.products} />;
  }
}

const ProductsInfo = ({ products }) => (
  <table>
    <thead>
      <tr>
        <th>Id</th>
        <th>Name</th>
        <th>Price</th>
      </tr>
    </thead>
    <tbody>
      {products.map(product =>
        <tr key={product.id}>
          <td>{product.id}</td>
          <td>{product.name}</td>
          <td>{product.price}</td>
        </tr>
      )}
    </tbody>
  </table>
);

ReactDOM.render(<ProductsInfoContainer />, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.6.1/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.6.1/react-dom.min.js"></script>

<div id="root"></div>

当你的products数据更新来自服务器,容器中的状态变化将导致React重新渲染你的ProductsInfo组件,并将找出已更改的内容并进行相应更新。提供一个key对于每种产品,该过程都会变得更加高效。

显然这是一个微不足道的例子,但它给了你一个好主意。您在给定输入数据的情况下以声明方式定义 UI 的外观,并让 React 关心如何有效地将其转换为屏幕上的内容。你可以获得一个ref https://facebook.github.io/react/docs/refs-and-the-dom.html到 React 中的 DOM 节点并直接更新它,但这完全违背了 React 的本质,在我看来应该谨慎使用。

如果您需要对如何呈现每个产品做一些更复杂的事情,您可以定义另一个组件并从地图函数中渲染它,例如

{products.map(product => <Product key={product.id} info={product}/>)}

如果您正在谈论数千(或更多)产品,那么您可能会采取不同的方法,或者至少考虑对数据进行分页等。

如果有任何不清楚的地方,请随时提出任何问题。

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

根据 ID 更新 React.js 中的特定组件实例 的相关文章

随机推荐

  • jQuery 中children() 或find() 哪个最快?

    要在 jQuery 中选择子节点 可以使用children 也可以使用find 例如 this children foo 给出与以下相同的结果 this find foo 现在 哪个选项最快或首选 为什么 children https ap
  • 如何在 AndroidEnvironment 构建文件的环境变量中指定下载目录的路径

    使用 Visual Studio 2022 17 2 0 Preview 1 0 我目前正在尝试创建一个 MAUI 应用程序 该应用程序已经在 Windows 上运行良好 也可以在 Android 下运行 该应用程序使用一个库 SaxonC
  • 如何使用python将列表填充为0

    我想从另一个列表中获取固定长度的列表 例如 a a b c b 0 0 0 0 0 0 0 0 0 0 我想得到一个这样的列表 a b c 0 0 0 0 0 0 0 换句话说 如果len a lt len b 我要填写清单a使用列表中的值
  • c 中的分叉和管道过程

    所以我有一个项目要做 但我完全被难住了 我花了十个小时却一无所获 我并不是特别想要答案的代码 但是一些伪代码和正确方向的良好提示将有帮助 它分叉多个进程 k 命令行参数 通过管道连接 每个进程都连接到下一个进程 最后一个进程连接到第一个进程
  • 通过 C 将线程固定到 cpuset 中的核心

    我有 cgroup cpuset set1 set1有2 5 8 我想将一个进程绑定到该 cpuset 然后将该进程中的一个线程固定到核心 4 cpuset 的名称 线程名称以及我应该将线程绑定到的核心位于 m 配置文件中 是否有任何 C
  • 可变参数模板

    我看过很多介绍可变参数模板的链接 但我从未见过任何可编译的示例来演示这种方法 有人可以给我提供一些可以找到此类可编译示例的链接吗 最简单的示例之一是以下实现max它甚至没有在类型上进行模板化 int maximum int n return
  • 运行时异常无法在未调用 Looper.prepare 的线程内创建处理程序错误

    我正在尝试上传带有其他一些 EditText 的照片 我从在线示例中获取了示例代码并对其进行了一些编辑 但是 我收到此错误 08 29 21 36 46 000 E AndroidRuntime 4566 FATAL EXCEPTION A
  • TypeError:req.checkBody 不是包含 bodyparser 和expressvalidator 模块的函数

    我收到错误 req checkBody 不是一个函数 我认为我已经包含了express validator和body parser 这是我的代码 var express require express var bodyParser requ
  • Java Linux 非阻塞套接字超时行为

    我有一个 Java 非阻塞服务器 它跟踪选择器中的所有套接字通道 然后我与服务器建立 500 个连接并定期发送数据 服务器接收到的每条数据都会回显给客户端 问题来了 测试工作了几个小时 然后突然逐渐地 服务器管理的所有套接字在尝试读取数据时
  • 工具栏下方的白条

    所以我有一个带有工具栏的应用程序 工具栏下方出现一个白条 最后的屏幕截图 我不希望那个栏在那里我尝试添加 maxHeight 以查看它是否有效 但没有运气 这是我的样式和 v21 style xml style
  • 我怎样才能向下滚动到多行文本框的底线,Javascript的scrollIntoView对此不起作用

    我正在尝试创建一个基本的视频和文本聊天网站 在房间页面中 我有 Flash 视频和一个文本框 多行 其中显示发送到房间的所有消息和一个文本框 供用户通过单击输入和发送旁边的按钮 tr td td tr
  • x 或 y:可接受的习语,还是混淆?

    我必须从可能为 None 的变量中提取值 并考虑一些默认值 我首先写了这段代码 if self maxTiles is None maxX maxY 2 2 else maxX maxY self maxTiles 然后我意识到我可以将其缩
  • 如何以编程方式重新启动 Windows 资源管理器进程

    我正在开发 Windows shell 扩展 不幸的是 在更改 DLL 时 我必须重新启动 Windows 资源管理器 因为它将 DLL 保留在内存中 我从 Dino Esposito 找到了这个程序 但它对我不起作用 void SHShe
  • 如何替换 iOS 6 上 UIWebView 键盘下工具栏上的按钮?

    如何替换工具栏上的按钮UIWebViewiOS 6 上有键盘吗 以下代码在 iOS 5 1 上运行良好 但在 iOS 6 上不起作用 UIWindow keyboardWindow nil for UIWindow testWindow i
  • 获取类中的字段数

    有没有办法获取一个类的字段数量 struct Base char a int b struct Derived Base std string c static assert num fields value 2 static assert
  • JavaScript 日期 + 7 天

    这个脚本有什么问题 当我将时钟设置为 29 04 2011 时 它会添加2011年4月36日在星期输入 但正确的日期应该是6 5 2011 var d new Date var curr date d getDate var tomo da
  • 第 n 行到最后一行的总和

    我想在电子表格顶部创建一个 TOTAL 行 在此行中 每个单元格应为 TOTAL 行下方列中的值的总和 例如 如果总行数是第 1 行 则单元格 A1 应该是 A2 到 A 列最后一行的总和 电子表格中的行数会随着时间的推移而增长 所以我不能
  • SpringBoot @SqsListener - 不工作 - 有异常 - TaskRejectedException

    我有一个 AWS SQS 队列中已有 5000 条消息 示例消息类似于 Hello 1 我创建了一个 SpringBoot 应用程序 并在其中一个组件类中创建了一个从 SQS 读取消息的方法 package com example aws
  • 自动完成请求/服务器响应是什么样的?

    这似乎是一个黑洞 经过一个小时的搜索jQuery用户界面 http en wikipedia org wiki JQuery UI网站 Stack Overflow 和谷歌搜索 我还没有找到如何编写的最基本信息服务器端自动完成的 向服务器传
  • 根据 ID 更新 React.js 中的特定组件实例

    在react js应用程序中 我想知道为每个组件提供一个ID的最佳实践是什么 该ID可用于根据需要仅更新该组件的信息 例如 如果我们有一个显示销售信息的组件 并且我们创建并显示其中 20 个组件 因为我们有 20 个产品 那么我们会每隔一段