首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我不明白为什么在这个扬声器组件上需要React.memo来避免额外的呈现

我不明白为什么在这个扬声器组件上需要React.memo来避免额外的呈现
EN

Stack Overflow用户
提问于 2021-02-07 04:12:11
回答 2查看 127关注 0票数 1

下面的代码(codesandbox并粘贴在此处)需要Speaker组件上的React.memo。我不明白为什么这是必要的,因为我认为memo所做的一切就是检查和查看道具是否发生了变化。对于clickCount不变的演讲者,我不明白为什么需要备忘录。

https://codesandbox.io/s/festive-herschel-ptzln?file=/pages/index.js:0-1613

代码语言:javascript
复制
import React, { useState, memo, useCallback } from 'react';

const Speaker = memo(({ speaker, speakerClick }) => {
  console.log(speaker.id);
  return (
    <div className="speaker-col">
      <span
        onClick={() => {
          speakerClick(speaker.id);
        }}
      >
        {speaker.id} {speaker.name}
      </span>
      &nbsp;&nbsp;
      <span className="fa fa-star ">&nbsp;&nbsp;{speaker.clickCount}</span>
      &nbsp;
    </div>
  );
});

function SpeakerList({ speakers, setSpeakers }) {

  const speakerClick = useCallback(
    (id) => {
      // passing a callback avoid using a stale object reference
      setSpeakers((speakers) => {
        return speakers.map((speaker) => {
          return speaker.id === id
            ? { ...speaker, clickCount: speaker.clickCount + 1 }
            : speaker;
        });
      });
    },
    [setSpeakers], // you can add setSpeakers as dependency since no change
  );

  return (
    <div>
      {speakers.map((speaker) => {
        return (
          <Speaker
            speaker={speaker}
            speakerClick={speakerClick}
            key={speaker.id}
          />
        );
      })}
    </div>
  );
}

//
const App = () => {
  const speakersArray = [
    { id: 1124, name: 'aaa', clickCount: 0 },
    { id: 1530, name: 'bbb', clickCount: 0 },
    { id: 10803, name: 'ccc', clickCount: 0 },
  ];

  const [speakers, setSpeakers] = useState(speakersArray);

  return (
    <div className="speakers-list">
      <h1>Speaker List</h1>
      <SpeakerList
        speakers={speakers}
        setSpeakers={setSpeakers}
      />
    </div>
  );
};

export default App;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-07 04:29:19

memo是一种高阶component。如果您的component renders给出了相同的props,那么您可以将其封装在对React. memoperformance boost调用中,在某些情况下,可以通过对结果执行memoizing来实现。这意味着React将跳过呈现组件,并重用上次呈现的结果。您的组件将呈现一次,在需要的地方,React将重用previous render,这将提高它的性能。

在你的例子中,你的speakers似乎没有改变,所以这里的目的是避免每次需要时Speaker组件的rendering,相反,它只会在一个地方渲染一次并缓存它,当需要它在另一个地方时它不会re-render,因为React将使用cached result

票数 2
EN

Stack Overflow用户

发布于 2021-02-07 04:20:32

React.memo是一种性能优化。正如您所说的,如果请求使用相同的道具进行渲染,它将返回一个带记忆的渲染结果。

这意味着它只与经常使用相同道具渲染的组件相关,或者渲染成本较高(因为有许多或较大的子组件)。

在这种特定情况下,如果扬声器不同,除非经常呈现封闭组件,否则好处可能很小。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66081462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档