React 在状态更改后不重新渲染,如何设置子组件的状态?

2023-12-24

Problem:

我将立法者集合放入表中,字段标题是按钮,并附加了单击事件,通过单击的字段按钮对集合进行排序。

render() {
    const legislatorList = this.populateList() //  creates an Array of Legislator components
    return (
      <div className="legislators">
        <h2>Legislators</h2>
        <table className="table table-bordered">
        <thead>
          <tr>
            <th><button type="button" onClick={ () => this.handleChange("first_name")}  >First</button></th>
            <th><button type="button" onClick={ () => this.handleChange("last_name")}  >Last</button></th>
            <th><button type="button" onClick={ () => this.handleChange("state")}  >State</button></th>
            <th><button type="button" onClick={ () => this.handleChange("party")}  >Party</button></th>
          </tr>
        </thead>
          <tbody>
            { legislatorList }
          </tbody>
        </table>
      </div>
    );

单击事件将 this.state.legislators 重新分配给 a sort 函数的输出。

handleChange( value ) {
    this.setState( { legislators: this.sort_by( value) })
  }

但即使 state.legislators 的更新状态已正确排序,该表仍保持不变。

我认为我的问题是立法者的子立法者组件没有更新其状态。所以我的问题是如何更新子组件的状态?

Before Any Sorting: enter image description here

After Sorting by First Name: enter image description here

立法者的其他职能:

sort_by(sort_by) {
  const sorted = this.state.legislators.sort(function(a, b) {
    a_val = a[sort_by]
    b_val = b[sort_by]
    if (a_val < b_val) {
      return -1;
    }
    if (a_val > b_val) {
      return 1;
    }
    return 0;
  });
  return sorted
}

renderLegislator(legislator) {
  return <Legislator legislator={ legislator}/>
}

populateList() {
  return this.state.legislators.map((legislator) =>
    this.renderLegislator(legislator)
  )}
}

这是立法者部分:

class Legislator extends React.Component {
  constructor(props) {
    super();
    this.state = {
      legislator: props.legislator,
      fields: ["first_name", "last_name", "state", "party"]
    }
  }

  render() {
    const legislatorRow = this.state.fields.map((field) =>
        <LegislatorField value={ this.state.legislator[field] } />
    )
    return (
      <tr key={this.state.legislator.id}>
        { legislatorRow }      
      </tr>
    );
  }
}

The state.legislator您的子组件中的代码未更新,因为代码:

this.state = {
  legislator: props.legislator,
  fields: ["first_name", "last_name", "state", "party"]
}

只运行一次,因为构造函数也只运行一次。还有state.legislator除非您这样做,否则子组件中的内容不会自动更新this.setState()显式地位于子组件内。

但是,没有必要按照您正在做的方式来做。维持自己的状态props在子组件中是绝对多余的。

您可以直接使用this.props inside render子组件中的方法,并且当state父组件发生变化,子组件将使用新的 props 重新渲染。

 class Legislator extends React.Component {
  constructor(props) {
    super();
    this.state = {
      fields: ["first_name", "last_name", "state", "party"]
    }
  }

  render() {
    const legislatorRow = this.state.fields.map((field) =>
        <LegislatorField value={ this.props.legislator[field] } />
    )
    return (
      <tr key={this.state.legislator.id}>
        { legislatorRow }      
      </tr>
    );
  }
}

作为奖励,如果您this.state.fields始终是恒定的——您不打算稍后更新它,也不必将其作为状态。您可以简单地将其设为类实例字段,如下所示this.fields = ["first_name", "last_name", "state", "party"]

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

React 在状态更改后不重新渲染,如何设置子组件的状态? 的相关文章

随机推荐

  • grep 仅由大写字母组成的整个单词

    看起来这很简单 但我遇到了麻烦 我有一个文本文档 例如 如下所示 这是一个文本文档一些大写的单词但并非全部都是全部大写iPhone 我想要的是解析该文档并仅匹配仅由大写字母组成的整个单词 如下所示 文本文件 SOME 但不是全部大写 我写了
  • vscode 中 Windows 10 中的 Node.js 安装错误

    Exception calling DownloadString with 1 argument s The request was aborted Could not create SSL TLS secure channel At li
  • 以内存高效的方式将大型 csv 读入稀疏 pandas 数据帧

    熊猫read csv函数似乎没有稀疏选项 我有 csv 数据 里面有很多零 它压缩得很好 并且去掉了任何0值将其减小到几乎原始大小的一半 我尝试先将其加载到密集矩阵中read csv然后打电话to sparse 但它需要很长时间并且在文本字
  • 如何在 div 元素内水平居中图像?

    如何在容器 div 内居中对齐 水平 图像 这是 HTML 和 CSS 我还添加了缩略图其他元素的 CSS 它按降序运行 因此最高的元素是所有内容的容器 最低的元素位于所有内容的内部 thumbnailwrapper color 2A2A2
  • 绕点 xna 2D 旋转

    我正在尝试围绕另一个对象 半圆形纹理 旋转一个对象 框纹理 我不知道从哪里开始 如果有人能帮助我 我将不胜感激 http msdn microsoft com en us library ff433988 aspx http msdn mi
  • QT4:如何重新启动应用程序?重新设置? [复制]

    这个问题在这里已经有答案了 1 我想重新启动我的 QT4 应用程序 只是同一应用程序的正常关闭和启动 2 为什么 好吧 我需要一个选项来 重置 一切 重新启动应用程序似乎是最简单的方法 问题是 有很多课程和一切 我没有时间将它们的每个设置恢
  • 如何比较两个图像?

    public void winCheck if button1 Image img1 w1 P2 button1 Image new Bitmap win cross png button2 Image new Bitmap win cro
  • 在刀片模板中包含 css 文件吗?

    我想在我的 Laravel Blade 模板中包含一个 css 文件 我试过了 include public path css styles css 但它说视图不存在 它确实存在 如何包含 css 文件 请注意 我知道这不是链接 css 文
  • JavaScript 回调函数中的变量范围

    我预计下面的代码会警告 0 和 1 但它警告 2 两次 我不明白原因 不知道是不是jquery的问题 另外 如果这篇文章的标题和标签不准确 请帮助我编辑
  • 如何用不同的标记绘制多条线

    我想绘制多条线MATLAB http en wikipedia org wiki MATLAB这样做 每一行的标记都会不同 我知道通过颜色可以实现这一点ColorSet hsv 12 有没有像这种简单的标记方法 好吧 我不知道内置功能MAT
  • 检测文本中的信用卡号

    我正在尝试找到一种组件或方法来检测文本中不同类型的信用卡号码 我找到了很多有关验证信用卡号的信息 但我需要能够获取文本正文 例如网页并检查是否存在信用卡号 银行帐号和 或排序代码 有谁知道有一个可以帮助商业或其他方面的组件吗 具体来说 我的
  • 黑莓表视图

    这是我的应用程序 如何在下面添加表格视图或网格 我应该画所有东西吗请帮忙 这是我的代码 import net rim device api ui import net rim device api ui component import n
  • Bash 中的 if、elif、else 语句问题

    我似乎无法弄清楚以下问题是什么if声明是关于elif and then 请记住printf仍在开发中 我只是还无法在声明中对其进行测试 因此很可能是错误的 我收到的错误是 timezone string sh line 14 syntax
  • 如何在 SwiftUI 中的文本末尾添加按钮?

    我想在游戏中心设置中创建一个类似于 Apple 的 UI 其中文本末尾有一个可点击的链接 我正在使用 SwiftUI 我尝试结合Text and Button有几个方面 Form Text A social gaming service t
  • PHP - 如何在没有 API 访问令牌的情况下从 Instagram 获取图像

    我可以在没有 Instagram API 或访问令牌的情况下从 Instagram 个人资料获取图像吗 您可以获得所有图像 只需迭代它们page info 另外 还有更方便的获取json的方式 otherPage nasa profileU
  • 如何在 javascript 中实现 C# 访问修饰符?

    Summary 我尝试在 javascript 中正确实现继承和封装 就像在基于类的语言 例如 c 中一样 丑陋的部分是受保护的成员在私有实例中有多个副本 这些副本只能通过闭包访问 除了将这些成员刷新到私有实例之外我没有任何想法 如果可以的
  • 由于连接字符串不正确,连接到 Azure MySQL 服务器失败

    当尝试从 mysql 客户端连接到 Azure 中的 MySQL 服务器时 即使我使用正确的用户名和服务器名称 也会收到以下错误 我怎样才能解决这个问题 连接字符串可能不正确 请访问门户网站以获取参考 连接到 Azure Database
  • JTable:覆盖 CTRL+C 行为

    I have a JTable set on SINGLE SELECTION mode i e the user can only select one row at a time I am trying to override the
  • 在常规 Maven 构建中使用 Eclipse p2 存储库中的依赖项?

    我想在 常规 Maven 3 构建 例如 JAR 或 WAR 打包 中使用来自远程 Eclipse p2 存储库的依赖项 所有这些都无需将 p2 存储库转换为本地 Maven 存储库 这就是 osgi to maven2 和m4e 似乎可以
  • React 在状态更改后不重新渲染,如何设置子组件的状态?

    Problem 我将立法者集合放入表中 字段标题是按钮 并附加了单击事件 通过单击的字段按钮对集合进行排序 render const legislatorList this populateList creates an Array of