当前位置: 首页 > 知识库问答 >
问题:

即使组件的属性或状态没有更改,也会调用React-shouldComponentUpdate()

胡致远
2023-03-14

我在React组件中添加了生命周期方法

  shouldComponentUpdate(nextProps, nextState) {
    console.log(nextProps, nextState);
    console.log(this.props, this.state);

    return false;  
  },

我的问题是,即使nextProps和nextState与当前props和状态完全相同,也会在组件上调用此方法。当我比较nextProps和this.props的console.log语句时,它们完全相同。国家也是如此。

那么为什么应该调用ComponentUpdate呢?

每当我更改父组件的状态时,就会调用它。但是没有任何道具或状态在实际组件上发生变化。那么为什么叫它呢?

顺便说一句,我正在用流星反应

进一步澄清:

我想知道为什么要首先调用函数shouldComponentUpdate。该组件的状态或支柱均未更改。但父组件的状态正在更改。

共有3个答案

郎志
2023-03-14

每次调用shouldComponentUpdate()

  • 每次重新渲染父组件时,都会更新道具。这包括使用完全相同的道具值进行重新渲染的所有场景

有时,允许重新渲染循环进行可能很有用,即使新值与旧值完全相同。例如,当您的组件通过道具接收到用户ID(可能未更改),并从某处获取新消息并将其置于状态时。

另外,“shoulldcomponentupdate()”,作为一种单独的检查更改的方法,只有在发生更改时才进行更新,这使得代码具有良好的可维护性:

  • 制作没有shouldComponentUpdate()的第一个版本,并确保相同的道具集和状态导致呈现相同的结果
  • 添加并调试shouldComponentUpdate()

调试接受输入(状态和道具)并呈现输出的“状态机”相对容易。调试管理状态更改的机器要困难得多。

齐献
2023-03-14

React自动调用shouldComponentUpdate,它在重新渲染过程开始之前触发(在父组件的情况下)所以很自然,它经常被调用。

此函数的默认实现返回true,因此要停止重新渲染,需要在此处返回false:

  shouldComponentUpdate(nextProps, nextState) {
    console.log(nextProps, nextState);
    console.log(this.props, this.state);

    return false;  
  }

高级关注点,反应页面

因此,总之,React通过允许用户使用shouldComponentUpdate缩短进程,避免执行协调DOM子树所需的昂贵DOM操作,

贺俊楚
2023-03-14

应该组件更新的目的是指示是否应该调用渲染。在您的案例中,某个父组件已经呈现,并表示它还希望呈现您的子组件的实例。

shouldComponentUpdate是您缩短渲染时间并说“不要麻烦,这里没有任何更改”的机会。

现在,关于你的问题,“既然什么都没变,为什么还要叫它”?React不会比较新旧道具本身。你可以得到一个混合代码来为你做这件事,(即。PureRenderMixin),但是默认情况下React只允许渲染运行。

React不做比较的原因有两个。首先,与分析道具和状态相比,跳过渲染的性能节省可能微不足道。由于React的渲染机制已经过优化,以避免不必要的DOM操作,因此它可以假定组件需要更新并期望合理的性能。其次,进行比较并不完全是直截了当的。你的道具是原始的吗?,一成不变的?,数组?,一个复杂的物体?,有必要进行深入的比较吗?

React的模型是“默认情况下,我们将呈现所有要求的内容。如果您希望某些内容不符合性能要求,请继续并通过实现shouldComponentUpdate”告诉我们。

 类似资料:
  • 问题内容: 我有两个组件: 父组件 ,我想从中更改子组件的状态: 和 子组件 : 我需要从父组件更改子组件的 打开 状态,还是单击父组件中的按钮时从父组件调用子组件的 toggleMenu() ? 问题答案: 状态应在父组件中进行管理。您可以通过添加属性将值传输到子组件。

  • 问题内容: 我还没有找到明确的答案,希望这不是重复的。 我正在使用React + Redux作为一个简单的聊天应用程序。该应用程序由InputBar,MessageList和Container组件组成。容器(如您想象的那样)包装了其他两个组件,并连接到商店。我的消息状态以及当前消息(用户当前正在键入的消息)都保存在Redux存储中。简化结构: 更新当前消息时出现我遇到的问题。更新当前消息会触发一个

  • 它几乎添加了一个对象,该对象包含来自主窗体的子窗体的值。 这是我用作按钮的函数的函数。 这将一个新对象添加到一个名为的状态,该状态是一个对象数组。 提前谢了。

  • 我们有JPA hibernate的spring boot项目。设置非常普通-rest controller-Service-Repository。有一个返回类型为实体的特定endpoint。该服务从db获取实体,进行一些计算,然后将其返回给客户端。问题是,一旦服务调用返回,就会在后端的这个实体上触发一个更新查询。任何实体属性都不会更改。Repository.save()也未被调用,但更新查询仍在进

  • 我试图使用React Hooks来管理一个简单的文本输入字段和提交输入按钮的状态。输入字段不断验证(现在只是检查长度 我已将参数扩展为setMuffinSettings,以显式返回一个对象,并已确认此返回对象的顺序为:true。因此,问题与setMuffinSettings本身有关,而不是传递给setMuffinSettings的对象不正确。 我还研究了另外两个与React挂钩(特别是挂钩)和“落

  • 问题内容: 所以,我有多个ReactComponent。最初,我以为会有一个带有其自身状态的父组件(简称为GrandPa),它将有关其状态的一些信息传递给另一个组件(称为Parent)。同样,父母将他的一些财产传给孩子,孩子则传给孙子。因此,我们具有层次结构: 爷爷->父母->孩子->孙子 但是,我很快意识到,当我使用method 更改GrandPa的状态时,所做的更改不会沿通道向下级联。我意识到