父子组件都使用memo,兄组件切换显示,弟组件重新渲染,memo为啥失效?
父组件:
<div className={'myScreenDetail'}>
{isView && <ImageView imgUrl={imgSrc} setIsView={setIsView} />}
<ImgShow />
</div>
子组件:
<ImgShow />
useEffect(() => {
console.log('渲染了');
}, []);
父组件和子组件都是用了memo:,切换isView,理应ImgShow组件不重新渲染,但是isView切换,都会打印“渲染了”,memo感觉失效了,这是为什么啊?求大佬指教
回复
1个回答
test
2024-06-25
请把 App 组件内部定义的其他组件全部提取出去 单独定义,因为 app更新 这些函数都会重新定义
import "./styles.css";
import { memo, useEffect, useState } from "react";
export default function App() {
const [isView, setIsView] = useState(false);
useEffect(() => {
console.log("渲染1");
});
return (
<div className="App">
<ImgShow setIsView={setIsView} isView={isView}/>
</div>
);
}
const Test = memo(() => {
useEffect(() => {
console.log("渲染2");
});
return <div>测试1111111</div>;
});
const ImgShow = memo(({setIsView , isView}) => {
useEffect(() => {
console.log("渲染3");
});
return (
<div>
<div
style={{
width: "100px",
height: "100px",
backgroundColor: "red"
}}
onClick={() => {
setIsView(!isView);
console.log(5555555, isView);
}}
></div>
<Test />
</div>
);
});
回复
适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容