摘要:認識引子最近幾個月做的一個項目,使用了技術(shù)體系,自然而然的用到了。下面就總結(jié)一下自己對的認識。而這無疑增加了框架的門檻和復雜度。在被渲染之前,所有的數(shù)據(jù)都被轉(zhuǎn)義成為了字符串處理。以避免跨站腳本攻擊。表示對象將編譯成調(diào)用。
JSX認識 引子
什么是JSX最近幾個月做的一個項目,使用了react技術(shù)體系,自然而然的用到了JSX。下面就總結(jié)一下自己對JSX的認識。
即JavaScript XML,一種在React組建內(nèi)部構(gòu)建標簽的類XML語法。(增強React程序組件的可讀性)
JSX可以看作JavaScript的拓展,看起來有點像XML。使用React,可以進行JSX語法到JavaScript的轉(zhuǎn)換。
下面我們來看一下一個簡單的例子。
考慮一下這個變量的聲明:
const element =Hello, world!
;
這個標簽語法既不是字符串也不是HTML,這就是JSX。它是JavaScript的一種擴展語法。
JSX小例子我們先從官網(wǎng)的一個最簡單的例子說起,為了讓大家能夠直接在本地運行,我貼出了完整的代碼如下:
Hello React!
大家可以直接粘貼上面代碼,保存在本地的一個test.html文件里,雙擊打開后,在瀏覽器里輸出:
Hello, world!
我們看到
const element =Hello, world!
;
element變量的聲明就是用了JSX語法,HTML語言直接寫在JavaScript語言之中,不加任何引號。
注意:
script 標簽的 type 屬性為 text/babel,這是React 獨有的 JSX 語法,跟 JavaScript 不兼容。凡是在頁面中直接使用 JSX 的地方,都要加上 type="text/babel"。
一共用了三個庫: react.js 、react-dom.js 和 browser.min.js ,它們必須首先加載。其中,react.js 是 React 的核心庫,react-dom.js 是提供與 DOM 相關(guān)的功能, browser.min.js的作用是將 JSX 語法轉(zhuǎn)為 JavaScript 語法。
js構(gòu)造dom比如要創(chuàng)建一個dom超鏈接:
React
我們在原生DOM中,用js構(gòu)造dom的方式是這樣的:
var a = document.createElement("a") a.setAttribute("class", "link") a.setAttribute("href", "https://github.com/facebook/react") a.appendChild(document.createTextNode("React"))
這個代碼應該是大家比較熟悉的。當你在寫代碼的時候會不會感覺很繁瑣呢,我們可以封裝一下:
//第一個參數(shù)為node名 //第二個參數(shù)為一個對象,dom屬性與事件都以鍵值對的形式書寫 //第三個到第n個為子node,它們將按參數(shù)順序出現(xiàn), //在這個例子中只有一個子元素,而且也是文本元素,所以可以直接書寫,否則還得React.createElement一下 var a = React.createElement("a", { className: "link", href: "https://github.com/facebook/react" }, "React")
看完這個代碼,是不是感覺一下子要簡潔的多。
現(xiàn)在有個編譯工具,可以讓你用html語法來寫React.createElement,部署上線前編譯回來。你愿意嗎?
不管你的答案是什么,但這就是jsx的一半真相。
前面已經(jīng)回答過,在使用React的時候,可以不使用JSX,大概這樣寫:
var child1 = React.createElement("li", null, "First Text Content"); var child2 = React.createElement("li", null, "Second Text Content"); var root = React.createElement("ul", { className: "my-list" }, child1, child2);
使用這樣的機制,我們完全可以用JavaScript構(gòu)建完整的界面DOM樹,正如我們可以用JavaScript創(chuàng)建真實DOM。但這樣的代碼可讀性并不好,于是React發(fā)明了JSX,利用我們熟悉的HTML語法來創(chuàng)建虛擬DOM:
var root =(
總結(jié)
這兩段代碼是完全等價的,后者將XML語法直接加入到JavaScript代碼中,讓你能夠高效的通過代碼而不是模板來定義界面。
之后JSX通過翻譯器轉(zhuǎn)換到純JavaScript再由瀏覽器執(zhí)行。
注意
在實際開發(fā)中,JSX在產(chǎn)品打包階段都已經(jīng)編譯成純JavaScript,JSX的語法不會帶來任何性能影響。
另外,由于JSX只是一種語法,因此JavaScript的關(guān)鍵字class, for等也不能出現(xiàn)在XML中,而要如例子中所示,使用className, htmlFor代替,這和原生DOM在JavaScript中的創(chuàng)建也是一致的。
相信大家在看完了上面的這些舉例后,心中的疑問自然而然就迎刃而解了。
因此,JSX本身并不是什么高深的技術(shù),可以說只是一個比較高級但很直觀的語法糖。它非常有用,卻不是一個必需品,沒有JSX的React也可以正常工作:只要你樂意用JavaScript代碼去創(chuàng)建這些虛擬DOM元素。
為什么使用JSX 拋出疑問看了上面的這些簡單的demo,大家肯定會拋出這樣的疑問:
為什么React官方推薦使用JSX呢?
等等。。。
使用React,不一定非要使用JSX語法,可以使用原生的JS進行開發(fā)。
但是React作者強烈建議我們使用JSX,因為:
JSX在定義類似HTML這種樹形結(jié)構(gòu)時,十分的簡單明了。
簡明的代碼結(jié)構(gòu)更利于開發(fā)和維護。
XML有著開閉標簽,在構(gòu)建復雜的樹形結(jié)構(gòu)時,比函數(shù)調(diào)用和對象字面量更易讀。
可能說這些你會感覺比較模糊,下面來舉幾個看得見的例子。
前端界面的最基本功能在于展現(xiàn)數(shù)據(jù),為此大多數(shù)框架都使用了模板引擎,
在AngularJS中:在EmberJS中:Welcome back, {{person.firstName}} {{person.lastName}}!Please log in.
{{#if person}} Welcome back, {{person.firstName}} {{person.lastName}}! {{else}} Please log in. {{/if}}總結(jié)
模板可以直觀的定義UI來展現(xiàn)Model中的數(shù)據(jù),你不必手動的去拼出一個很長的HTML字符串,幾乎每種框架都有自己的模板引擎。
傳統(tǒng)MVC框架強調(diào)界面展示邏輯和業(yè)務邏輯的分離,因此為了應對復雜的展示邏輯需求,這些模板引擎幾乎都不可避免的需要發(fā)展成一門獨立的語言。
如上面代碼所示,每個框架都有自己的模板語言語法。而這無疑增加了框架的門檻和復雜度。
使用JSX
正因為如此,React直接放棄了模板而發(fā)明了JSX??瓷先ズ芟衲0逭Z言,但其本質(zhì)是通過代碼來構(gòu)建界面,這使得我們不再需要掌握一門新的語言就可以直觀的去定義用戶界面:掌握了JavaScript就已經(jīng)掌握了JSX。
這里不妨再引用之前文章舉過的例子,在展示一個列表時,模板語言通常提供名為Repeat的語法,例如在Angular中:
而使用JSX,則代碼如下:
var lis = this.todoList.todos.map(function (todo) { return (
可以看到,JSX完美利用了JavaScript自帶的語法和特性,我們只要記住HTML只是代碼創(chuàng)建DOM的一種語法形式,就很容易理解JSX。
而這種使用代碼構(gòu)建界面的方式,完全消除了業(yè)務邏輯和界面元素之間的隔閡,讓代碼更加直觀和易于維護。
你可以用 花括號 把任意的 JavaScript 表達式 嵌入到 JSX 中。
例如,2 + 2, user.firstName, 和 formatName(user),這些都是可用的表達式。
function formatName(user) { return user.firstName + " " + user.lastName; } const user = { firstName: "Harper", lastName: "Perez" }; const element = (JSX 也是一個表達式Hello, {formatName(user)}!
); ReactDOM.render( element, document.getElementById("root") );
編譯之后,JSX 表達式就變成了常規(guī)的 JavaScript 對象。
這意味著你可以在 if 語句或者是 for 循環(huán)中使用 JSX,用它給變量賦值,當做參數(shù)接收,或者作為函數(shù)的返回值。
function getGreeting(user) { if (user) { return用 JSX 指定屬性值Hello, {formatName(user)}!
; } returnHello, Stranger.
; }
您可以使用雙引號來指定字符串字面量作為屬性值:
const element = ;
您也可以用花括號嵌入一個 JavaScript 表達式作為屬性值:
const element = 立即閉合它:const element = ;JSX 標簽可能包含子元素:
const element = (JSX 防止注入攻擊);Hello!
Good to see you here.
在JSX中嵌入用戶輸入是安全的:
const title = response.potentiallyMaliciousInput; // This is safe: const element ={title}
;默認情況下, 在渲染之前, React DOM 會格式化(escapes) JSX中的所有值。
JSX 表示對象
從而保證用戶無法注入任何應用之外的代碼。
在被渲染之前,所有的數(shù)據(jù)都被轉(zhuǎn)義成為了字符串處理。 以避免 XSS(跨站腳本) 攻擊。Babel 將JSX編譯成 React.createElement() 調(diào)用。
下面的兩個例子是是完全相同的:
const element = (Hello, world!
);const element = React.createElement( "h1", {className: "greeting"}, "Hello, world!" );React.createElement() 會執(zhí)行一些檢查來幫助你編寫沒有bug的代碼,但基本上它會創(chuàng)建一個如下所示的對象:
// 注意: 這是簡化的結(jié)構(gòu) const element = { type: "h1", props: { className: "greeting", children: "Hello, world" } };結(jié)尾關(guān)于JSX的介紹大概講到這里,看完這篇文章后,希望大家能能夠了解什么是JSX,React為什么推薦使用JSX等問題。
在下一節(jié)中來探索如何將 React 元素渲染到 DOM 上。
歡迎大家訪問我的blog,有更精彩的文章吆!
參考鏈接https://facebook.github.io/re...
http://www.css88.com/react/do...
http://www.infoq.com/cn/artic...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/82871.html
摘要:希望大家在這浮夸的前端圈里,保持冷靜,堅持每天花分鐘來學習與思考。 今天的React題沒有太多的故事…… 半個月前出了248個Vue的知識點,受到很多朋友的關(guān)注,都強烈要求再出多些React相前的面試題,受到大家的邀請,我又找了20多個React的使用者,他們給出了328道React的面試題,由我整理好發(fā)給大家,同時發(fā)布在了前端面試每日3+1的React專題,希望對大家有所幫助,同時大...
摘要:前面我們已經(jīng)說了大部分的核心內(nèi)容,接下來我們就說說如何用開發(fā)實際項目。因為和結(jié)合很緊密,資料也很多,而且我會找機會專門說下這方面的知識,所以我們將重點放到如何用結(jié)合上來。所以前面打牢基礎(chǔ),現(xiàn)在我們開始實際組建工作流。 前面我們已經(jīng)說了大部分typescript的核心內(nèi)容,接下來我們就說說如何用typescript開發(fā)實際項目。 因為angular和typescript結(jié)合很緊密,資料也...
摘要:都會造成錯誤,注意一定一定嚴格的用,所以我建議直接復制我的。因為用的話他會轉(zhuǎn)義代碼,寫不寫其實一個樣。不可避免的,構(gòu)建肯定是要用到的。這個時候一般用的是在外面保存然后里面調(diào)用第二個坑更隱蔽。 目標人群 獻給熟悉基礎(chǔ)的React語法的剛接觸React的同學~ 如果你已經(jīng)寫過半年以上的React那也不用看了,畢竟我水平并不高 Whats React React 是一個不存在的網(wǎng)絡(luò)公司Fac...
摘要:面對越來越火的,我們公司今年也逐漸開始擁抱。綜上所述,我個人覺得是要刪除相關(guān)的東西,降低項目復雜度。但是有一個例外情況。這個配置項有三個值可選擇,分別是和。模式會生成,在使用前不需要再進行轉(zhuǎn)換操作了,輸出文件的擴展名為。 拋轉(zhuǎn)引用 現(xiàn)在越來越多的項目放棄了javascript,而選擇擁抱了typescript,就比如我們熟知的ant-design就是其中之一。面對越來越火的typesc...
閱讀 4217·2023-04-26 02:13
閱讀 2322·2021-11-08 13:13
閱讀 2821·2021-10-11 10:59
閱讀 1804·2021-09-03 00:23
閱讀 1366·2019-08-30 15:53
閱讀 2366·2019-08-28 18:22
閱讀 3108·2019-08-26 10:45
閱讀 798·2019-08-23 17:58