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

如果状态不变,无状态组件会重新渲染吗?

江向阳
2023-03-14
问题内容

我从React中学到的一件事是,如果组件的属性不变,那么React不会重新渲染组件。无状态组件也是如此吗?还是它们的行为更像“愚蠢的”函数,并且每次都会执行?

例如,如果我有:

import StatelessComponent from '../StatelessComponent';

export default class DocumentsTable extends React.Component {
  state = {
    something: 'foobar',
  };

  render() {
    return (
      <div>
        { this.state.something }
        <StatelessComponent theOnlyProp='baz'>
      </div>
    )
  }
};

this.state.something更新其价值,并<StatelessComponent>获取重新渲染?还是像其他React组件一样足够“聪明”地看到其道具没有改变?


问题答案:

更新25.10.2018

从React 16.6开始,您可以将React.memo用于功能组件以防止重新渲染,类似于PureComponent用于类组件:

const MyComponent = React.memo((props) => {
  return (
    /* markup */
  );
});

另外,备忘会进行内部优化。

与userland memo()高阶组件实现不同,React内置的实现可以通过避免额外的组件层来提高效率。块引用

老答案

是的, 如果setState()组件本身或它的父组件之一被调用 ,它们总是会重新渲染 1
(除非您如上所述使用React.memo)
,因为功能性无状态组件不带有shouldComponentUpdate。实际上,除非实现,否则每个React组件都将被重新渲染1shouldComponentUpdate

需要注意的重要一点是, 调用 render() 并不意味着以任何方式操纵DOM节点
。该render方法仅用于diff算法来确定需要真正附加/分离的DOM节点。
请注意,这 render() 并不昂贵,而是DOM操作很昂贵 。仅在render()返回不同的虚拟树时才执行它们。

从React的文档中

需要明确的是,在这种情况下,重新渲染意味着为所有组件调用render,但这并不意味着React会卸载并重新安装它们。它将仅按照前几节中所述的规则应用差异。

只是不用担心,render()除非您的组件很大,否则请调用它,然后最好使用有状态Component实现shouldComponentUpdate()

看看这里的一个有趣的讨论。

1表示render()调用了组件的功能,而不是底层的DOM节点正在被操纵。



 类似资料:
  • 我有一个基于url的react组件,它应该导入一些数据,然后在另一个子组件中显示。当页面首次加载时,它将初始数据作为组件状态加载到中。至于进一步的url更改,它们将在export default class Info()中处理。组成部分{ 我的问题是,尽管switch语句中有状态更新,但组件不会重新渲染。我不知道我的方法有什么问题。有人能帮我吗?谢谢 编辑:这是使用而不是的代码:

  • 我有一个带有两组按钮(功能和目标)的界面。当我点击一个按钮时,我希望它从一个团队转到另一个团队。我正在用react和redux实现这一点。我唯一的问题是,当状态更新并且我成功地记录了更新的状态时,除非我使用forceUpdate(),否则组件不会更新。我不明白的是,既然状态更新成功,组件不应该自动重新渲染吗? 一些js 正如您所看到的,当我单击一个按钮时,我触发updateLists函数,该函数将

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

  • 我正在学习如何应对,我整天都在试图找到解决问题的办法,但都没有成功。然后决定在这里提出我的第一个问题。 我有子组件,包括React-Datepicker组件和单独的“第二天”和“前一天”按钮来更改选定的日期。 SelectedDate存储在父组件的状态中。 我试图从子组件更新父组件的状态,当状态更新时,子组件应该重新呈现,因为该状态作为道具传递给同一个子组件。 我已设法从child更改父状态,但子

  • 我是reactjs的新手,我不知道如何从父组件中更改子组件的状态。下面是代码 每当对父组件中的执行时,我希望子组件接收。 有什么建议吗?

  • 我正在用反应原生构建一个项目。我有一个动态的玩家列表,我希望用户能够编辑。 我想实现的是: 用户输入名称 用户按enter键 我们称之为addPlayer,它添加一个播放器 新的输入出现并得到关注(通过其他功能) 我得到的是: < li >用户输入姓名 < li >用户按enter键 < li >我们调用addPlayer来添加播放器 < li >键盘开始关闭一会儿,然后在新输入出现时重新打开。