useCallback、useMemo、memo用法和区别

memo

当父组件发生改变时,子组件不需要改变(没有依赖父组件的函数和值)时想要父组件不刷新子组件不刷新

const Parent = () => {
		const [num,setBum] = useState(0)
		return (
			<View>
				<Button onClick={()=> setNum(num+1)} >
				<Child />
			</View>
		)
	}
	
	const Child = memo(() => {
		console.log('child load')
		return (
			<View>child text</View>
		)
	})


useCallback

缓存函数,在特定变量改变时才执行函数,如果父组件传了一个函数给子组件,而不希望子组件更新可以用useCallback

const clickBtn = useCallback(() => {
			setNum(num+1)
		},[依赖]) 

const Parent = () => {
		const [num,setBum] = useState(0)
		
		const clickBtn = useCallback(() => {
			setNum(num+1)
		},[]) //[]可选填依赖项,不填里面的num是不会更新的,永远都是0
		
		return (
			<View>
				<Button onClick={clickBtn} >
				<Child call={clickBtn} />
			</View>
		)
	}
	
	const Child = memo((call) => {
		console.log('child load')
		return (
			<View onClick={call}>child text</View>
		)
	})



useMemo

useMemo传入两个参数,回调函数(需要有返回值) 和依赖参数
类似计算属性,可以对返回值进行操作,只有依赖改变时才会执行,如果当子组件用了memo时父组件向子组件传值但是又不希望子组件改变可以配合useMemo使用

export const Child = memo(
  (props: { userInfo: { name: string; age: number } }) => {
    const { userInfo } = props;
    console.log("渲染了", userInfo);
    return (
      <>
        <div>名字: {userInfo.name}</div>
        <div>年龄:{userInfo.age}</div>
      </>
    );
  }
);


export const Parent = () => {
  const [count, setCount] = useState(0);
  // const [userInfo, setUserInfo] = useState({ name: "小明", age: 18 });
  const increment = () => setCount(count + 1);
  const userInfo = useMemo(() => ({ name: "小明", age: 18 }), []);

  return (
    <div>
      <button onClick={increment}>点击次数:{count}</button>
      <Child userInfo={userInfo} />
    </div>
  );
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万事胜意sy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值