下面的代码(codesandbox并粘贴在此处)需要Speaker组件上的React.memo。我不明白为什么这是必要的,因为我认为memo所做的一切就是检查和查看道具是否发生了变化。对于clickCount不变的演讲者,我不明白为什么需要备忘录。
https://codesandbox.io/s/festive-herschel-ptzln?file=/pages/index.js:0-1613
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>
<span className="fa fa-star "> {speaker.clickCount}</span>
</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;发布于 2021-02-07 04:29:19
memo是一种高阶component。如果您的component renders给出了相同的props,那么您可以将其封装在对React. memo的performance boost调用中,在某些情况下,可以通过对结果执行memoizing来实现。这意味着React将跳过呈现组件,并重用上次呈现的结果。您的组件将呈现一次,在需要的地方,React将重用previous render,这将提高它的性能。
在你的例子中,你的speakers似乎没有改变,所以这里的目的是避免每次需要时Speaker组件的rendering,相反,它只会在一个地方渲染一次并缓存它,当需要它在另一个地方时它不会re-render,因为React将使用cached result。
发布于 2021-02-07 04:20:32
React.memo是一种性能优化。正如您所说的,如果请求使用相同的道具进行渲染,它将返回一个带记忆的渲染结果。
这意味着它只与经常使用相同道具渲染的组件相关,或者渲染成本较高(因为有许多或较大的子组件)。
在这种特定情况下,如果扬声器不同,除非经常呈现封闭组件,否则好处可能很小。
https://stackoverflow.com/questions/66081462
复制相似问题