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