使用 React 进行变更检测

2024-03-09

我正在研究更改检测机制,并且在reactjs案例中遇到了一些麻烦。

当反应组件中的 props 发生变化时,该组件将被“重新渲染”(由于 diff 算法的原因,这并不完全正确,但想法就在这里)。

我知道当某物发生这种情况时,React 会浏览其内部虚拟 DOM 以检查新值是否与前一个值相同,并根据需要重新渲染其真实组件树。

我的问题是:这是什么某物.

例如,使用 Angular 2,我们有 zone.js 可以捕获异步内容(按钮单击、setTimeout 等...)并触发变化检测。

但目前,我根本不知道它是由reactjs触发的。

你能帮助我吗 ?


尝试想象这里有两件事:

  • 组件(COMPONENT)本身,以及
  • 组件外部的事物(OUTSIDE):

COMPONENT 内部的更改

您需要调用 this.setState(),这将更新状态inside当前组件,随后触发该组件的更新(自动调用 render())

来自外部的改变

这将触发该组件的 props/newProps 被更新,随后您的组件通过在组件内部调用 this.setState() 来更新(componentWillReceiveProps 是 React 的生命周期方法)

class MyComponent extends React.Component {
  // initially how the state is set to MyComponent
  constructor(props) {
    super(props);
    this.state = {name: this.props.name};
  }

  // own method to be called inside MyComponent
  updateName(e) {
    const newName = e.target.value;
    if (this.state.name !== newName) {
      this.setState({name:newName});
    }
  }

  // changes from the outside
  componentWillReceiveProps(nextProps) {
    const newName = nextProps.name;
    if (this.state.name !== newName) {
      this.setState({name:newName});
    }
  }

  render() {
    return(
      <div>
        {this.state.name}
        <input type="text" 
               onChange={this.updateName.bind(this)} 
               value={this.state.name} />
      </div>
    )
  }
}

值得指出的是,this.setState()会自动触发render(),而this.state.name = 'Bob'不会触发render()。

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

使用 React 进行变更检测 的相关文章

随机推荐

  • 我们可以将TFS 2015直接迁移到Azure DevOps吗?

    我计划转向 Azure DevOps 目前我们内部有 TFS2015 根据这篇文章 我们必须先迁移到 TFS 2018 然后才能迁移到 Azure DevOps 我们不能从 TFS 2015 迁移到 Azure DevOps 吗 根据本文
  • 依赖注入和命名记录器

    我有兴趣了解更多有关人们如何使用依赖注入平台注入日志记录的信息 尽管下面的链接和我的示例引用了 log4net 和 Unity 但我不一定会使用其中任何一个 对于依赖注入 IOC 我可能会使用 MEF 因为这是项目 大型 其余部分所采用的标
  • ValueError:无效端点:https://s3..amazonaws.com

    当 EMR 机器尝试运行包含 boto3 初始化的步骤时 有时会出现以下错误 ValueError Invalid endpoint https s3 amazonaws com当我尝试设置一台新机器时 它突然可以工作了 附上完整错误 se
  • 不兼容的库版本:imagick.so 需要版本 18.0.0 或更高版本,但 libfreetype.6.dylib 在第 0 行的 Unknown 中提供版本 16.0.0

    我成功安装了 imagemagic 和 imagick 使用http www php net manual en imagick installation php 94169 http www php net manual en imagi
  • to_json 在 Rails 中返回字符串而不是 json

    下面的代码应该返回一个 json series series map do serie name gt serie name id gt serie id series to json 其返回结果如下 name Barra id 3 nam
  • 什么是可以检测手写的好的 OCR? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我需要一个库 可以在扫描手写纸后从其中提取文本 正常拉丁文本 它可以是一个免费的解决方案 甚至是我必须付费的解决方案 只要它可以处理大写字
  • READ_PRIVILEGED_PHONE_STATE 权限错误

    我创建了一个应用程序来监控呼叫 传入和传出 并且在电话响铃期间 它会显示有关号码的详细信息 来电一切正常 但是当用户拨打电话时 应用程序崩溃并出现以下错误 05 14 23 14 36 376 1427 1475 W BroadcastQu
  • F#:检测正则表达式模式中的错误

    我是编程新手 F 是我的第一个 NET 语言 作为初学者的项目 我想编写一个应用程序 要求用户输入正则表达式模式 然后标记任何错误 我已经浏览了 MSDN 上的 Regex API 但似乎没有任何方法可以自动检测正则表达式模式中的任何错误
  • 如何进行这种图像转换?

    我有一个带有模糊边缘的彩色斑点的图像 上半部分 我想为其创建一个由直线组成的轮廓 下半部分 填充形状没有问题 只需添加轮廓即可 如有必要 可以将其转换为黑白图像 谁能指出一个可以做到这一点的简单转换 程序 最好是我可以轻松找到代码示例的东西
  • 如何获取与正则表达式匹配的片段的行号?

    如何才能获得行号匹配给定的所有文本片段regexp 在一个文件内 file content f read m re compile regexp How to extract line numbers of the matched text
  • 如何使用 Django 和 UTF-8 内容类型作为模板?

    当我做 return render to response 在姜戈 如何将内容类型设置为 UTF 8 那么显示的所有内容都是 UTF 8 吗 django 使用 UTF 8 作为默认编码 但这可以通过 settings DEFAULT CH
  • Angular 2 动态双向绑定

    我正在尝试构建一个动态附加另一个组件的组件 作为一个例子 这是我的父类 import Component ComponentRef ViewChild ViewContainerRef ComponentFactoryResolver fr
  • 需要使用 Node.js 进行 SysLog 的建议

    我刚刚 npm install node syslog 但它不起作用 我有一个系统日志服务器 IP 地址和 local0 我正在寻找一个系统日志模块来帮助我将消息发布到系统日志 但我不知道我应该使用哪一个 请给我一些建议 谢谢 哦 如果有一
  • 如何防止Ktor客户端对url参数进行编码?

    我正在尝试使用 kotlin 创建一个 Android 应用程序 这个应用程序需要有一个迷你下载管理器 因为我需要下载从 100MB 到 8GB 的 文件 并且当服务器支持暂停时 用户可以稍后暂停和恢复下载 搜索我发现了Ktor 库并阅读文
  • 如何让 Unirest(java) 忽略证书错误

    我正在使用 Unirest java 版本 发出 GET 和 POST 请求 但是在访问 SSL 加密站点时遇到问题 因为我的程序位于公司网络后面 并且网络管理员为我设置了防火墙映射 例如foobar com被映射到56 1 89 12 4
  • 在php中获取远程图像的图像类型

    使用预构建的系统来抓取远程图像并将其保存到服务器上 目前 没有检查图像是否确实存在于该远程位置 并且它具有某种文件类型 jpg jpeg gif 我的任务是执行这两项操作 我认为这非常简单 因为我只需使用一个简单的正则表达式和 getima
  • 如何访问静态 Web 方法内的页面控件? [复制]

    这个问题在这里已经有答案了 我已经使用 jQuery 使用静态调用了代码隐藏方法WebMethod method 该 Web 方法调用成功 但当尝试访问文本框控件时出现错误 非静态字段 方法或属性需要对象引用 WebMethod publi
  • Django:动态构造 {% include %} 标签的值?

    我想用一个 include page html 在我的 Django 模板中标记 并构造值page html动态地 在 Django 中有什么方法可以做到这一点吗 这是一个伪代码示例 include page mode html Thank
  • 如何将 jar、源代码和 Javadoc 添加到本地 Maven 存储库?

    我想添加最新版本的 JGoodies Forms 1 5 0 作为依赖项 但我在主存储库中找不到比 1 0 5 更新的任何内容 所以如果我理解正确 我可以做的下一个最好的事情要做的就是将其添加到我的本地存储库中 当我从网站下载它时 我得到一
  • 使用 React 进行变更检测

    我正在研究更改检测机制 并且在reactjs案例中遇到了一些麻烦 当反应组件中的 props 发生变化时 该组件将被 重新渲染 由于 diff 算法的原因 这并不完全正确 但想法就在这里 我知道当某物发生这种情况时 React 会浏览其内部