日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

react組件memo?useMemo?useCallback使用區別示例_React

作者:SODA_HA ? 更新時間: 2022-09-17 編程語言

正文

memo用來優化函數組件的重復渲染行為,針對的是一個組件

useMemo返回一個memoized的值

本質都是用同樣的算法來判定依賴是否發生改變,繼而決定是否觸發memo或者useMemo中的邏輯,利用memo就可以避免不必要的重復計算,減少資源浪費

useCallback返回一個memoized的函數

useMemo和useCallback都接收兩個參數,第一個參數為fn,第二個參數為[],數組中是變化依賴的參數 memo則可以直接作用于組件,例如

    export default memo(Mycomponent)

useMemo和useEffect的執行時機是不一致的:useEffect執行的是副作用,所以一定是在渲染之后執行的,useMemo是需要有返回值的,而返回值可以直接參與渲染的,所以useMemo是在渲染期間完成的

memo使用

    // 父組件
    const Parent = ()=>{
        const [count, setCount] = useState(1)
        const addCount = ()=>{
           setCount(count + 1)
        }
        return(
            <>
             <div onClick={addCount}>計數: {count}</div>
             <Child />
            </>
        )
    }
    // 子組件
    const Child = memo(()=>{
        console.log('child start---')
        return(
            <div>child...</div>
        )
    })
    // 使用memo后,子組件的props或者state沒有變化時,將不會對子組件進行渲染

useMemo使用

   const sum = ()=>{
      return a+b
   }
   const result = useMemo(()=>{sum()},[a,b])
   // 只有在a或者b的值變化時才會觸發sum函數執行

useCallback使用

    // 父組件,給子組件傳遞name和changeName方法
    const Parent = () => {
      const [count, setCount] = useState(1);
      const [name, setName] = useState("bbz");
      const addCount = () => {
        setCount(count + 1);
      };
      const changeName = useCallback((n) => {
        setName(n);
      }, []);
      return (
        <>
          <div onClick={addCount}>計數: {count}</div>
          <Child name={name} changeName={changeName} />
        </>
      );
    };
    // 子組件
    const Child = ({ name, changeName }) => {
      console.log("child start---");
      return (
        <div
          onClick={() => {
            changeName("bobozai");
          }}
        >
          child comps: {name}
        </div>
      );
    };
    // 如果不使用useCallback,則點擊父組件計數的同時,子組件會console進行渲染,
    // 因為更新count時父組件會重新渲染,導致重新生成了一個changeName函數,
    // 所以子組件的props變了,導致子組件會重新渲染
    // 而對changeName函數用useCallback進行包裹,則對函數進行緩存不會重新生成

原文鏈接:https://juejin.cn/post/7079379468032147463

欄目分類
最近更新