每次我的选项卡组件父级重新渲染时,我的子组件也会重新渲染。
我的选项卡组件父级如下:
我的选项卡组件代码
每次渲染,我都会打印一次 "parent render" 和三次 "child render"。
当父组件状态改变时,组件属性不会发生变化,因此我认为可以使用 React.memo 跳过组件的重新渲染,并进行了以下更改:
我的父组件:
我的选项卡组件父级如下:
import { useState } from "react";
import "./styles.scss";
import Tab from "./tab";
export default function App() {
const [selectTab, setSelectTab] = useState("a");
console.log("parent render");
return (
<div className="App">
<div className="tab-list">
<Tab tab={"a"} title={"First Title"} setSelectTab={setSelectTab} />
<Tab tab={"b"} title={"Second Title"} setSelectTab={setSelectTab} />
<Tab tab={"c"} title={"Third Title"} setSelectTab={setSelectTab}
/>
</div>
{selectTab === "a" && <div>this is a</div>}
{selectTab === "b" && <div>this is b</div>}
{selectTab === "c" && <div>this is c</div>}
</div>
);
}
我的选项卡组件代码
const Tab = ({ title, tab, setSelectTab }) => {
console.log("child render");
const handleClick = (tab) => {
setSelectTab(tab);
}
return <p onClick={() => handleClick(tab)}>{title}</p>;
};
export default Tab;
每次渲染,我都会打印一次 "parent render" 和三次 "child render"。
当父组件状态改变时,组件属性不会发生变化,因此我认为可以使用 React.memo 跳过组件的重新渲染,并进行了以下更改:
我的父组件:
import { useState } from "react";
import "./styles.scss";
import MemoizedTab from "./tab";
export default function App() {
const [selectTab, setSelectTab] = useState("a");
console.log("parent render");
return (
<div className="App">
<div className="tab-list">
<MemoizedTab
tab={"a"}
title={"First Title"}
setSelectTab={setSelectTab}
/>
<MemoizedTab
tab={"b"}
title={"Second Title"}
setSelectTab={setSelectTab}
/>
<MemoizedTab
tab={"c"}
title={"Third Title"}
setSelectTab={setSelectTab}
/>
</div>
{selectTab === "a" && <div>this is a</div>}
{selectTab === "b" && <div>this is b</div>}
{selectTab === "c" && <div>this is c</div>}
</div>
);
}
我的记忆化选项卡组件代码
import React, { useCallback } from "react";
const Tab = ({ title, tab, setSelectTab }) => {
console.log("child render");
const handleClick = useCallback(
(tab) => {
setSelectTab(tab);
},
[setSelectTab]
);
return <p onClick={() => handleClick(tab)}>{title}</p>;
};
export default Tab;
export const MemoizedTab = React.memo(Tab);
但是我和我的非缓存代码一样记录控制台日志。是什么导致选项卡组件重新渲染,如何停止不必要的重新渲染?
我怀疑可能是来自父级的setSelectTab
函数在每次重新渲染时都是一个新的函数,这导致组件重新渲染,尽管使用了useCallback
。