账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    React hooks:useEffect额外渲染如何减少
    • 2020-01-01 00:00
    • 10
    30
    0

    参考如下代码:

    const [count1,setCount1] = useState(0);
    const [count2,setCount2] = useState(0);
    
    useEffect(() => {
        if(onlyCount1IsChanged){
            doStuff(count1, count2)
        }
    },[count1, count2])

    我想要在useEffect中使用最新的count1, count2,但是我只希望监听count1的变化,才执行useEffect。如何实现?

    ps:不希望把count2存为ref,因为可能会有监听count2的useEffect:

    useEffect(() => {
        if(onlyCount2IsChanged){
            doStuff2(count2)
        }
    },[count2])
    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • 0
    • `兲倀地疚╮ 普通会员 1楼

      在React中,你可以使用useEffect钩子来处理异步操作,但是这样可能会导致额外的渲染。如果你想减少额外的渲染,你可以考虑以下方法:

      1. 使用React.memo组件:React.memo组件可以对函数进行优化,只渲染函数的前一个返回值,这样就可以避免不必要的渲染。

      ```jsx import React, { useState, useMemo } from 'react';

      function MemoizedComponent({ value }) { const [cachedValue, setCachedValue] = useState(value);

      const MemoizedFunction = useMemo(() => { return () => { setCachedValue(cachedValue); }; }, [cachedValue]);

      return (

      {cachedValue} {MemoizedFunction() &&
      Function memoized
      }
      ); }

      function App() { const [count, setCount] = useState(0);

      useEffect(() => { console.log(count); }, []);

      return (

      ); } ```

      1. 使用useRef对象:useRef对象可以用来跟踪DOM元素,这样在不需要使用元素的时候,可以将其设置为null,从而避免不必要的渲染。

      ```jsx import React, { useRef } from 'react';

      function MemoizedComponent({ value }) { const ref = useRef(null);

      const MemoizedFunction = useMemo(() => { const element = ref.current; return () => { element.current = null; }; }, []);

      return (

      {value} {MemoizedFunction() &&
      Function memoized
      }
      ); }

      function App() { const [count, setCount] = useState(0);

      useEffect(() => { console.log(count); }, []);

      return (

      ); } ```

      以上两种方法都可以有效地减少React Hooks的额外渲染。你可以根据你的具体需求选择合适的方法。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部