react函数式组件及hooks的认识

主题:react函数式组件

1、state和useState

更新state会引起该组件更新,如果state绑定视图,而没有其他处理,会引起子组件更新,造成不必要的渲染

2、useMemo

使用useMemo把跟state更新不相关的返回值缓存起来

3、useRef

使用useRef可以缓存组件更新前的值

const ref = useRef(1);
<div
        className={style.upload}
        onClick={() => {
          console.log(ref.current++);
        }}
>
      ...
</div>

比如使用ref.current储存setTimeout、 setInterval的ID值,以后可以被clear掉。

4、useEffect和useLayoutEffect

前者是在页面渲染后执行副作用,后者实在页面渲染前执行副作用。
大多数情况下使用useEffect,也就是说在页面渲染后再执行副作用就不会造成页面卡顿。
如果需要在副作用中执行DOM操作,并且会影响DOM,则使用useLayoutEffect,就不用引起闪动。
否则在useEffect中操作DOM,页面渲染后会再次改变DOM从而引起页面闪动。

5、useCallback(fn, deps) 相当于 useMemo(() => fn, deps)
6、用useImperativeHandle、forwardRef、createRef调用组件中方法
//使用forwardRef包装子组件Title
export const Title = forwardRef((props, ref) => {
  const test = () => {
    console.log('test');
  };
  //使用useImperativeHandle对外暴露自身的test方法,可对该方法对外自定义名称如update
  useImperativeHandle(
    ref,
    () => ({
      update: () => {
        test();
      },
    }),
    [],
  );
  return (
    <div className={style.title}>
    </div>
  );
});

//父组件调用
export default function HotLabel(props) {
//使用createRef获取子组件Title相关属性
  let ref = createRef();
  useEffect(() => {
  //可以获取到子组件Title对外暴露的update方法并执行
    ref.current.update();
  });
  return useMemo(() => {
    return (
        <Title label={label} ref={ref}></Title>
    );
  }, []);
}

相当于vue的ref获取子组件实例,react的hook更清晰,指定函数式组件内某些方法或数据可对外暴露,方便维护

7、总结

(1)函数式组件都要对影响dom渲染的变量进行useState来创建
(2)对不影响dom渲染的变量进行useRef来创建
(3)对函数进行useCallback来创建
(4)对dom进行useMemo来创建
因为这些hooks会根据deps的变化来决定hooks的变量、函数、渲染的dom等是否重新执行。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

luxiaopengyou

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

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

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

打赏作者

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

抵扣说明:

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

余额充值