Javascript 在另一个功能组件中声明React.memo是否提供了预期的记忆性能?
最近,我一直在考虑如何记忆功能组件的一些子组件,基于。这些子组件可能/可能没有使用主组件中的一些道具 让组件按如下方式编写:Javascript 在另一个功能组件中声明React.memo是否提供了预期的记忆性能?,javascript,reactjs,Javascript,Reactjs,最近,我一直在考虑如何记忆功能组件的一些子组件,基于。这些子组件可能/可能没有使用主组件中的一些道具 让组件按如下方式编写: export const main component=({a,b})=>{ const AComponent=React.memo(()=>这是{a}的字符串) 返回( 这是{b}的字符串 ) } 假设main组件在父组件的生命周期中多次重新呈现 const-App=()=>{ const[a,setA]=useState(0);//仅当按下按钮时才更新a const
export const main component=({a,b})=>{
const AComponent=React.memo(()=>这是{a}的字符串)
返回(
这是{b}的字符串
)
}
假设main组件在父组件的生命周期中多次重新呈现
const-App=()=>{
const[a,setA]=useState(0);//仅当按下按钮时才更新a
const[b,setB]=useState(0);//每1秒更新一次
constonclick=()=>setA(a=>a+1);
useffect(()=>{
const interval=setInterval(()=>setB(b=>b+11000);
return()=>clearInterval(interval);
}, []);
返回(
增量a
)
}
我理解,随着应用程序中a
和b
状态的更新,需要重新呈现,这反过来又必须重新呈现main组件,这取决于a
和b
有两个问题:
当App
中的interval
更新b
时,a
根本不更新,因此当main组件重新呈现时,是否应该使用记忆的a组件
,而不支付呈现成本
我知道当按下按钮时,App
中的a
被更新,这使得main组件
重新渲染;a组件
无法使用记忆版本,因此需要再次支付渲染成本,但之后它会被记忆,为main组件的下一次重新渲染做好准备代码>。我说的对吗?虽然在这个渲染周期中,b
没有更新,这是{b}
(未记忆)的字符串被重新渲染,并支付渲染成本
我是否正确使用React的备忘录?这些备选方案中哪一个更好?它们在功能上是否相同
反应备忘录
const AComponent=React.memo(props=>这是{props.a}的字符串)
使用备忘录
constacomponent=React.usemo(()=>这是{a}[a]的字符串)
//然后像这样使用它
返回{aComponent}
我在一个小实验中使用了备忘录,我上传了图片,也许它会有用
Title.js:
App.js:
a)在我的测试中,记忆总是更快(尽管有些博客帖子不这么说)。话虽如此,除非你有一个特别重的组件,或者这个组件有很多孩子,否则你不会看到任何明显的收益。如果您正在键入,并且由于父项的原因,输入被重新呈现,那么它还可以避免您失去焦点
b) 简而言之,它们都不起作用,React.memo
必须位于渲染函数之外,它不是维护引用的“magic”use
hook函数的一部分。您必须使用usemo
进行内部渲染。下面是一个示例:不会每秒重新渲染的组件是CComponent
和DComponent
:
const CComponent=React.memo({count})=>(
未每秒重新渲染:{count}
));
常量主组件=(道具)=>{
常量AComponent=React.memo(()=>(
当父对象执行以下操作时重新渲染:{props.count}
));
常量BComponent=React.memo({count})=>(
当父对象执行以下操作时重新呈现:{count}
));
常量DComponent=React.useMoom(()=>(
不每秒重新渲染:{props.count}
),[props.count]);
返回(
{DComponent}
父计数:{props.count}
父另一个计数器:{props.anotherCounter}
);
};
函数App(){
const[count,setCount]=React.useState(0);
常数[anotherCounter,setAnotherCounter]=React.useState(100);
React.useffect(()=>{
常数h=setInterval(()=>{
设置计数((c)=>c+1);
}, 6000);
常数h2=setInterval(()=>{
setAnotherCounter((c)=>c+1);
}, 1000);
return()=>{
净距(h);
间隙(h2);
};
}, []);
返回(
);
}
ReactDOM.render(,document.querySelector('#container')代码>
这是一个很好的尝试,但它并没有真正回答任何问题。感谢您的见解。我错误地认为React.memo
可以在功能组件的渲染中使用,但我很高兴usemo
实际上允许这样做。