02.25 React 基礎:JSX 擴展語法


React 基礎:JSX 擴展語法

前言

作為一個前端開發有些不好意思,居然還沒有接觸過 React ,就借這段時間積累下 React 相關經驗,為疫情過後能有更多的就業機會。

如果你已經是個經驗豐富的 React Developer 可能這系列文章不太適合你閱讀。

雖然我承認下面大多數內容,基本都可以在官網找到原型。 但我會努力讓你們儘可能不枉此行,如果有不對之處,望各位評論指出。

為了更好的閱讀體驗,你可以在底下的“瞭解更多”查看原文(訪問我的語雀知識庫)。

JSX 介紹

什麼是 JSX

如下代碼,和 HTML 標籤似乎一樣,但不是我們認為的 HTML 標籤:

React 基礎:JSX 擴展語法

就是如此的語法稱為 JSX ,它被用來描述 React 中的"元素",從而渲染出我們說要看的頁面。

語法糖

雖然 JSX 像是 HTML ,但其是 js 的語法擴展的語法糖。

舉例:

React 基礎:JSX 擴展語法

如上 JSX 代碼,將通過 React.createElement(component, props, ...children) api 解析成如下形式:

React 基礎:JSX 擴展語法

注意,上述解析結果就是普通的 js 代碼,同時內部對每個子 JSX 標籤(children)元素都是嵌套的。

JSX 標籤內的屬性(key=value) 將被解析成 props 對象,可以清楚的看到 href 、target、alt 等解析結果。

為何使用 JSX

如果使用過 angular2、vue ,你應該知道他們對於 js 和 html 兩塊內容是分開寫的。

angular 物理分割:

React 基礎:JSX 擴展語法

vue 通過 loader 組合拆分:

React 基礎:JSX 擴展語法


而 React 通過 JSX 語法,將兩者耦合在一起。

React 認為渲染邏輯本質上與其他 UI 邏輯內在耦合,比如,在 UI 中需要綁定處理事件、在某些時刻狀態發生變化時需要通知到 UI,以及需要在 UI 中展示準備好的數據。

React 並沒有採用將標記與邏輯進行分離到不同文件這種人為地分離方式,而是通過將二者共同存放在稱之為"組件"的鬆散耦合單元之中,來實現關注點分離。

最終,我們能更好的理解整個組件裡 UI 和邏輯部分的關係。當然這仁者見仁智者見智。

另外,在 JSX 內部會對傳入內容進行轉義,再進行渲染。所以能防止 XSS 注入攻擊

使用 JSX


括號 { } 表達式

我們可以通過大括號,來顯式定義的變量。括號內也支持 js 表達式,或者已定義的方法。

示例:

React 基礎:JSX 擴展語法

頁面顯示:

React 基礎:JSX 擴展語法


if 條件判斷

由於 {} 括號內部不支持複雜的 js 邏輯判斷,如果涉及 if/else 之類語句,可以將 JSX 寫在 if/else 裡面,因為其本身就是 js 的擴展。

React 基礎:JSX 擴展語法


React 基礎:JSX 擴展語法

特定屬性

或許你應該注意到 HTML 中的 class 屬性,在 JSX 中被定義為 className;而 tabindex 變為 tabIndex 。

React 基礎:JSX 擴展語法


React 基礎:JSX 擴展語法


所以 JSX 和 HTML 是不一樣的,儘管他們非常類似。而且 React DOM 中,這些屬性使用 camelCase 來命名定義。

JSX 約定

需要包含 React 庫

這好理解,因為 JSX 是 React.createElement 的語法糖,所以需要在此之前引入 React ,確保 React 在作用域中。

React 基礎:JSX 擴展語法


組件名首字母大寫

組件的名稱一定要首字母大寫,如果小寫會導致解析不正確:

React 基礎:JSX 擴展語法

把 JsxBase 改為 jsxBase,第一能看到 IDE 的校驗已經是"未引用"狀態了,然後頁面也沒有預期渲染出組件內容。

React 基礎:JSX 擴展語法

點語法

可以定義一個包含很多 React JSX 的組件,然後一起導出。最後通過指定的引用來選擇使用哪個組件。

比如定義了 Foo、Bar 兩個組件,然後一同導出:

React 基礎:JSX 擴展語法

最後在使用的地方,通過 xxx.xxx 的方式來選擇使用那個組件:

React 基礎:JSX 擴展語法


不支持動態表達式

注意,JSX 通過 React.createElement 解析,其中的 type 選項不支持動態表達式。

React 基礎:JSX 擴展語法

示例:

React 基礎:JSX 擴展語法


React 基礎:JSX 擴展語法

而是要通過一箇中間變量,來引用這個動態表達式。最後返回這個中間變量。

React 基礎:JSX 擴展語法

注意,這個中間變量,還是要符合 React JSX 的命名規範,首字母要大寫。

其他

props

我們知道 JSX 內的屬性最終都會被解析到 props 中,若某個屬性沒有賦值,那它默認就為 true 。

React 基礎:JSX 擴展語法


{autocomplete: true}

另外,我們可以使用 {...xxx} 來定義整個屬性:

React 基礎:JSX 擴展語法

特殊值的問題

false, null, undefined, and true 是合法的子元素。但它們並不會被渲染:

React 基礎:JSX 擴展語法

最終,頁面是一片"空白"

另外,對於 falsy 值的渲染,需要長個心眼:

React 基礎:JSX 擴展語法

上面紅款內容顯示在頁面上了,並且渲染為 0 。

React 基礎:JSX 擴展語法


總結

關於 JSX 的知識點先梳理到這裡,基本對一般的使用足夠用了。多數都是一些規則的梳理,畢竟這是 React.createElement 的語法糖。


分享到:


相關文章: