赞
踩
import { useState} from "react";
const Child = () => {
console.log("我是子组件", "渲染了");
return <div>我是子组件</div>;
};
export const Parent = () => {
const [count, setCount] = useState(0);
const increment = () => setCount(count + 1);
return (
<div>
<button onClick={increment}>点击次数:{count}</button>
<Child />
</div>
);
};
每点击一次,子组件的useState、props和context都没有改变,但是每点击一次子组件都会重新渲染
解决办法:将memo函数包裹子组件
import { memo } from "react";
const Child = memo(() => {
console.log("我是子组件", "渲染了");
return <div>我是子组件</div>;
});
import { useState,memo } from "react";
const Child = memo((props: { name: string; onClick: Function }) => {
const { name, onClick } = props;
console.log("我是子组件", "渲染了");
return (
<>
<div>我是子组件=》{name}</div>
<button onClick={() => onClick("修改父组件传过来的参数")}>改变 name 值</button>
</>
);
});
export const Parent = () => {
const [count, setCount] = useState(0);
const [name, setName] = useState("向子组件传递参数");
const increment = () => setCount(count + 1);
const onClick = (name: string) => {
setName(name);
};
return (
<div>
<button onClick={increment}>点击次数:{count}</button>
<Child name={name} onClick={onClick} />
</div>
);
};
每点击一次父组件的按钮,子组件都会重新渲染;
原因:
[基本数据类型](https://blog.csdn.net/m0_61049675/article/details/135815841),子组件将不会重新渲染。解决办法:修改父组件的 onClick 方法,用 useCallback 钩子函数包裹一层。
注意: 如果直接使用useState解构的setName传给子组件, 子组件将不会重复渲染,即使用<Child name={name} setName={setName} />:
const onClick = useCallback((name: string) => {
setName(name);
}, []);
import { useState,memo } from "react";
const Child = memo((props: { userInfo: { name: string; age: number } }) => {
const { userInfo} = props;
console.log("我是子组件", "渲染了");
return (
<>
<div>我是子组件=》{userInfo}</div>
<button>改变 name 值</button>
</>
);
});
export const Parent = () => {
const [count, setCount] = useState(0);
const userInfo = ({ name: "小明", age: 18 });
const increment = () => setCount(count + 1);
return (
<div>
<button onClick={increment}>点击次数:{count}</button>
<Child userInfo={userInfo}/>
</div>
);
};
每点击一次父组件的按钮,子组件都会重新渲染;
原因:
const [userInfo, setUserInfo] = useState({ name: "小明", age: 18 });。const userInfo = useMemo(() => ({ name: "小明", age: 18 }), []);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。