本篇咱們來了解React的JSX語法,在此以前,咱們先安裝React。html
這裏須要注意兩點:node
1.第一點記得安裝node,地址:https://nodejs.org/en/ 使用lts版本。react
2.安裝腳手架,地址:https://github.com/facebookin...。git
1.安裝腳手架github
npm install -g create-react-app
2.構建項目npm
create-react-app hello-react
3.啓動項目windows
輸入bash
cd hello-react yarn start
看到界面,創建樣板項目完成。app
1.npm 有時候慢,多等會。dom
2.可使用gitbash命令行,比cmd好用太多。
在安裝完畢之後讓咱們回到今天的主題,React的JSX語法。
我自己是很反對動不動就搞一個語言或者推倒一個東西重來的,一來是學習成本,二來是項目積澱清零。
可是我很喜歡JSX,這並不矛盾,由於它確實挺好用。
咱們看看JSX究竟是怎麼回事。
打開App.js,刪掉無用的東西變成小純潔,模仿以前原生星星組件寫法。
import React, { Component } from 'react' import ReactDOM from 'react-dom' class RatingStar extends Component { render () { return ( <div id ="box"> <h1>我是星星評分組件</h1> </div> ) } } ReactDOM.render( <RatingStar />, document.getElementById('root') ) export default RatingStar;
這裏的 Component就是至關於咱們本身寫那個component.js,react就是實現virtualDOM什麼的東西。
ReactDOM就至關於幫咱們把咱們要渲染的東西扔到root上面,粗略類比mounted方法(不是,可是先這麼理解就好。
那麼重點來了,return 小括號裏面的四不像是什麼?
你若是是一個字符串我能理解,你若是是一個對象我也能理解,但是你是JS裏面X html 就很差理解了。
其實這個就是咱們以前使用一個字符串描述一個組件。
` <div class='starbox'> <span data-index="0" class=${this.state.score >= 1 ? 'on' : ''}></span> <span data-index="1" class=${this.state.score >= 2 ? 'on' : ''}></span> <span data-index="2" class=${this.state.score >= 3 ? 'on' : ''}></span> <span data-index="3" class=${this.state.score >= 4 ? 'on' : ''}></span> <span data-index="4" class=${this.state.score >= 5 ? 'on' : ''}></span> <strong class='score'>${this.state.score}${this.props.unit}</strong> </div> `
可是你們看着一點也不優雅,重點是若是我操做不少東西,字符串拼接,加上變量,若是在寫if else判斷,那這個字符串的通用性和可維護性幾乎爲0.用字符串去模擬一個組件明顯太弱了。
那麼用什麼呢?
我看先看這段要模擬的東西。
<div id ="box"> <h1 className="title">我是星星評分組件</h1> </div>
每一個 DOM 元素的結構均可以用 JavaScript 的對象來表示。你會發現一個 DOM 元素包含的信息其實只有三個:標籤名,屬性,子元素。因此上面這個 HTML 全部的信息,咱們均可以用合法的 JavaScript 對象來表示:
{ tag: 'div', attrs: {id: 'box'}, children: [ { tag: 'h1', arrts: {className: 'title'}, children: ['我是星星評分組件'] } ] }
注意文本也是節點,可是你懂的,這麼寫比較反人類,咱們更喜歡這樣寫:
<div id ="box"> <h1>我是星星評分組件</h1> </div>
因此facebook就把 JavaScript 的語法擴展了一下,讓 JavaScript 語言可以支持這種直接在 JavaScript 代碼裏面編寫相似 HTML 標籤結構的語法,這樣寫起來就方便不少了。編譯的過程會把相似 HTML 的 JSX 結構轉換JavaScript 的對象結構。這就是大名鼎鼎的JSX。其實所謂的JSX就是 JavaScript 對象。
其實上面的JSX代碼,
render () { return ( <div id ="box"> <h1>我是星星評分組件</h1> </div> ) }
轉化爲js就是:
import React, { Component } from 'react' import ReactDOM from 'react-dom' class RatingStar extends Component { render () { return ( React.createElement( "div", {id:'box'}, React.createElement( "h1", { className: 'title' }, "我是星星評分組件" ) ) ) } } ReactDOM.render( React.createElement(RatingStar, null), document.getElementById('root') );
其中 createElement(a, b, c)
第一個參數 a:表示元素的類型,好比:h1, div 等。
第二個參數 b:表示該元素上的屬性,使用 JavaScript 對象方式表示。
第三個參數 c:表示該元素內部的內容,能夠是文字,能夠繼續嵌套另一個 React.createElement(a, b, c)
其實React.createElement 就至關於咱們以前原生js裏面的
const createDOMFromString = (domString) => { const div = document.createElement('div') div.innerHTML = domString return div }
只不過這裏用的是'createDOMFromObject',沒有這個函數,我編得理解意思就好。
這裏有一個個問題,爲何要用js對象模擬?而不是直接DOM操做?
1.由於操做對象先肯定好變化,要比直接修改DOM性能高太多。
2.由於不是全部的東西最後都要修改DOM或者渲染到界面。
JSX語法
其實JSX就是一個語法糖,在JS裏面寫普通的HTML,而後生成一個能夠描述UI樣子的JS對象,供給react去使用。那麼咱們就看看JSX怎麼用。
render裏面使用JSX最多見的狀況。
還記得咱們原生寫render的時候,最外層咱們包了一個div,因此同樣。
注意,必需要用一個外層的 JSX 元素把全部內容包裹起來。
render () { return ( <div id ="box"> <h1>我是星星評分組件</h1> </div> <div>我是其餘</div> ) }
<div id ="box"> <h1>我是星星評分組件</h1> <div>我是其餘</div> </div>
更多的時候JSX配合JS使用,其實就是把JS扔到{}裏面。
import React, { Component } from 'react' import ReactDOM from 'react-dom' class RatingStar extends Component { render () { const isHandsome = true; const Handsome = <span>彬哥長着一張盛世美顏</span> const noHandsome = <span> 彬哥長的天怒人怨</span> return ( <div id ="box"> <h1>我是星星評分組件</h1> <div> {1+1} </div> </div> ) } } ReactDOM.render( <RatingStar />, document.getElementById('root') ) export default RatingStar;
更多狀況是根據條件返回對應的輸出結果,好比:
import React, { Component } from 'react' import ReactDOM from 'react-dom' class RatingStar extends Component { render () { const isHandsome = true; const Handsome = <span>彬哥長着一張盛世美顏</span> const noHandsome = <span> 彬哥長的天怒人怨</span> return ( <div id ="box"> <h1>我是星星評分組件</h1> <div> {isHandsome?Handsome:noHandsome} </div> </div> ) } } ReactDOM.render( <RatingStar />, document.getElementById('root') ) export default RatingStar;
還有一個特別廣泛的用法,JSX裏面跑循環,
import React, { Component } from 'react' import ReactDOM from 'react-dom' class RatingStar extends Component { render() { const arrGood = ['高', '富', '帥']; const listItem = arrGood.map((good,index) => <li key={index}> {good} </li> ); return ( <div id="box"> <ul>{listItem}</ul> </div> ) } } ReactDOM.render( <RatingStar />, document.getElementById('root') ) export default RatingStar;
會這些就夠用了。
就記住一點就行,在JSX內寫JS,須要{}包起來。
在後面遇到JSX和ES6和組件中傳遞數據等結合的使用,容易跟解構析構混淆,可是你們記住上面的東西就不會出錯了。
咱們來回顧下,作個總結: