複製鏈接
請複製以下鏈接發送給好友

JSX

鎖定
JSX是一種JavaScript的語法擴展,首先運用於React中,其格式比較像是模版語言,但事實上完全是在JavaScript內部實現的。元素是構成React應用的最小單位,JSX就是用來聲明React當中的元素。React主要使用JSX來描述用户界面,但React並不強制要求使用JSX [1]  ,而JSX也在React之外的框架得到了廣泛的支持,包括Vue.js [3] Solid [2]  等。
外文名
JSX
解    釋
一種JavaScript的語法擴展

JSXJSX特點

React認為渲染邏輯本質上與其他UI邏輯內在耦合,比如,在UI中需要綁定處理事件、在某些時刻狀態發生變化時需要通知到UI,以及需要在UI中展示準備好的數據。 [4] 
JSX可以使用引號來定義以字符串為值的屬性:
const element = <div tabIndex="0"></div>;
也可以使用大括號來定義以JavaScript表達式為值的屬性:
const element = <img src={user.avatarUrl} />;
因為JSX的特性更接近JavaScript而不是HTML,所以React DOM使用camelCase(小駝峯)命名來定義屬性的名稱,而不是使用HTML的屬性名稱。例如:class變成了className,而tableindex則對應着tableIndex。

JSX使用方法

JSX嵌套格式

JSX標籤是閉合式的,像XML/HTML一樣在結尾處用/>表示:
const element = <img src={user.avatarUrl} />;
JSX標籤同樣可以相互嵌套:

JSX嵌入表達式

在JSX中可任意使用JavaScript表達式,但要包含在大括號裏,例如:2 + 2,user.firstName,以及formatName(user)都是可以使用的。
function formatName(user) {
    return user.firstName + ' ' + user.lastName;
}
const user = {
    firstName: 'Harper',
    lastName: 'Perez'
};
const element = (
    <h1>
        Hello, {formatName(user)}!
    </h1>
);
ReactDOM.render(
    element,
    document.getElementById('root')
);
書寫JSX的時候一般都會帶上換行和縮進,這樣可以增強代碼的可讀性。與此同時在JSX代碼的外面擴上一個小括號,這樣可以防止分號自動插入的bug。
JSX本身其實也是一種表達式
在編譯之後,JSX會被轉化為普通的JavaScript對象。所以可以在if或者for語句裏使用JSX,將它賦值給變量,當作參數傳入,作為返回值都是允許的:
function getGreeting(user) {
    if (user) {
        return <h1>Hello, {formatName(user)}!</h1>;
    }
    return <h1>Hello, Stranger.</h1>;
}

JSX防注入攻擊

在JSX中嵌入用户輸入是安全的:
const title = response.potentiallyMaliciousInput;
// 要接收到的可能含有危險內容的字符串放入大括號中,這是比較安全的做法
const element = <h1>{title}</h1>;
React DOM在渲染之前默認會過濾所有傳入的值。它可以確保應用不會被注入攻擊。所有的內容在渲染之前都被轉換成了字符串。這樣可以有效地防止XSS(跨站腳本攻擊)。

JSX表示對象

Babel轉譯器會把JSX轉換成一個名為React.createElement()的方法調用。
下面兩種代碼的作用是完全相同的:
const element = (
    <h1 className="greeting">
        Hello, world!
    </h1>
);

const element = React.createElement(
    'h1',
    { className: 'greeting' },
    'Hello, world!'
);
React.createElement()這個方法首先會進行一些避免bug的檢查,之後會返回一個類似下面例子的對象:
// 注意: 以下示例是簡化過的(不代表在 React 源碼中是這樣)
const element = {
    type: 'h1',
    props: {
        className: 'greeting',
        children: 'Hello, world'
    }
};
這樣的對象被稱為“React 元素”。它代表所有顯示在屏幕上的東西。React通過讀取這些對象來構建DOM並保持數據內容一致。
[1] 
參考資料