当前位置: 首页 > 面试题库 >

您是否可以在不调用setState的情况下强制React组件重新渲染?

孔阳炎
2023-03-14
问题内容

我有一个外部组件(可观察到的对象),我想听其变化。当对象被更新时,它会发出更改事件,然后我想在检测到任何更改时重新呈现该组件。

对于顶层,React.render这是可能的,但是在组件内不起作用(这是有道理的,因为该render方法仅返回一个对象)。

这是一个代码示例:

export default class MyComponent extends React.Component {

  handleButtonClick() {
    this.render();
  }

  render() {
    return (
      <div>
        {Math.random()}
        <button onClick={this.handleButtonClick.bind(this)}>
          Click me
        </button>
      </div>
    )
  }
}

在内部单击该按钮会调用this.render(),但这实际上并不是导致渲染发生的原因(您可以看到它在起作用,因为由创建的文本{Math.random()}不会更改)。但是,如果我只是打电话this.setState()而不是this.render(),它就可以正常工作。

所以我想我的问题是: React组件 是否需要 具有状态才能重新渲染?有没有一种方法可以在不更改状态的情况下强制组件按需更新?


问题答案:

在组件中,您可以调用this.forceUpdate()强制重新渲染。

文档:https : //facebook.github.io/react/docs/component-
api.html



 类似资料:
  • 在使用useState和useReducer钩子时,我意识到一个问题,即更新状态函数(setState,dispatch)之后的任何代码行都将在下一次重新呈现时被调用(更新之前的状态)。这意味着更新状态函数会导致立即重新渲染,而不是等待整个函数执行。 上述代码将按以下顺序记录: 步骤0 组件正在重新渲染... true 步骤1 步骤2真 有人给我解释更新状态挂钩的工作流程吗?先谢谢你。

  • 问题内容: 我喜欢javascript,所以当我听说基于V8的Javascript运行时Node.js时,我感到非常兴奋。我更喜欢用Javascript编写外壳脚本。我的问题是:如何在不调用的情况下运行脚本?在我编写完脚本之后,它会尝试作为bash脚本而不是Node.js javascript运行。 问题答案: 使您当前的外壳开始bash的原因是您当前的外壳(bash?)不知道如何处理file.j

  • 问题内容: 考虑下面的钩子示例 基本上,我们使用this.forceUpdate()方法强制组件在React类组件中立即重新呈现,如以下示例所示 但是我的查询是如何强制上述功能组件立即使用挂钩重新渲染? 问题答案: 可以使用或进行,因为在内部使用: 不打算在正常情况下使用,仅在测试或其他出色情况下使用。可以以更常规的方式解决这种情况。 是使用不当的例子,是异步的性能,而且不应该被强迫只是因为状态更

  • 问题内容: 我正在努力了解如何在更高阶的组件中正确实现此验证行为。 ========================================== 编辑:TLDR:感谢用户@ noa-dev的出色建议,我在这里创建了一个React Fiddle:https://jsfiddle.net/8nLumb74/1/ 以显示问题。 我究竟做错了什么? 文本框组件: 验证器组件: 父表单组件: 问题答

  • 问题内容: 想象这样的情况: 现在,我从理论上担心,在哪里克隆状态(中的第四条语句),可能会发生我没有获得该状态的最新版本的情况- 由于先前调用的某些调用正在等待中,这是否是正确的假设? 现在,我的问题是,如果我以以下方式(基本上与回调参数一起使用)重写上述代码,它会更安全吗?(就不处于不同步状态而言)。 我是否还需要在内部采取一些其他措施(第二个重写版本)? ps。只是更改状态的函数-假设当用户

  • 问题内容: 如果要使用Linq-SQL,还必须将DB Table拖到设计器表面以创建实体类。 我一直喜欢我的应用程序中的完全控制权,并且不喜欢dotnet创建的类。 是否可以使用我自己的数据访问层实体类在Linq和DB之间提供此连接? 我该如何完成? 问题答案: 您可以使用Linq-to-SQL非常轻松地编写自己的类-只需使用一些属性绘制类即可。 例如,这是我的一个项目中有一个非常简单的表,它可以