<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>

          React17在我看來是這樣的

          共 3720字,需瀏覽 8分鐘

           ·

          2021-03-14 02:21

          本文適合覺得React難學(xué),或者想重頭系統(tǒng)化學(xué)習(xí)React的小伙伴。

          如果這篇文章有觸動(dòng)到你,歡迎關(guān)注前端早茶,與廣東靚仔攜手共同進(jìn)階~

          作者:廣東靚仔

          一、前言

          本文基于開源項(xiàng)目:

          https://github.com/facebook/react

              廣東靚仔總結(jié)下自己這幾年對學(xué)習(xí)前端框架的一些想法,順便講講React17帶來的改變引起的一些個(gè)人想法。 
              在我們學(xué)習(xí)一門前端框架的時(shí)候,廣東靚仔覺得官方文檔一定是最好的學(xué)習(xí)資料。有些小伙伴可能把官方文檔當(dāng)作入門指南,然后再找其他學(xué)習(xí)資料去深度學(xué)習(xí)。廣東靚仔覺得有點(diǎn)舍近求遠(yuǎn)了,官方文檔一定是開發(fā)人員盡可能去寫全、寫精的。我們應(yīng)該仔細(xì)的去閱讀,而不是粗略看了一遍,然后找各種文章去閱讀學(xué)習(xí)。
              在這里廣東靚仔可以很負(fù)責(zé)的說一句,市面上80%免費(fèi)的文章,基本都是基于官方文檔來寫的。廣東靚仔的文章也是如此,只不過是加了點(diǎn)自己的思考。

              React官方文檔寫得特別好,還帶著我們?nèi)ヮI(lǐng)悟它的設(shè)計(jì)模式。

          1.1 沒有React基礎(chǔ)可以開始用React17嗎?

          在React16.8版本引入了hook以來,React的學(xué)習(xí)成本就已經(jīng)降低了很多了,我們可以通過函數(shù)式編程來開發(fā)我們的應(yīng)用。React以前就像一艘“航母”一樣,大而全。正因“全”因此我們的學(xué)習(xí)成本自然就高。有了hook我們使用函數(shù)組件開發(fā),上手難度自然降低了很多。

          二、React 17 帶來了哪些改變

              React17.0.1版本相對與16.8版本本身沒有增加新特性,只是做了一些補(bǔ)充。17版本更像一個(gè) 基石 ,為什么這么說呢?細(xì)心的小伙伴們會發(fā)現(xiàn)官方描述了這么一句話:“React v17 開啟了 React 漸進(jìn)式升級的新篇章”。這句話我看出了雄心勃勃,后續(xù) 18、19 等的更新版本一定是以17這個(gè)“基石”來開啟新篇章。

          這里列舉讓廣東靚仔眼前一亮的兩點(diǎn):

          1、新的 JSX 轉(zhuǎn)換邏輯

          2、事件系統(tǒng)重構(gòu)


          當(dāng)然React17也有其他的更新,大家有興趣可以去看官方文檔。

          三、重構(gòu) JSX 轉(zhuǎn)換邏輯

          React17之前我們?nèi)绻@樣寫,代碼如下:

          function MyComponent() {
            return <p>前端早茶</p>
          }

          頁面是會報(bào)錯(cuò)的,why?

          上一篇文章有講到React 中對 JSX 代碼的轉(zhuǎn)換依賴的是 React.createElement 這個(gè)函數(shù)。有興趣可以回頭看下上一篇文章。

          因此在寫JSX的時(shí)候,是一定要在頭部引入React的,代碼如下:

          import React from 'react';
          function MyComponent() {
            return <p>前端早茶</p>
          }
          React17之后我們在使用JSX,不再需要引入import React from 'react'; 
          React17中編譯器會自動(dòng)幫我們引入 JSX 的解析器的,例如:
          function MyComponent() {
            return <p>前端早茶</p>
          }

          這個(gè)代碼最后會被編譯器轉(zhuǎn)換為:

          import {jsx as _jsx} from 'react/jsx-runtime';
          function MyComponent() {
            return _jsx('p', { children'前端早茶' });
          }
          react/jsx-runtime 中的 JSX 解析器幫我們完成了JSX的編譯工作,很明顯降低了我們的學(xué)習(xí)成本。如果有的小伙伴一開始就是從React17開始學(xué)習(xí)的,我們無感知的使用到它的方便。
          關(guān)于這塊的內(nèi)容,詳細(xì)可以看看如下內(nèi)容:

          https://github.com/reactjs/rfcs/blob/createlement-rfc/text/0000-create-element-changes.md#motivation

          四、事件系統(tǒng)重構(gòu)

          React17版本中事件系統(tǒng)重構(gòu)可以分為兩塊來看:

          • 放棄document 來做事件的中心化管控
          • 放棄事件池


            4.1 卸掉歷史包袱

              React之前是將所有事件冒泡到 document 來實(shí)現(xiàn)對事件的中心化管控,17版本放棄 document 來做事件的中心化管控。
              why?因?yàn)橛行r(shí)候合成事件雖然在 React 事件體系下的冒泡被阻止了,但是并不能夠阻止原生 DOM 事件的冒泡。
              React17中,事件管控相關(guān)的邏輯被轉(zhuǎn)移到了每個(gè) React 組件自己的容器 DOM 節(jié)點(diǎn)中,比如我們常寫的在 ID 為 root 的 DOM 節(jié)點(diǎn)下掛載了一個(gè) React 組件,代碼如下:
          const rootElement = document.getElementById("root");
          ReactDOM.render(<App />, rootElement);

          之后React 組件就只能自己管理自己的東東了,無法再影響到全局了。

              4.2 擁抱新潮流

              React 之前,合成事件對象都是被放進(jìn)“事件池”統(tǒng)一管理,為了能夠?qū)κ录ο蟮膹?fù)用,提高性能。細(xì)心的小伙伴會發(fā)現(xiàn),既然考慮到復(fù)用,事件處理函數(shù)執(zhí)行完成后,合成事件對象內(nèi)部的所有屬性都會被置空。
              那么問題來了,如果事件執(zhí)行完成,我們想獲取事件對象呢?

              廣東靚仔找來了官方的代碼,來說明:

          function handleChange(e{
            // This won't work because the event object gets reused.
            setTimeout(() => {
              console.log(e.target.value); // Too late!
            }, 100);
          }
          異步執(zhí)行的 setTimeout 回調(diào)會在 handleChange 這個(gè)事件處理函數(shù)執(zhí)行完畢后執(zhí)行,因此它拿不到想要的那個(gè)事件對象 e了。

          要想獲取的話,我們就需要使用e.persist() ,代碼如下:

          function handleChange(e{
            // Prevents React from resetting its properties:
            e.persist();
            setTimeout(() => {
              console.log(e.target.value); // Works
            }, 100);
          }
          React 17在研發(fā)體驗(yàn)上考慮比較多,官方放棄事件池,為每一個(gè)合成事件創(chuàng)建新的對象。所以之后我們不再需要編寫 e.persist(),也可以隨時(shí)隨地訪問我們想要的事件對象。

          五、總結(jié)

              在我們閱讀完官方文檔后,我們一定會進(jìn)行更深層次的學(xué)習(xí),比如看下框架底層是如何運(yùn)行的,以及源碼的閱讀。
              這里廣東靚仔給下一些小建議:
          • 在看源碼前,我們先去官方文檔復(fù)習(xí)下框架設(shè)計(jì)理念、源碼分層設(shè)計(jì)
          • 閱讀下框架官方開發(fā)人員寫的相關(guān)文章
          • 借助框架的調(diào)用棧來進(jìn)行源碼的閱讀,通過這個(gè)執(zhí)行流程,我們就完整的對源碼進(jìn)行了一個(gè)初步的了解
          • 接下來再對源碼執(zhí)行過程中涉及的所有函數(shù)邏輯梳理一遍

          關(guān)注我,一起攜手進(jìn)階

          如果這篇文章有觸動(dòng)到你,歡迎關(guān)注前端早茶,與廣東靚仔攜手共同進(jìn)階~

          瀏覽 60
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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>
                  日韩欧美三级片在线观看 | 日日躁夜夜躁狠狠躁麻豆 | 国产一级一片免费播放放a | 人妻互换一二三区免费 | 中文字幕35页 |