趣談React 的由來

近期開始的了新的學(xué)習(xí)(react),
本人學(xué)習(xí)有個習(xí)慣,
喜歡去探索由來和歷史,
俗稱吃瓜(手動滑稽)

一般網(wǎng)上的視頻教程只會教你怎么用 react 但是并不會告訴你 react 是當(dāng)初是怎么來的,為了解決哪些痛點。

首先我們先來看一段 js 原生代碼。

這是一段很簡單的代碼,用于操作 result 的增減,
現(xiàn)在,
讓我們來抽象的看待這個問題,
畫個圖來表示:

  • 不管你使用原生 js 還是 jq 都要通過dom提供的 API,經(jīng)歷先從頁面取到內(nèi)容,然后經(jīng)過 js 操作以后再填回去。
  • react 同學(xué)認為這太智障了,雖然簡單,但是能不能砍掉上面的步驟(從dom取內(nèi)容)或下面的步驟(填回內(nèi)容)呢,從而更簡便呢?
  • 于是 react 同學(xué)砍掉了上面的步驟(砍掉下面的步驟不現(xiàn)實,因為js將無法通知頁面),直接在 js 中生成 HTML 然后自動頁面中同步(用虛線表示),然后當(dāng)數(shù)據(jù)更新時,react 將重新生成一個對象,再自動的去更新原來頁面的元素,從而使得頁面中的數(shù)據(jù)也是最新值。
  • 這樣一來事情就變得簡單了,代碼量減少一半, js 再也不用去頁面中取元素,只需再 js 中生成填回頁面中即可。從來不去取頁面中的元素,只去填東西。react 就是在這種理念下誕生了。

接下里我們用這種理念重寫一次上面的代碼。

根據(jù)上圖的操作在頁面中加入一個 span

然后為了加個按鈕(為了簡化先在頁面中手動增加)

目前代碼有點粗糙,但是為了簡單明了演示上圖的理念。

  1. js 中生成對象插入到頁面中
  2. 更新數(shù)據(jù)時,重新在 js 中生成對象同步更新原來的頁面元素

接著我們開始優(yōu)化一下上圖代碼,并把按鈕也放入 js 代碼中:

但是炸一看這代碼還是很傻*,于是我們繼續(xù)來 分三步 更層次優(yōu)化代碼

  1. 這個 React.creatElement 方法名字太長了,抽出
  2. 這些個變量只用過一次,那我們就可以跳過聲明變量,直接使用

于是代碼就變成了這個樣子:

具有一雙慧眼的你,應(yīng)該也看的出來這樣的代碼很像一種東西把...

這也就是 react 最聰明的一點優(yōu)化,

請先忽略變量的轉(zhuǎn)換

我們驚訝的發(fā)現(xiàn),這樣的 js 代碼和 HTML 標簽上并沒有什么區(qū)別,
于是聰明的 react 同學(xué)誕生了另一個想法(JSX),我們能不能讓用戶寫下面的代碼,然后經(jīng)過程序轉(zhuǎn)換成上面的代碼呢?
這樣一來,最終的結(jié)果就是我們通過寫下面的代碼來替換(也就是等價于)上面的代碼。
經(jīng)過 react 同學(xué)一番折騰,JSX 語法上線了 (敲黑板,重點:我們并不是在寫HTML代碼,而是用HTML的形式來寫JS代碼)

Finally,代碼變成了這樣子react 最終的樣子)

本文完。

PS
我們改變過后的類似 HTML 代碼就是虛擬 DOM

還有回答一些弱智問題
為什么我們在寫 JSX 的時候,綁定事件的時候函數(shù)名后面不帶括號,
因為在一開始的時候我們在 js 中寫的是對象 {onClick: fn} ,這里需要的fn是整個函數(shù),如果寫成 {onClick: fn()},賦值給 onClick 的就是函數(shù)的返回值。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容