<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一次真正理解React—useRef【Hooks系列03】

          共 2983字,需瀏覽 6分鐘

           ·

          2021-04-02 12:40

          相信有過React使用經驗的人對ref都會熟悉,它可以用來獲取組件實例對象或者是DOM對象。

          useRef這個hooks函數(shù),除了傳統(tǒng)的用法之外,它還可以“跨渲染周期”保存數(shù)據

          首先來看一下它傳統(tǒng)的用法:

          import React, { useState, useEffect, useMemo, useRef } from 'react';

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

            const doubleCount = useMemo(() => {
              return 2 * count;
            }, [count]);

            const couterRef = useRef();

            useEffect(() => {
              document.title = `The value is ${count}`;
              console.log(couterRef.current);
            }, [count]);
            
            return (
              <>
                <button ref={couterRef} onClick={() => {setCount(count + 1)}}>Count: {count}, double: {doubleCount}</button>
              </>

            );

          代碼中用useRef創(chuàng)建了couterRef對象,并將其賦給了buttonref屬性。這樣,通過訪問couterRef.current就可以訪問到button對應的DOM對象。

          然后再來看看它保存數(shù)據的用法。

          在一個組件中有什么東西可以跨渲染周期,也就是在組件被多次渲染之后依舊不變的屬性?第一個想到的應該是state。沒錯,一個組件的state可以在多次渲染之后依舊不變。

          但是,state的問題在于一旦修改了它就會造成組件的重新渲染。

          那么這個時候就可以使用useRef來跨越渲染周期存儲數(shù)據,而且對它修改也不會引起組件渲染。

          import React, { useState, useEffect, useMemo, useRef } from 'react';

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

            const doubleCount = useMemo(() => {
              return 2 * count;
            }, [count]);

            const timerID = useRef();
            
            useEffect(() => {
              timerID.current = setInterval(()=>{
                  setCount(count => count + 1);
              }, 1000); 
            }, []);
            
            useEffect(()=>{
                if(count > 10){
                    clearInterval(timerID.current);
                }
            });
            
            return (
              <>
                <button ref={couterRef} onClick={() => {setCount(count + 1)}}>Count: {count}, double: {doubleCount}</button>
              </>

            );

          在上面的例子中,我用ref對象的current屬性來存儲定時器的ID,這樣便可以在多次渲染之后依舊保存定時器ID,從而能正常清除定時器。

          參考資料

          • https://naoffer.com/exam/308/2786

          最后

          當前進度:React系列03篇,關注公眾號,真正全面的學習前端技術

          公眾號里回復關鍵詞加群,加入前端進階群

          堅持不易,希望能夠幫助到一部分人,多謝幫忙一鍵三連

          點擊關注我們↓
          瀏覽 40
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  色五月自拍偷拍 | 97男人的天堂 | 日韩无码字幕 | 国产乱伦日韩 | 午夜探花视频 |