中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

React新文檔濫用effect問題怎么解決

發布時間:2022-07-08 13:39:37 來源:億速云 閱讀:218 作者:iii 欄目:開發技術

這篇文章主要介紹了React新文檔濫用effect問題怎么解決的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇React新文檔濫用effect問題怎么解決文章都會有所收獲,下面我們一起來看看吧。

    引言

    你或你的同事在使用useEffect時有沒有發生過以下場景:

    當你希望狀態a變化后發起請求,于是你使用了useEffect

    useEffect(() => {
      fetch(xxx);
    }, [a])

    這段代碼運行符合預期,上線后也沒問題。

    隨著需求不斷迭代,其他地方也會修改狀態a。但是在那個需求中,并不需要狀態a改變后發起請求。

    你不想動之前的代碼,又得修復這個bug,于是你增加了判斷條件:

    useEffect(() => {
      if (xxxx) {
        fetch(xxx);
      }
    }, [a])

    某一天,需求又變化了!現在請求還需要b字段。

    這很簡單,你順手就將b作為useEffect的依賴加了進去:

    useEffect(() => {
      if (xxxx) {
        fetch(xxx);
      }
    }, [a, b])

    隨著時間推移,你逐漸發現:

    • 是否發送請求與if條件相關

    • 是否發送請求還與a、b等依賴項相關

    • a、b等依賴項又與很多需求相關

    根本分不清到底什么時候會發送請求,真是頭大...

    如果以上場景似曾相識,那么React新文檔里已經明確提供了解決辦法。

    一些理論知識

    新文檔中這一節名為Synchronizing with Effects,當前還處于草稿狀態。

    但是其中提到的一些概念,所有React開發者都應該清楚。

    首先,effect這一節隸屬于Escape Hatches(逃生艙)這一章。

    React新文檔濫用effect問題怎么解決

    從命名就能看出,開發者并不一定需要使用effect,這僅僅是特殊情況下的逃生艙。

    React中有兩個重要的概念:

    Rendering code(渲染代碼)

    Event handlers(事件處理器)

    Rendering code指開發者編寫的組件渲染邏輯,最終會返回一段JSX

    比如,如下組件內部就是Rendering code

    function App() {
      const [name, update] = useState('KaSong');
      return <div>Hello {name}</div>;
    }

    Rendering code的特點是:他應該是不帶副作用的純函數。

    如下Rendering code包含副作用(count變化),就是不推薦的寫法:

    let count = 0;
    function App() {
      count++;
      const [name, update] = useState('KaSong');
      return <div>Hello {name}</div>;
    }

    處理副作用

    Event handlers是組件內部包含的函數,用于執行用戶操作,可以包含副作用

    下面這些操作都屬于Event handlers

    • 更新input輸入框

    • 提交表單

    • 導航到其他頁面

    如下例子中組件內部的changeName方法就屬于Event handlers

    function App() {
      const [name, update] = useState('KaSong');
      const changeName = () => {
        update('KaKaSong');
      }
      return <div onClick={changeName}>Hello {name}</div>;
    }

    但是,并不是所有副作用都能在Event handlers中解決。

    比如,在一個聊天室中,發送消息是用戶觸發的,應該交給Event handlers處理。

    除此之外,聊天室需要隨時保持和服務端的長連接,保持長連接的行為屬于副作用,但并不是用戶行為觸發的。

    對于這種:在視圖渲染后觸發的副作用,就屬于effect,應該交給useEffect處理。

    回到開篇的例子:

    當你希望狀態a變化后發起請求,首先應該明確,你的需求是:

    狀態a變化,接下來需要發起請求

    還是

    某個用戶行為需要發起請求,請求依賴狀態a作為參數?

    如果是后者,這是用戶行為觸發的副作用,那么相關邏輯應該放在Event handlers中。

    假設之前的代碼邏輯是:

    • 點擊按鈕,觸發狀態a變化

    • useEffect執行,發送請求

    應該修改為:

    • 點擊按鈕,在事件回調中獲取狀態a的值

    • 在事件回調中發送請求

    經過這樣修改,狀態a變化與發送請求之間不再有因果關系,后續對狀態a的修改不會再有無意間觸發請求的顧慮。

    關于“React新文檔濫用effect問題怎么解決”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“React新文檔濫用effect問題怎么解決”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    玉屏| 沅江市| 马龙县| 温泉县| 东台市| 石楼县| 且末县| 南乐县| 左权县| 马龙县| 惠安县| 白水县| 诸暨市| 榕江县| 灌云县| 云阳县| 苗栗县| 大庆市| 海南省| 双流县| 宁明县| 隆昌县| 孝感市| 略阳县| 富顺县| 繁昌县| 芜湖市| 承德市| 黄大仙区| 昌江| 射洪县| 宿迁市| 广安市| 德清县| 莎车县| 宝丰县| 忻州市| 肇庆市| 靖远县| 楚雄市| 阿荣旗|