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

parrent重新渲染但它的孩子不会的情况是什么?

乐宜民
2023-03-14

有人告诉我,如果父母的道具改变了,孩子们不会重新渲染,但如果父母的状态改变了。

2)应用程序渲染但独生子女渲染不孙子?

顺便说一下,我不是指如何使用Memo或pureComponent,我只是想知道React如何呈现嵌套的子级:)

import React, { useState } from "react";

const App = () => {
  const [text, setText] = useState(0);
  return (
    <div style={{ padding: "50px" }}>
      <button onClick={() => setText(text + 1)}>add</button>
      {text}
      <Child />
    </div>
  );
};

const Child = () => {
  console.log("child");
  return (
    <div>
      <Grandchild />
    </div>
  );
};

const Grandchild = () => {
  console.log("Grandchild");
  return <div>:))</div>;
};

export default App;

共有1个答案

于高雅
2023-03-14

简而言之,SFC(无状态功能组件)总是在父级重新呈现时重新呈现。

更改应用程序组件中的状态会导致重新呈现。孙子也是如此,因为它的父级(子级)已经重新呈现。

但是,如果将转换为类并使用react.purecomponent,则不会重新呈现,因为没有传入prop(没有更改prop或state)。孙子也不会重新呈现。

PureComponent进行浅层道具比较,这将避免过度的重新呈现。

顺便说一句--“有人告诉我,如果父母的道具改变了,孩子们不会重新渲染,但如果父母的状态改变了。”-那不是真的。即使父组件的状态发生变化,也可以避免子组件的重新呈现。

 类似资料:
  • 我在一个应用程序的前端原型上工作,该应用程序具有给定的JS、React和CoreUI4 React技术栈。我来自Python背景,在网络开发和我给定的技术堆栈方面没有太多经验。当我不得不开始使用钩子时,这一点变得很明显。 问题 我真的不明白为什么它不更新我的和/或不渲染。我需要一个条件渲染,我也使用。 我试图: 从我的主应用程序中传递一个更大的状态,一旦我启动条件逻辑(挂钩规则)就无法工作。 当我

  • 尽管试图避免所有记录在案的陷阱,阻止React在状态更改后重新渲染,但我仍然无法解决我的问题: } 从每个长方体组件调用update函数,并触发长方体网格上新颜色的指定。 试图避免常见的错误: 颜色数组只有在通过扩展运算符从状态复制后才被修改 通过setState()传递新数组 此外,我还处理了两个组件中函数的实例绑定 但是,尽管onClick成功触发了状态更改,但不会进行重新渲染。我在这里缺少的

  • 我对react还比较陌生,我一直在分解一个web应用程序,并用react组件替换部分。我现在正在开发一个组件,其中包含我创建的几个不同组件。 在新组件中,我在componentDidMount函数中进行API调用,并创建子组件。乍一看,一切看起来都很完美,但当我们在其中一个子组件中进行状态更改,然后在父组件中进行更改时,子组件将其状态重置为更改之前的状态。 我知道发生了什么,州政府没有被传递给家长

  • 我已经初始化了一个数组状态,当我更新它时,我的组件不会重新渲染。以下是一个最低限度的概念证明: 根据这段代码,似乎输入应该包含要开始的数字0,并且无论何时更改,状态也应该更改。在输入中输入“02”后,应用程序组件不会重新渲染。但是,如果我在5秒后执行的onChange函数中添加setTimeout,则表明数字确实已更新。 对为什么组件不更新有什么想法吗? 这是一个带有概念证明的代码沙盒。

  • 问题内容: 我有一个外部组件(可观察到的对象),我想听其变化。当对象被更新时,它会发出更改事件,然后我想在检测到任何更改时重新呈现该组件。 对于顶层,这是可能的,但是在组件内不起作用(这是有道理的,因为该方法仅返回一个对象)。 这是一个代码示例: 在内部单击该按钮会调用,但这实际上并不是导致渲染发生的原因(您可以看到它在起作用,因为由创建的文本不会更改)。但是,如果我只是打电话而不是,它就可以正常

  • 有一个案例我很困惑。 我有一个对象redux状态:{show:true,creative:{name:'a',tags:[t1,t2,t3]}。此对象已通过“react redux”的“connect”功能映射到道具。 当我改变属性“显示”或“creative.name”时,它确实会触发重新渲染。但是如果我将t0追加到"creative.tags",它就不会运行re-渲染。 我必须分配一个新变量来