1、JSX介紹 javascript
2、React組件生命週期詳解 html
3、屬性、狀態的含義和用法 java
4、React中事件的用法 react
5、組件的協同使用 git
6、React中的雙向綁定 github
1、JSX介紹 算法
①定義 編程
JSX=JavaScript XML,是一種在React組件內部構建標籤的類XML語法。React在不使用JSX的狀況下同樣能夠工做,可是使用JSX能夠提升組件的可讀性,加強JS語義,結構清晰,抽象程度高,代碼模塊化。所以推薦在React中使用JSX。 數組
②特色 安全
一、元素名首字母大寫
二、符合嵌套規則
三、能夠寫入求值表達式
四、駝峯式命名
五、不能使用javascript原生函數的一些關鍵詞,如for和class。須要替換成htmlFor和className
③使用方法
一、使用動態值:JSX將兩個花括號之間的內容{...}渲染爲動態值,花括號指明瞭一個javascript上下文環境,花括號裏面能夠是一個變量,也能夠是函數。 例如:
var name=「winty」; <p>{name}</p>
function date(d){ return [ d.getFullYear(), d.getMonth()+1, d.getDate() ].join('-); }; <p>{date(new Date()}</p>
2.註釋:首先,在子節點中註釋要用大括號包裹起來,而後就能夠單行註釋/**/,也能夠多行註釋//。
var Hello=React.createClass({ render:function(){ return <p name="winty"> //set name Hello ,World /* 多行註釋 多行註釋 */ </p> } });
3.使用CSS內聯樣式
var style={ color:#000; }; React.render(<div style={style}>....</div>,document.body);
4.使用條件判斷
//方法1,三目運算符 var Hello=React.createClass({ render:function(){ return <p>Hello,{this.props.name?this.props.name : "LuckyWinty"}</p> } }); //方法2,if-else語句 var Hello1=React.createClass({ getName:function(){ if(this.props.name) return this.props.name; else return "LuckyWinty"; render:function(){ return <p>Hello,{this.getName}</p> } }); //方法3,使用邏輯||運算符 var Hello3=React.createClass({ render:function(){ return <p>Hello,{this.props.name||"LuckyWinty"}</p> } });
④非DOM屬性介紹
JSX中有3個非DOM屬性,分別是:dangerouslySetInnerHTML、ref、key。
dangerouslySetInnerHTML:在JSX中直接插入HTML代碼,可是若是能避免使用這個屬性則儘可能避免使用。
在完全的理解安全問題後果並正確地淨化數據以後,生成只包含惟一 key __html 的對象,而且對象的值是淨化後的數據。例如:
function createMarkup() { return {__html: 'First · Second'}; }; <div dangerouslySetInnerHTML={createMarkup()} />
ref:父組件引用子組件,你能夠經過在屬性中設置指望的引用名來定義一個引用。例如:
... render:function(){ return <div> <input ref="MyInput" .../> </div> } ... //而後你就能夠在組件中的任何地方使用this.refs.myInput獲取這個引用了
key:是一個可選的惟一標識符,經過給組件設置一個獨一無二的鍵,並確保它在一個渲染週期中保持一致,使得React可以更只能地決定應該重用一個組件仍是銷燬並重建一個組件,進而提升渲染性能。例如:
var Hello3=React.createClass({ render:function(){ return <ul> <li key="1">1</li> <li key="2">2</li> <li key="3">3</li> </ul> } });
更多詳細信息請參考:http://facebook.github.io/jsx/
2、React組件生命週期詳解
<script type="text/babel"> var Hello=React.createClass({ getDefaultProps:function(){ console.log("getDefaultProps, 1"); }, getInitialState:function(){ console.log("getInitialState, 2"); return null; }, componentWillMount:function(){ console.log("componentWillMount, 3"); }, render:function(){ console.log("render, 4"); return <p>Hi,LuckyWinty!</p> }, componentDidMount:function(){ console.log("componentDidMount, 5"); }, }); React.render(<Hello></Hello>,document.body); </script>
運行結果:
3、屬性、狀態的含義和用法
<Hello name="winty"/> 字符串 <Hello name={123}/> 大括號包裹的求值表達式 <Hello name={[1,2,3]}/> 傳入數組 <Hello name={winty}/> 變量
var props={ one:"123", two:"22" }
var instance=React.render(<HelloWorld></HelloWorld>,document.body);
instance.setProps({name:"winty"});
handleChange:function(event){ console.log(event.target.value); }
其餘不一樣類型的事件有不一樣的屬性,簡單瞭解一下
知道了事件的一些屬性,咱們就能夠很方便地在React中獲取這些屬性,進行一些邏輯的處理,實現一些複雜的業務功能、頁面效果等。
例如:咱們能夠利用鼠標事件屬性,實時顯示鼠標在某個區域的座標:
<script type="text/jsx"> var HelloWorld = React.createClass({ getInitialState: function () { return { x: 0, y: 0 } }, handleMouseMove: function (event) { this.setState({ x: event.clientX, y: event.clientY }); }, render: function () { return <div onMouseMove={this.handleMouseMove} style={{ height: '500px', width: '500px', backgroundColor: 'gray' }}> {this.state.x + ', ' + this.state.y} </div>; }, }); React.render(<HelloWorld></HelloWorld>, document.body); </script>
5、組件的協同使用
①組件嵌套使用:也就是說,用一個父組件把子組件包裹起來,本質就是父子關係。以下圖描述:
實例代碼:
var React = require('react'); var CommentList=require('./CommentList.jsx'); var CommentForm=require('./commentFrom.jsx'); var CommentBox = React.createClass({ render: function() { return ( <div className="commentBox"> <h1>Comments</h1> <CommentList /> //這是一個組件 <CommentForm /> //這是另外一個組件 </div> ); } }); module.exports = CommentBox;
②Mixin:也就是能夠把相同的代碼抽象出來,封裝成一個函數,而後再調用。
var Time=React.createClass({ mixins:[IntervalMixin(1000)], getInitialState:function(){ return {secondElapsed:0}; }, onTick:function(){ this.setState({secondElapsed:this.state.secondElapsed+1}); }, render:function(){ return ( <div>Seconds Elapsed:{this.state.secondsElapsed}</div> ); } });
mixin至關簡單,它們就是混合進組件類中的對象而已。React在這方面實現得更加深刻,它能防止靜默函數覆蓋,同時還支持多個mixin混合。可是這些功能在別的系統中可能引發衝突。例如:
React.createClass({ mixins:[{ getInitialState:function(){ return {a:1}} }], getInitialState:function(){ return {b:2}} });
這樣在mixin和組件類中同時定義了getInitialState方法,獲得的初始state是{a:1,b:2}.若是mixin中的方法和組件類中的方法返回的對象中存在重複的鍵,React會拋出一個錯誤來警示這個問題。
6、React中的雙向綁定
React創立的理念跟angular那些框架就是不一樣的,React是單向數據綁定的。那麼怎麼實現像angular那樣的雙向綁定效果呢?看代碼:
<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>React中的雙向數據綁定</title> </head> <body> <script src="./react-0.13.2/react-0.13.2/build/react-with-addons.js"></script> <script src="./react-0.13.2/react-0.13.2/build/JSXTransformer.js"></script> <script type="text/jsx"> var BindingMixin = { handleChange: function(key) { var that = this var newState = {} return function(event) { newState[key] = event.target.value that.setState(newState) } } } var BindingExample = React.createClass({ mixins: [React.addons.LinkedStateMixin], getInitialState: function() { return { text: '', comment: '', } }, render: function() { return <div> <input type="text" placeholder="請輸入內容" valueLink={this.linkState('text')} /> <textarea valueLink={this.linkState('comment')}></textarea> <h3>{this.state.text}</h3> <h3>{this.state.comment}</h3> </div> } }) React.render(<BindingExample></BindingExample>, document.body); </script> </body> </html>
效果圖(沒有CSS樣式,有點不優雅,見諒):
更多學習demo已上傳至:https://github.com/LuckyWinty/ReactStudyDemo,歡迎參考!
參考資料:
《React引領將來的用戶界面開發框架》
極客學院視頻課程
PS:react.js模塊化開發及打包方式歡迎參考個人上一篇博文《React.js入門必須知道的那些事》,後續會有更多深刻的學習,歡迎你們給我學習意見^_^