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

          50天用react.js重寫50個(gè)web項(xiàng)目,我學(xué)到了什么?

          共 6446字,需瀏覽 13分鐘

           ·

          2022-05-13 08:58

          點(diǎn)擊上方?前端Q,關(guān)注公眾號(hào)

          回復(fù)加群,加入前端Q技術(shù)交流群

          來(lái)自:SegmentFault,作者:夕水

          鏈接:https://segmentfault.com/a/1190000040813435


          1.Expanding Cards

          效果如圖所示:

          1.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          1. React的函數(shù)組件中建立數(shù)據(jù)通信,我們通常使用useState方法。它的使用方式采用數(shù)組解構(gòu)的方式,如下:
          const?[state,setState]?=?React.useState(false);//useState方法的參數(shù)可以是任意的JavaScript數(shù)據(jù)類型

          解構(gòu)的第一個(gè)參數(shù)是我們定義并且訪問(wèn)的數(shù)據(jù)狀態(tài),第二個(gè)參數(shù)則是當(dāng)我們需要變動(dòng)數(shù)據(jù)狀態(tài)時(shí)所調(diào)用的方法,其作用類似類組件中的this.setState

          更詳細(xì)的使用方式參考文檔 useState API。

          2.與類組件類似的鉤子函數(shù),或者也可以理解為是函數(shù)組件的生命周期useEffect。它接收一個(gè)副作用函數(shù)effect作為參數(shù),如下所示:

          useEffect(()?=>?{});//里面的箭頭函數(shù)即副作用函數(shù)

          以上示例只是做了一個(gè)簡(jiǎn)單的更換文檔標(biāo)題,事實(shí)上在這個(gè)副作用函數(shù)中,我們可以做很多事情,詳情參考文檔 useEffect API。

          3.React內(nèi)部有自己的一套事件機(jī)制,我們稱之為合成事件。它與正常的JavaScript綁定事件很類似,但是它將事件命名方式采用了駝峰式寫法,并且它也對(duì)事件對(duì)象做了一層包裝,其名為SyntheticEvent。注意,這是一種跨瀏覽器端的包裝器,我們?nèi)绻胍褂迷氖录?duì)象,可以使用nativeEvent屬性,這在后面的示例中可能會(huì)涉及到。比如我們以上的事件綁定:

          onClick={?onChangeHandler.bind(this,index)?}

          注意這里,我們通常需要調(diào)用bind方法來(lái)將this綁定到該組件實(shí)例上,為什么要使用bind方法來(lái)綁定this呢,這是因?yàn)榻壎ㄊ录幕卣{(diào)函數(shù)(如這里的:onChangeHandler),它是作為一個(gè)中間變量的,在調(diào)用該回調(diào)函數(shù)的時(shí)候this指向會(huì)丟失,所以需要顯示的綁定this,這也是受JavaScript自身特性所限制的。詳情可參考React綁定this的原因中的解釋。與之類似的是在類組件中綁定合成事件,我們也一樣需要顯示的綁定this指向。

          4.map方法的原理。map方法迭代一個(gè)數(shù)組,然后根據(jù)返回值來(lái)對(duì)數(shù)組項(xiàng)做處理,并返回處理后的數(shù)組,請(qǐng)注意該方法不會(huì)改變?cè)瓟?shù)組。比如:

          [1,2,3].map(i?=>?i?<=?1);//返回[1]

          jsx中渲染列表也正是利用了map方法的這一特性,并且我們需要注意的是渲染列表的時(shí)候必須要指定一個(gè)key,這是為了方便DIFF算法更好的比對(duì)虛擬DOM。

          5.React中給標(biāo)簽添加類名,我們是寫成className的,這是因?yàn)?code style="margin: 3px;padding: 3px;font-size: 14px;border-radius: 4px;font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(155, 110, 35);background-color: rgb(255, 245, 227);">class被JavaScript當(dāng)做關(guān)鍵字。而如果我們需要?jiǎng)討B(tài)綁定類名,可以看到,我們使用了模板字符串,在這里更像是寫JavaScript,比如我們可以利用三元表達(dá)式做判斷。

          6.React中給標(biāo)簽綁定style樣式,我們通常可以綁定一個(gè)對(duì)象,在React中,我們綁定動(dòng)態(tài)數(shù)據(jù)就是寫一對(duì){}花括號(hào),然后style里面的樣式我們通常聲明成對(duì)象來(lái)表示,比如:

          {
          ????background:"#fff"
          }

          這代表它是一個(gè)樣式對(duì)象,然后React會(huì)在內(nèi)部去將樣式對(duì)象轉(zhuǎn)換成樣式字符串,然后添加到DOM的style對(duì)象中。

          2.Progress Steps

          效果如圖所示:

          2.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          與第一個(gè)示例所用到的知識(shí)點(diǎn)很類似,相關(guān)的不必做說(shuō)明。接下來(lái)我們來(lái)看不一樣的。

          1. 父組件向子組件傳遞數(shù)據(jù),我們通常都是使用props。可以看到以上的示例,我們暴露了4個(gè)props,即:
          width
          stepItems
          currentActive?
          onClickItem

          width就是設(shè)置步驟條的容器寬度,這個(gè)沒什么可說(shuō)的,stepItems就是步驟條的子組件,是一個(gè)數(shù)組,也可以在數(shù)組項(xiàng)中寫jsx。而currentActive則是傳入的當(dāng)前是哪一步,是一個(gè)索引值,通常應(yīng)該是數(shù)值。至于onClickItem則是子組件暴露給父組件的方法。

          1. 類組件的生命周期。在這個(gè)類組件當(dāng)中,我們使用到了constructor,componentDidMount,render的生命周期鉤子函數(shù)。我們可以根據(jù)語(yǔ)義來(lái)推測(cè),當(dāng)一個(gè)類組件被初始化時(shí)所經(jīng)歷的生命周期鉤子函數(shù)執(zhí)行順序一定是constructor => render => componentDidMount。從語(yǔ)義上來(lái)將constructor是一個(gè)構(gòu)造函數(shù),用于初始化狀態(tài),然后初始化完成之后,我們就會(huì)渲染組件,然后才是準(zhǔn)備掛載組件。

          額外的,我們擴(kuò)展一下,根據(jù)文檔說(shuō)明,我們可以知道詳細(xì)的生命周期。React組件生命周期包含3個(gè)階段:

          掛載 => 更新 => 卸載

          在組件掛載之前執(zhí)行的有:

          constructor?=>?static?getDerivedStateFromProps?=>?render?=>?componentWillMount(即將過(guò)時(shí))?=>?componentDidMount

          在組件state變更之后,也就是更新之后,執(zhí)行的有:

          static?getDerivedStateFromProps?=>?shouldComponentUpdate?=>?render?=>?getSnapshotBeforeUpdate?=>?componentWillReceiveProps(即將過(guò)時(shí))?=>?componentWillUpdate(即將過(guò)時(shí))?=>?componentDidUpdate

          在組件卸載之后,執(zhí)行的有:

          componentWillUnmount

          另還有錯(cuò)誤處理的生命周期,也就是在渲染過(guò)程,生命周期,或子組件的構(gòu)造函數(shù)發(fā)生錯(cuò)誤時(shí),會(huì)執(zhí)行的鉤子函數(shù):

          static?getDerivedFromStateError?=>?componentDidCatch

          這里面有些生命周期我們并沒有用到,有些則是幾乎涵蓋了我們后續(xù)的所有示例,所以我們一定要牢記組件的生命周期的順序。

          但是就這個(gè)示例而言,我們學(xué)會(huì)的應(yīng)該是如何封裝一個(gè)組件。

          3.Rotating Navigation Animation

          效果如圖所示:

          3.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          一些相同同前面示例相同的知識(shí)點(diǎn)自不必說(shuō),我們來(lái)看不一樣的知識(shí)點(diǎn)。

          1.模塊組合導(dǎo)出

          //components目錄下的index.js文件
          export?{?default?as?Content?}?from?'./Content';
          export?{?default?as?LeftMenu?}?from?'./LeftMenu';
          export?{?default?as?NavList?}?from?"./NavList";

          可以看到,我們可以將組件如上面那樣導(dǎo)出,然后我們就可以單獨(dú)引入一個(gè)js文件,再引入相關(guān)的組件即可使用。如下:

          import?{?Content,?NavList,?LeftMenu?}?from?'./components/index';

          2.react組件如何渲染html字符串

          react提供了一個(gè)dangerouslySetInnerHTML屬性,這個(gè)屬性的屬性值是一個(gè)以__html作為屬性,值是html字符串的對(duì)象,然后,我們就可以將html字符串渲染成真實(shí)的DOM元素。如下所示:

          測(cè)試代碼"?}}></p>
          //

          測(cè)試代碼span></p>

          4.hidden-search-widget

          效果如圖所示:

          4.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          本示例同樣的與前面的示例有一樣的知識(shí)點(diǎn),相關(guān)的不會(huì)做說(shuō)明,只會(huì)做不同的知識(shí)點(diǎn)介紹,后續(xù)的同理。

          1.判斷數(shù)據(jù)的類型。利用對(duì)象原型鏈上的toString方法,我們可以得到一個(gè)字符串值,這個(gè)字符串值的格式類似[object Object]這樣,也就是說(shuō)我們可以通過(guò)這個(gè)字符串值來(lái)判斷一個(gè)數(shù)據(jù)的類型。例如:

          const?getType?=?v?=>?Object.prototype.toString.call(v).slice(8,-1).toLowerCase();
          const?isArray?=?v?=>?getType(v)?===?"array";
          isArray([1,2,3]);//true
          isArray("");//false

          這里我們應(yīng)該知道Object.prototype.toString.call(v)返回的就是類似[object Object]這樣的值。所以我們通過(guò)截取開始索引為8,結(jié)束索引為該字符串長(zhǎng)度減1,也就是這里的-1,我們就可以獲取到第二個(gè)值Object,然后再調(diào)用toLowerCase()方法來(lái)將全部字母轉(zhuǎn)換成小寫,然后,我們就可以知道數(shù)據(jù)的類型了。比如這里的判斷是否是數(shù)組,那么只需要判斷該值是否等于"array"即可。

          2.React.createRef API

          有時(shí)候,我們恰恰需要操作一些原生DOM元素的API,例如這個(gè)示例的輸入框的關(guān)注焦點(diǎn)事件。這時(shí)候這個(gè)API就有了用武之地,我們相當(dāng)于使用這個(gè)API創(chuàng)建一個(gè)與DOM元素通信的橋梁,通過(guò)這個(gè)訪問(wèn)這個(gè)API的實(shí)例的current屬性,我們就可以訪問(wèn)到相應(yīng)的DOM元素。

          更詳細(xì)的可以參考文檔createRef API。

          3.如何封裝一個(gè)input組件。

          這個(gè)示例也教會(huì)了我們?nèi)绾畏庋b一個(gè)input組件。

          5.Blurry Loading

          效果如圖所示:

          5.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          1. componentDidMount生命周期中創(chuàng)建定時(shí)器以及在componentWillUnmount中清除定時(shí)器。
          2. 類組件中的this.setState更新狀態(tài)。該方法接收2個(gè)參數(shù),第一個(gè)參數(shù)則是我們的react狀態(tài),它可以是一個(gè)函數(shù),也可以是一個(gè)對(duì)象。第二個(gè)參數(shù)則是一個(gè)回調(diào)函數(shù)。談到這里,可能就會(huì)提到一個(gè)問(wèn)題,那就是setState到底是異步還是同步? 答案如下:

          答:react中的setState在合成事件和鉤子函數(shù)中是"異步"的,而在原生事件和setTimeout中則是同步的。

          之所以是"異步",并不代表在react內(nèi)部中是"異步"代碼實(shí)現(xiàn)的,事實(shí)上,它仍然是同步執(zhí)行的一個(gè)過(guò)程。

          只是合成事件和鉤子函數(shù)的調(diào)用順序在更新之前,導(dǎo)致在合成函數(shù)和鉤子函數(shù)中沒法立即拿到更新后的值,所以就形成了所謂的"異步"。

          事實(shí)上,我們可以通過(guò)制定第二個(gè)參數(shù)即callback(回調(diào)函數(shù))來(lái)獲取到更新后的值。

          react.js對(duì)setState的源碼實(shí)現(xiàn)也不是很復(fù)雜,它將傳入的參數(shù)作為值添加到updater也就是更新器的一個(gè)定義好的隊(duì)列(即:enqueueSetState)中。

          react中的批量更新優(yōu)化也是建立在合成事件和鉤子函數(shù)(也就是"異步")之上的,在原生事件和setTimeout中則不會(huì)進(jìn)行批量更新。

          比如在"異步"中對(duì)同一個(gè)值進(jìn)行多次setState,依據(jù)批量更新則會(huì)對(duì)其進(jìn)行策略覆蓋,而如果是對(duì)不同的多個(gè)值setState,則會(huì)利用批量更新策略對(duì)其進(jìn)行合并然后批量更新。

          更詳細(xì)的可以參考文檔 setState 。

          除此之外,這里也有一個(gè)非常重要的工具函數(shù)(這在js的實(shí)現(xiàn)中也提及過(guò)),如下所示:

          const?scale?=?(n,inMin,inMax,outerMin,outerMax)?=>?(n?-?inMin)?*?(outerMax?-?outerMin)?/?(inMax?-?inMin)?+?outerMin;

          這個(gè)工具函數(shù)的作用就是將一個(gè)范圍數(shù)字映射到另一個(gè)數(shù)字范圍。比方說(shuō),將1 ~ 100的數(shù)字范圍映射到0 ~ 1之間。
          詳情。

          6.Scroll Animation

          效果如圖所示:

          6.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          1.動(dòng)態(tài)組件

          我們通過(guò)props傳遞一個(gè)值用來(lái)確定組件名。這里以Title組件為例,如下所示:

          import?React?from?"react";
          const?TitleComponent?=?(props)?=>?{
          ????let?TagName?=?`h${?props.level?}`;
          ????return?(
          ????????<React.Fragment>
          ????????????<TagName>{?props.children?}TagName>

          ????????React.Fragment>
          ????)
          }
          export?default?TitleComponent;

          雖然核心代碼十分簡(jiǎn)單,這里需要注意,React組件需要首字母大寫,這算是一個(gè)約定的規(guī)則,其次我們通過(guò)props傳遞一個(gè)level用來(lái)確定我們使用的是h1~h6哪個(gè)來(lái)做標(biāo)簽,事實(shí)上這里我們應(yīng)該對(duì)level做一個(gè)限制,只允許值為1~6

          2.Fragment元素

          這個(gè)元素類似于一個(gè)占位符節(jié)點(diǎn),我們知道,當(dāng)兩個(gè)元素并列在一個(gè)React組件中,是不被允許的,React組件需要提供一個(gè)根節(jié)點(diǎn),但有時(shí)候,我們不需要一個(gè)實(shí)際的元素作為根節(jié)點(diǎn)包裹它們,所以我們就可以使用Fragment元素來(lái)包裹它們。該元素還有一個(gè)簡(jiǎn)寫<>,事實(shí)上在Vue2.x中也有這個(gè)限制,這是受虛擬DOM DIFF算法所限制的。

          更詳細(xì)的可以見文檔Fragment。

          3.函數(shù)防抖

          export?const?throttle?=?(fn,?time?=?1000)?=>?{
          ????let?done?=?false;
          ????return?(...args)?=>?{
          ????????if?(!done)?{
          ????????????fn.call(this,?...args);
          ????????????done?=?true;
          ????????}
          ????????setTimeout(()?=>?{
          ????????????done?=?false;
          ????????},?time)
          ????}
          }

          函數(shù)防抖與節(jié)流可參考 這篇文章 。

          4.監(jiān)聽滾動(dòng)事件,事實(shí)上這里的實(shí)現(xiàn)原理同JavaScript實(shí)現(xiàn)版本一致,只不過(guò)稍微轉(zhuǎn)換一下思維即可。

          7. Split Landing Page

          效果如圖所示:

          7.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          這個(gè)示例涉及到的知識(shí)點(diǎn)前面的示例都提及過(guò),所以這里不必贅述。

          8.Form Wave

          效果如圖所示:

          8.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          1. setState更新對(duì)象,如果state是一個(gè)對(duì)象,我們有2種方式來(lái)更新。
            1.1 利用Object.assign方法來(lái)更新。
            1.2 直接覆蓋整個(gè)對(duì)象。

          以上2種方式偽代碼如下:

          //??第1種方式
          const?loginInfo?=?Object.assign({},this.state.loginInfo,{
          ???[key]:updateValue
          })
          this.setState({
          ???loginInfo
          });
          //?第2種方式
          let?{?loginInfo?}?=?this.state;
          loginInfo[key]?=?updateValue;
          this.setState({?loginInfo?});

          9.Sound Board

          效果如圖所示:

          9.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          這個(gè)示例涉及到的知識(shí)點(diǎn)前面的示例都提及過(guò),所以這里不必贅述。

          10. Dad Jokes

          效果如圖所示:

          10.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          1. Suspense組件的使用。該組件可以指定一個(gè)加載指示器組件,用來(lái)實(shí)現(xiàn)組件的懶加載。更詳細(xì)的文檔見 Suspense 。
          2. 接口請(qǐng)求通常都是在componentDidMount鉤子函數(shù)中完成的。由于不能直接在該鉤子函數(shù)中更改狀態(tài)(react.js會(huì)給出一個(gè)警告)。所以我們需要讓接口請(qǐng)求變成異步。

          11. Event Keycodes

          效果如圖所示:

          11.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          這個(gè)示例涉及到的知識(shí)點(diǎn)前面的示例都提及過(guò),所以這里不必贅述。

          12. Faq Collapse

          效果如圖所示:

          12.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          這個(gè)示例涉及到的知識(shí)點(diǎn)前面的示例都提及過(guò),所以這里不必贅述。

          13. Random Choice Picker

          效果如圖所示:

          13.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          這個(gè)示例涉及到的知識(shí)點(diǎn)前面的示例都提及過(guò),所以這里不必贅述。

          14. Animated Navigation

          效果如圖所示:

          14.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          這個(gè)示例涉及到的知識(shí)點(diǎn)前面的示例都提及過(guò),所以這里不必贅述。

          15. Incrementing Counter

          效果如圖所示:

          15.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          1. react.js如何更新數(shù)組的某一項(xiàng)?在這里我是更新整個(gè)數(shù)組的,或許這不是一種好的方式。也希望有大佬能提供思路。我的代碼如下:
          startCounter()?{
          ????const?counterList?=?[...this.state.counterList];
          ????//?https://stackoverflow.com/questions/29537299/react-how-to-update-state-item1-in-state-using-setstate
          ????//?https://stackoverflow.com/questions/26253351/correct-modification-of-state-arrays-in-react-js
          ????counterList.forEach(counter?=>?{
          ??????const?updateCounter?=?()?=>?{
          ??????????const?value?=?counter.value;
          ??????????const?increment?=?value?/?100;
          ??????????if?(counter.initValue?????????????counter.initValue?=?Math.ceil(counter.initValue?+?increment);
          ????????????//?use?setTimeout?or?setInterval??
          ????????????counter.timer?=?setTimeout(updateCounter,?60);
          ??????????}?else?{
          ????????????counter.initValue?=?value;
          ????????????clearTimeout(counter.timer);
          ??????????}
          ??????????//?update?the?array,maybe?it's?not?a?best?way,is?there?any?other?way?
          ??????????this.setState({?counterList?});
          ??????}
          ??????updateCounter();
          ????})
          }

          16. Drink Water

          效果如圖所示:

          16.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          1. 這里踩了一個(gè)坑,如果使用new Array().fill()來(lái)初始化狀態(tài),會(huì)導(dǎo)致意想不到的渲染效果。所以這里直接初始化了所有的數(shù)組項(xiàng)。

          詳見源碼 。

          17. movie-app

          效果如圖所示:

          17.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          這個(gè)示例涉及到的知識(shí)點(diǎn)前面的示例都提及過(guò),所以這里不必贅述。

          PS:這個(gè)示例效果由于接口訪問(wèn)受限,需要你懂的訪問(wèn)。

          18. background-slider

          效果如圖所示:

          18.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          這個(gè)示例涉及到的知識(shí)點(diǎn)前面的示例都提及過(guò),所以這里不必贅述。

          19. theme-clock

          效果如圖所示:

          19.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          1. 中英文切換是通過(guò)定義一個(gè)對(duì)象來(lái)完成的。其它的沒什么好說(shuō)的,都是前面提及過(guò)的知識(shí)點(diǎn)。

          PS:本示例也用到了與示例5一樣的工具函數(shù)scale函數(shù)

          20. button-ripple-effect

          效果如圖所示:

          20.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          1. 可以通過(guò)調(diào)用函數(shù)來(lái)渲染一個(gè)組件。

          21. drawing-app

          效果如圖所示:

          21.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          1. 在react.js中使用ew-color-picker
          2. 這里踩了一個(gè)坑,也就是說(shuō)必須要設(shè)置線條的樣式。
          this.ctx.lineCap?=?"round";

          否則線條的樣式不對(duì)勁,雖然我也沒有搞清楚這里面的原因。畢竟js版本的實(shí)現(xiàn)也沒有需要顯示的設(shè)置這個(gè)線條的樣式。

          22. drag-n-drop

          效果如圖所示:

          22.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          1. 這里也踩了一個(gè)坑, 詳見源碼注釋 。

          23. content-placeholder

          效果如圖所示:

          23.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          1. 一些判斷react組件的工具函數(shù)。如下:
          import?React?from?"react";
          export?function?isString(value){
          ????return?typeof?value?===?"string";
          }
          export?function?isClassComponent(component)?{
          ????return?typeof?component?===?'function'?&&?!!component.prototype.isReactComponent;
          }

          export?function?isFunctionComponent(component)?{
          ????return?typeof?component?===?'function'?&&?String(component).indexOf('return?React.createElement')?>?-1;
          }

          export?function?isReactComponent(component)?{
          ????return?isClassComponent(component)?||?isFunctionComponent(component);
          }

          export?function?isElement(element)?{
          ????return?React.isValidElement(element);
          }

          export?function?isDOMTypeElement(element)?{
          ????return?isElement(element)?&&?typeof?element.type?===?'string';
          }

          export?function?isCompositeTypeElement(element)?{
          ????return?isElement(element)?&&?typeof?element.type?===?'function';
          }
          1. 如何封裝一個(gè)卡片組件。

          24. kinetic-loader

          效果如圖所示:

          24.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          這個(gè)示例涉及到的知識(shí)點(diǎn)前面的示例都提及過(guò),所以這里不必贅述。

          25. sticky-navbar

          效果如圖所示:

          25.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          這個(gè)示例涉及到的知識(shí)點(diǎn)除了一個(gè)工具函數(shù),其它的知識(shí)點(diǎn)前面的示例都提及過(guò),所以這里不必贅述。

          export?function?marked(template){
          ????return?template.replace(/.+?[\s]/g,v?=>?`

          ${v}

          `
          );
          }

          這個(gè)工具函數(shù)的作用就是匹配以空格結(jié)束的任意字符,然后替換成p標(biāo)簽包裹這些內(nèi)容。

          PS:這里也做了移動(dòng)端的布局。

          26. double-slider

          效果如圖所示:

          26.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          這個(gè)示例涉及到的知識(shí)點(diǎn),前面的示例都提及過(guò),所以這里不必贅述。

          27. toast-notification

          效果如圖所示:

          27.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          1. 可以利用ReactDOM.render來(lái)封裝一個(gè)函數(shù)調(diào)用的toast組件。
          2. ReactDOM.unmountComponentAtNode API的用法這個(gè)方法會(huì)將從DOM中卸載組件,包括事件處理器和state。詳見 文檔 。
          3. getDerivedStateFromProps 靜態(tài)函數(shù)。詳見 文檔。

          28. github-profiles

          效果如圖所示:

          28.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          這個(gè)示例涉及到的知識(shí)點(diǎn),前面的示例都提及過(guò),所以這里不必贅述。

          29. double-click-heart

          效果如圖所示:

          29.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          1. 從合成事件對(duì)象中讀取原生的事件對(duì)象。即nativeEvent屬性。

          30. auto-text-effect

          效果如圖所示:

          30.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          這個(gè)示例涉及到的知識(shí)點(diǎn),前面的示例都提及過(guò),所以這里不必贅述。

          31. password generator

          效果如圖所示:

          31.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          這個(gè)示例涉及到的知識(shí)點(diǎn),前面的示例都提及過(guò),所以這里不必贅述。

          32. good-cheap-fast

          效果如圖所示:

          32.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          1. 如何封裝一個(gè)switch組件,即開關(guān)小組件。

          33. notes-app

          效果如圖所示:

          33.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          這個(gè)示例涉及到的知識(shí)點(diǎn),前面的示例都提及過(guò),所以這里不必贅述。

          34. animated-countdown

          效果如圖所示:

          34.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          這個(gè)示例涉及到的知識(shí)點(diǎn),前面的示例都提及過(guò),所以這里不必贅述。

          35. image-carousel

          效果如圖所示:

          35.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          這個(gè)示例涉及到的知識(shí)點(diǎn),前面的示例都提及過(guò),所以這里不必贅述。

          36. hover board

          效果如圖所示:

          36.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          1. react.js合成事件中的setState是同步的,所以這里使用原生的監(jiān)聽事件來(lái)實(shí)現(xiàn)。詳見源碼 。

          37. pokedex

          效果如圖所示:

          37.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          這個(gè)示例涉及到的知識(shí)點(diǎn),前面的示例都提及過(guò),所以這里不必贅述。

          38. mobile-tab-navigation

          效果如圖所示:

          38.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          這個(gè)示例涉及到的知識(shí)點(diǎn),前面的示例都提及過(guò),所以這里不必贅述。

          39. password-strength-background

          效果如圖所示:

          39.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          1. 照著 文檔 一步步將tailwindcss添加到create-react-app腳手架中。

          40. 3D-background-boxes

          效果如圖所示:

          40.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          這個(gè)示例涉及到的知識(shí)點(diǎn),前面的示例都提及過(guò),所以這里不必贅述。

          41. Verify Your Account

          效果如圖所示:

          41.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          這個(gè)示例涉及到的知識(shí)點(diǎn),前面的示例都提及過(guò),所以這里不必贅述。

          42. live-user-filter

          效果如圖所示:

          42.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          這個(gè)示例涉及到的知識(shí)點(diǎn),前面的示例都提及過(guò),所以這里不必贅述。

          43. feedback-ui-design

          效果如圖所示:

          43.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          這個(gè)示例涉及到的知識(shí)點(diǎn),前面的示例都提及過(guò),所以這里不必贅述。

          44. custom-range-slider

          效果如圖所示:

          44.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          這個(gè)示例涉及到的知識(shí)點(diǎn),前面的示例都提及過(guò),所以這里不必贅述。

          45. netflix-mobile-navigation

          效果如圖所示:

          45.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          1. 為如何實(shí)現(xiàn)一個(gè)遞歸組件提供了思路。

          46. quiz-app

          效果如圖所示:

          46.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          這個(gè)示例涉及到的知識(shí)點(diǎn),前面的示例都提及過(guò),所以這里不必贅述。

          47. testimonial-box-switcher

          效果如圖所示:

          47.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          這個(gè)示例涉及到的知識(shí)點(diǎn),前面的示例都提及過(guò),所以這里不必贅述。

          48. random-image-feed

          效果如圖所示:

          48.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          1. 實(shí)現(xiàn)一個(gè)簡(jiǎn)易版本的預(yù)覽圖片。

          49. todo-list

          效果如圖所示:

          49.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          這個(gè)示例涉及到的知識(shí)點(diǎn),前面的示例都提及過(guò),所以這里不必贅述。

          50. insect-catch-game

          效果如圖所示:

          50.png
          • 源碼
          • 在線示例

          學(xué)到了什么?

          這個(gè)示例涉及到的知識(shí)點(diǎn),前面的示例都提及過(guò),所以這里不必贅述。

          特別說(shuō)明:這個(gè)示例算是一個(gè)比較綜合的示例了。

          瀏覽 52
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

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

          手機(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>
                  欧美激情操逼片 | 欧美三级特黄一区 | 国产三级日本三级国产三级 | 七区无码| 欧美成人在线三级免费 |