React.js

1、初識reactcss

 一、Angular組件複雜,不利於重用。html

 二、React不是一個完整的MVC、MVVM框架node

 三、React跟Web Components 不衝突react

 四、Ract的特色就是「輕」webpack

facebook 獨立、小巧、快速、創新git

 五、組件化的開發思路(高度可重用)github

2、React應用場景web

一、複雜場景下的高性能數據庫

二、重用組件庫,組件組合npm

三、「懶」——少作無用功

3、前置知識

一、JS、CSS基礎

二、Sass、Compass

三、YEOman、Grunt、Webpack

四、CommonJS,NodeJS

五、Git,GitHub

4、React-JSX-Style

一、進React 官網 進reactJSFiddle

二、JSX 其中X是xml  語法糖,糖衣語法——對功能無影響

爲了起做用,須要解析js,引入react.js和JSXTransformer.js

在script標籤中,type="text/jsx"

react Compoents 自定義標籤

定義自定義標籤:

var Hello=React.creareClass({

  render:function(){

     var styleObj={

     color:'red',

    fontSize:'44px'

    };

  return <div className="alert-text">Hello {this.props.title}{this.props.name}</div>;

}

});

呈現到頁面:調用React.render(<Hello name="world" title="MR"/>,

document.getElementById('container')  //呈現到哪裏

)

this:當前react Components(組件的意思)實例

props:在使用react Componemts時,在其上面添加的屬性的集合

樣式編寫:

   一、爲標籤添加class,可是不能直接寫class,應寫className(並在css文件中寫相應樣式)

   二、直接內聯樣式,但不能寫成style=「color:red;」應該寫成style={color:‘red’} red要寫成字符串形式

 

5、React-Components-Lifecycle(從建立到消失生命週期)

 一、React-Components在瀏覽器中存在的生命週期三個狀態

  1)Mounted(安裝):React Components 被render解析生成對應的DOM節點並被插入瀏覽器的DOM結構的一個過程

 2)update(更新) :一個mounred的React Components被從新render(中文意思爲使成爲)的過程

 3)unmounted (卸載):一個mounted的React Components對應的DOM節點被從DoM結構中移除的這樣一個過程。

每個狀態React都封裝了對應的hook函數

var Hello=React.creareClass({

      getInitialState:function(){

alert(init);

  return {

    opacity:1.0,

    fontSize:'12px',

      };

},

  render:function(){

return <div style={{opacity:this.state.opacity,fontSize:this.state.fontSize}}>Hello {this.props.title}{this.props.name}</div>;

},

componentWillMount:function(){

  alert('will');

},

componentDidMount:function(){

  alert('did');

      var_self=this;  //留住this 或者用bind(this)——bind是ES5纔有的

       window.setTimeout(function(){

  _self.setState({

    opacity:0.5,

           fontSize:'44px'

    });

  },1000);

}};

Mounting能夠調用的函數:getDefaultProps()、getInitialState()、componentWillMount

render、componentDidmount

Updating能夠調用的函數:componentWillReceivePropos、shouldComponentUpdate、

componentWillUpdate、render、componentDidUpdate

Unmounting能夠調用的函數:componentWillUnmount

 6、React-Event-listener  

React Components 事件綁定與處理;

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="js/react.js"></script>
<script src="js/JSXTransformer.js"></script>
</head>
<body>
<div id="container"></div>
<script type="text/jsx">
var TestClickComponent=React.createClass({
handleClick:function(event){
var tipE=React.findDOMNode(this.refs.tip);
if(tipE.style.display==='none'){
tipE.style.display='inline';
}else{
tipE.style.display='none';
}
event.stopPropagation();
event.preventDefault();
},
render:function(){
return (
<div>
<button onClick={this.handleClick}>顯示|隱藏</button><span ref="tip">測試點擊</span>
</div>
);
}
});
var TestInputComponent=React.createClass({
getInitialState:function(){
return {
inputContent:''
}
},
changeHandler:function(event){
this.setState({
inputContent:event.target.value
});
event.stopPropagation();
event.preventDefault();
},
render:function(){
return (
<div>
<input type="text" onChange={this.changeHandler}/><span>{this.state.inputContent}</span>
</div>
);
}
});
React.render(
<div>
<TestClickComponent/>
<TestInputComponent/>
</div>,
document.getElementById('container')
);
</script>
</body>
</html>

 7、react 的基礎學習

 一、React 簡介

  React 是一個用於構建用戶界面的JAVASCRIPT庫

  React 主要用於構建UI,不少人認爲React是MVC中的v(視圖)

  React 擁有較高的性能,代碼邏輯很是簡單,愈來愈多的人已經開始關注和使用它

    (1)React特色

       1)聲明式設計 ——React採用聲明範式,能夠輕鬆描述應用

     2)高效——React 經過對 DOM的模擬,最大限度減小與DOM的交互

             3) 靈活 ——React 能夠與已知的庫或框架很好地配合

     4) JSX——JSX 是JavaScript 語法的擴展。React 開發不必定使用JSX,但咱們建議使用它

     5)  組件 ——經過React 構建組件,使得代碼更加容易獲得服用,可以很好的應用在大項目的開發中

        6) React 實現了單向響應的數據流,從而減小了重複代碼,這也是它比傳統數據綁定更簡單。

 (2)React第一個實例

      <div id="example"></div> <script type="text/babel"> ReactDOM.render( <h1>Hello, world!</h1>,

    document.getElementById('example') ); </script>

  解析:咱們引入了三個庫:react.min.js、react-dom.min.js 和 babel.min.js

       若是咱們須要使用JSX,則<script>標籤的type屬性須要設置爲text/babel

     react.min.js ——React 的核心庫

  react-dom.min.js——提供與DOM相關的功能

    babel —— Babel 能夠將ES6 代碼轉爲 ES5代碼,這樣咱們就能在目前不支持ES6瀏覽器上執行React代碼,

   Babel 中內嵌了對JSX的支持。經過將Babel 和 babel-sublime 包一同使用可讓源碼的語法渲染

    上升到一個全新的水平。

 二、基於npm的React開發環境搭建

 

第一步、安裝全局包
$ npm install babel -g
$ npm install webpack -g
$ npm install webpack-dev-server -g
第二步、建立根目錄
建立一個根目錄,目錄名爲:reactApp,再使用 npm init 初始化,生成 package.json 文件:

$ mkdir reactApp
$ cd reactApp/
$ npm init
name: (reactApp) runoob-react-test
version: (1.0.0)
description: cllgeek
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC)
About to write to /Users/tianqixin/www/reactApp/package.json:

{
"name": "react-runoob",
"version": "1.0.0",
"description": "cllgeek test",
"main": "index.js",
"scripts": {
"start": "webpack-dev-server --hot"
},
"author": "",
"license": "ISC",
"dependencies": {
"react": "^0.14.8",
"react-dom": "^0.14.8"
}
}

Is this ok? (yes)
第三步、添加越來包及插件
由於咱們要使用 React, 因此咱們須要先安裝它,–save 命令用於將包添加至 package.json 文件。

$ npm install react --save
$ npm install react-dom --save
同時咱們也要安裝一些 babel 插件

$ npm install babel-core
$ npm install babel-loader
$ npm install babel-preset-react
$ npm install babel-preset-es2015
第四步、建立文件
接下來咱們建立一些必要文件:

$ touch index.html
$ touch App.jsx
$ touch main.js
$ touch webpack.config.js
第五步、設置編譯器,服務器,載入器
打開 webpack.config.js 文件添加如下代碼:

var config = {
entry: './main.js',

output: {
path:'./',
filename: 'index.js',
},

devServer: {
inline: true,
port: 7777
},

module: {
loaders: [ {
test: /.jsx?$/,
exclude: /node_modules/,
loader: 'babel',

query: {
        presets: ['es2015', 'react']
     }
  }]

}

}

module.exports = config;
entry: 指定打包的入口文件 main.js。
output:配置打包結果,path定義了輸出的文件夾,filename則定義了打包結果文件的名稱。
devServer:設置服務器端口號爲 7777,端口後你能夠本身設定 。
module:定義了對模塊的處理邏輯,這裏能夠用loaders定義了一系列的加載器,以及一些正則。當須要加載的文件匹配test的正則時,就會調用後面的loader對文件進行處理,這正是webpack強大的緣由。
如今打開 package.json 文件,找到 「scripts」 中的 「test」 「echo \」Error: no test specified\」 && exit 1″ 使用如下代碼替換:

"start": "webpack-dev-server --hot"
替換後的 package.json 文件 內容以下:

$ cat package.json
{
"name": "runoob-react-test",
"version": "1.0.0",
"description": "cllgeek test",
"main": "index.js",
"scripts": {
"start": "webpack-dev-server --hot"
},
"author": "",
"license": "ISC",
"dependencies": {
"react": "^0.14.7",
"react-dom": "^0.14.7"
}
}
如今咱們可使用 npm start 命令來啓動服務。–hot 命令會在文件變化後從新載入,這樣咱們就不須要在代碼修改後從新刷新瀏覽器就能看到變化。

三、React  JSX

React 使用 JSX 來替代常規的 JavaScript。

JSX 是一個看起來很像 XML 的 JavaScript 語法擴展。

咱們不須要必定使用 JSX,但它有如下優勢:

  • JSX 執行更快,由於它在編譯爲 JavaScript 代碼後進行了優化。
  • 它是類型安全的,在編譯過程當中就能發現錯誤。
  • 使用 JSX 編寫模板更加簡單快速。

 1)使用JSX

  JSX 看起來相似 HTML ,咱們能夠看下實例:

    ReactDOM.render( <h1>Hello, world!</h1>, document.getElementById('example') );

   

咱們能夠在以上代碼中嵌套多個 HTML 標籤,須要使用一個 div 元素包裹它,實例中的 p 元素添加了自定義屬性 data-myattribute,添加自定義屬性須要使用 data- 前綴。

ReactDOM.render( <div> <h1>菜鳥教程</h1> <h2>歡迎學習 React</h2> <p data-myattribute = "somevalue">這是一個很不錯的 JavaScript 庫!</p> </div> , document.getElementById('example') );

 2)獨立文件

 你的 React JSX 代碼能夠放在一個獨立文件上,例如咱們建立一個 helloworld_react.js 文件,代碼以下:

   ReactDOM.render( <h1>Hello, world!</h1>, document.getElementById('example') );

而後在 HTML 文件中引入該 JS 文件:

  <body> <div id="example"></div> <script type="text/babel" src="helloworld_react.js"></script> </body>

 3)JavaScript 表達式

咱們能夠在 JSX 中使用 JavaScript 表達式。表達式寫在花括號 {} 中。實例以下:

ReactDOM.render( <div> <h1>{1+1}</h1> </div> , document.getElementById('example')

在 JSX 中不能使用 if else 語句,但可使用 conditional (三元運算) 表達式來替代。如下實例中若是變量 i 等於 1 瀏覽器將輸出 true, 若是修改 i 的值,則會輸出 false.

ReactDOM.render(
<div>
<h1>react的學習</h1>
<h2>{i ===1 ? 'true': 'false'}</h2>
<p data-myattribute = "somevalue">{4*5}</p>
</div>,
document.getElementById('example')
);

  4)樣式

   React 推薦使用內聯樣式。咱們可使用 camelCase 語法來設置內聯樣式. React 會在指定元素數字後自動添加 px 。如下實例演示了爲 h1 元素添加 myStyle 內聯樣式:

  

var myStyle = {
fontSize:100,
color:'#e4393c'
};
var i=1;
ReactDOM.render(
<div>
<h1 style = {myStyle}>小薇薇的學習</h1>
<h2>{i ===1 ? 'true': 'false'}</h2>
<p data-myattribute = "somevalue">{4*5}</p>
</div>,
document.getElementById('example')
);

5)註釋

註釋須要寫在花括號中,實例以下:

ReactDOM.render( <div> <h1>菜鳥教程</h1> {/*註釋...*/} </div>, document.getElementById('example') );

 6)數組

JSX 容許在模板中插入數組,數組會自動展開全部成員:

var arr = [ <h1>菜鳥教程</h1>, <h2>學的不只是技術,更是夢想!</h2>, ]; ReactDOM.render( <div>{arr}</div>, document.getElementById('example') );

 7) html 標籤 vs React 組件

  React 能夠渲染 HTML 標籤 (strings) 或 React 組件 (classes)。

  要渲染 HTML 標籤,只需在 JSX 裏使用小寫字母的標籤名。

var myDivElement = <div className="foo">你好</div>;
ReactDOM.render(myDivElement, document.getElementById('example'));

     要渲染 React 組件,只需建立一個大寫字母開頭的本地變量。

var MyComponent =React.createClass({
render: function() {
return <h1>Hello World!</h1>;
}
});
var myElement = <MyComponent/>;
ReactDOM.render(myElement, document.getElementById('example'));
//或者去掉變量myElement,直接寫入 下面
ReactDOM.render(<MyComponent/>, document.getElementById('example'));

React 的 JSX 使用大、小寫的約定來區分本地組件的類和 HTML 標籤。

注意:

因爲 JSX 就是 JavaScript,一些標識符像 class 和 for 不建議做爲 XML 屬性名。做爲替代,React DOM 使用 className 和 htmlFor 來作對應的屬性。

  須要注意的問題:

 

關於React註釋的問題:

一、在標籤內部的註釋須要花括號

二、在標籤外的的註釋不能使用花括號

關於React入門容易出錯的地方:

如同上面說的,代碼中嵌套多個 HTML 標籤,須要使用一個標籤元素包裹它

 

四、React 組件

本章節咱們將討論如何使用組件使得咱們的應用更容易來管理。

接下來咱們封裝一個輸出 "Hello World!" 的組件,組件名爲 HelloMessage:

  var HelloMessage = React.createClass({ render: function() { return <h1>Hello World!</h1>; } }); ReactDOM.render( <HelloMessage />, document.getElementById('example') );

React.createClass 方法用於生成一個組件類 HelloMessage

<HelloMessage /> 實例組件類並輸出信息。

  注意,原生 HTML 元素名以小寫字母開頭,而自定義的 React 類名以大寫字母開頭,好比 HelloMessage 不能寫成 helloMessage。除此以外還須要注意組件類只能包含一個頂層標籤,不然也會報錯。

若是咱們須要向組件傳遞參數,可使用 this.props 對象,實例以下:

var MyComponent =React.createClass({
render: function() {
return <h1>Hello {this.props.name}</h1>;
}
});
ReactDOM.render(<MyComponent name="mary"/>,
document.getElementById('example'));

以上實例中 name 屬性經過 this.props.name 來獲取。

注意,在添加屬性時, class 屬性須要寫成 className ,for 屬性須要寫成 htmlFor ,這是由於 class 和 for 是 JavaScript 的保留字。

  複合組件

咱們能夠經過建立多個組件來合成一個組件,即把組件的不一樣功能點進行分離。

如下實例咱們實現了輸出網站名字和網址的組件:

var WebSite = React.createClass({
render: function() {
return (
<div>
<Name name={this.props.name} />
<Link site={this.props.site} />
</div>
);
}
});

var Name = React.createClass({
render: function() {
return (
<h1>{this.props.name}</h1>
);
}
});

var Link = React.createClass({
render: function() {
return (
<a href={this.props.site}>
{this.props.site}
</a>
);
}
});

ReactDOM.render(
<WebSite name="菜鳥教程" site=" http://www.runoob.com" />,
document.getElementById('example')
);

  五、React State(狀態)

  

React 把組件當作是一個狀態機(State Machines)。經過與用戶的交互,實現不一樣狀態,而後渲染 UI,讓用戶界面和數據保持一致。

React 裏,只需更新組件的 state,而後根據新的 state 從新渲染用戶界面(不要操做 DOM)。

如下實例中建立了 LikeButton 組件,getInitialState 方法用於定義初始狀態,也就是一個對象,這個對象能夠經過 this.state 屬性讀取。當用戶點擊組件,致使狀態變化,this.setState 方法就修改狀態值,每次修改之後,自動調用 this.render 方法,再次渲染組件

var LikeButton = React.createClass({
/*初始化liked的值*/
getInitialState:function(){
return {liked:false};
},
/*改變liked的狀態值*/
handleClick:function(event){
this.setState ({liked:!this.state.liked})
},
render:function(){
var text = this.state.liked ? '喜歡':'不喜歡';
return (
<p onClick = {this.handleClick}>
你<b>{text}</b> 我。點我切換狀態。
</p>
);
}
});
ReactDOM.render(
<LikeButton/>,
document.getElementById("example")
);

六、React Props

state 和 props 主要的區別在於 props 是不可變的,而 state 能夠根據與用戶交互來改變。這就是爲何有些容器組件須要定義 state 來更新和修改數據。 而子組件只能經過 props 來傳遞數據。

如下實例演示瞭如何在組件中使用 props:

var HelloMessage = React.createClass({ render: function() { return <h1>Hello {this.props.name}</h1>; } }); ReactDOM.render( <HelloMessage name="Runoob" />, document.getElementById('example')

實例中 name 屬性經過 this.props.name 來獲取。  

  1)默認props

你能夠經過 getDefaultProps() 方法爲 props 設置默認值,實例以下:

var HelloWorld = React.createClass({
getDefaultProps:function(){
return {
name:"marry"
}
},
render:function(){
return <h1>hello {this.props.name}</h1>
}
});
ReactDOM.render(<HelloWorld name={"Bob"}/>,
document.getElementById("example")
);

//當 <HelloWorld />中有name值時,顯示此值,沒有時,就顯示默認的props的name值,即顯示 marry

   2)state 和 Props

   如下實例演示瞭如何在應用中組合使用 state 和 props 。咱們能夠在父組件中設置 state, 並經過在子組件上使用 props 將其傳遞到子組件上。在 render 函數中, 咱們設置 name 和 site 來獲取父組件傳遞過來的數據。

  

var WebSite = React.createClass({
getInitialState:function(){
return {
name:"marry",
site:"http:www.baidu.com"
};
},
render:function(){
return (
<div>
<Name name={this.state.name}/>
<Link site={this.state.site}/>
</div>
);
}


});
var Name = React.createClass({
render:function(){
return (
<h1>{this.props.name}</h1>
);
}
});
var Link = React.createClass({
render:function(){
return (
<a href={this.props.site}>
{this.props.site}
</a>
);
}
});
ReactDOM.render(
<WebSite />,
document.getElementById("example")
);

  3) Props 驗證 

Props 驗證使用 propTypes,它能夠保證咱們的應用組件被正確使用,React.PropTypes 提供不少驗證器 (validator) 來驗證傳入數據是否有效。當向 props 傳入無效數據時,JavaScript 控制檯會拋出警告。

如下實例建立一個 Mytitle 組件,屬性 title 是必須的且是字符串,非字符串類型會自動轉換爲字符串 (沒法轉爲字符串類型時就會報錯):

 

var title = "菜鳥教程";
// var title = 123;
var MyTitle = React.createClass({
propTypes: {
title: React.PropTypes.string.isRequired,
},

render: function() {
return <h1> {this.props.title} </h1>;
}
});
ReactDOM.render(
<MyTitle title={title} />,
document.getElementById('example')
);

更多驗證器說明以下:

React.createClass({ propTypes: { // 能夠聲明 prop 爲指定的 JS 基本數據類型,默認狀況,這些數據是可選的 optionalArray: React.PropTypes.array, optionalBool: React.PropTypes.bool, optionalFunc: React.PropTypes.func, optionalNumber: React.PropTypes.number, optionalObject: React.PropTypes.object, optionalString: React.PropTypes.string, // 能夠被渲染的對象 numbers, strings, elements 或 array optionalNode: React.PropTypes.node, // React 元素 optionalElement: React.PropTypes.element, // 用 JS 的 instanceof 操做符聲明 prop 爲類的實例。 optionalMessage: React.PropTypes.instanceOf(Message), // 用 enum 來限制 prop 只接受指定的值。 optionalEnum: React.PropTypes.oneOf(['News', 'Photos']), // 能夠是多個對象類型中的一個 optionalUnion: React.PropTypes.oneOfType([ React.PropTypes.string, React.PropTypes.number, React.PropTypes.instanceOf(Message) ]), // 指定類型組成的數組 optionalArrayOf: React.PropTypes.arrayOf(React.PropTypes.number), // 指定類型的屬性構成的對象 optionalObjectOf: React.PropTypes.objectOf(React.PropTypes.number), // 特定 shape 參數的對象 optionalObjectWithShape: React.PropTypes.shape({ color: React.PropTypes.string, fontSize: React.PropTypes.number }), // 任意類型加上 `isRequired` 來使 prop 不可空。 requiredFunc: React.PropTypes.func.isRequired, // 不可空的任意類型 requiredAny: React.PropTypes.any.isRequired, // 自定義驗證器。若是驗證失敗須要返回一個 Error 對象。不要直接使用 `console.warn` 或拋異常,由於這樣 `oneOfType` 會失效。 customProp: function(props, propName, componentName) { if (!/matchme/.test(props[propName])) { return new Error('Validation failed!'); } } }, /* ... */ });

 

七、React 組件API

主要講解如下7個方法:

  • 設置狀態:setState
  • 替換狀態:replaceState
  • 設置屬性:setProps
  • 替換屬性:replaceProps
  • 強制更新:forceUpdate
  • 獲取DOM節點:findDOMNode
  • 判斷組件掛載狀態:isMounted   

   1)設置狀態:setState

   

setState(object nextState[, function callback])

參數說明:
  • nextState,將要設置的新狀態,該狀態會和當前的state合併
  • callback,可選參數,回調函數。該函數會在setState設置成功,且組件從新渲染後調用。

  合併nextState和當前state,並從新渲染組件。setState是React事件處理函數中和請求回調函數中觸發UI更新的主要方法。

關於 setState

不能在組件內部經過this.state修改狀態,由於該狀態會在調用setState()後被替換。

setState()並不會當即改變this.state,而是建立一個即將處理的state。setState()並不必定是同步的,爲了提高性能React會批量執行state和DOM渲染。

setState()老是會觸發一次組件重繪,除非在shouldComponentUpdate()中實現了一些條件渲染邏輯。

實例:

var Counter = React.createClass({
getInitialState:function(){
return {clickCount:0};
},
handleClick:function(){
this.setState(function(state){
return {clickCount:state.clickCount+1};
});
},
render:function(){
return (<h2 onClick={this.handleClick}>點我!點擊次數爲:{this.state.clickCount}</h2>);
}
});
ReactDOM.render(
<Counter />,
document.getElementById('message')
);

上面的handleClick處理函數寫成一下代碼效果相同:
handleClick:function(){
this.setState(function(){
return {clickCount:this.state.clickCount+1};
});
},
 2)替換狀態:replaceState

replaceState(object nextState[, function callback])

   

  • nextState,將要設置的新狀態,該狀態會替換當前的state。
  • callback,可選參數,回調函數。該函數會在replaceState設置成功,且組件從新渲染後調用。

replaceState()方法與setState()相似,可是方法只會保留nextState中狀態,原state不在nextState中的狀態都會被刪除。

 3)設置屬性:setProps

  

setProps(object nextProps[, function callback])
  • nextProps,將要設置的新屬性,該狀態會和當前的props合併
  • callback,可選參數,回調函數。該函數會在setProps設置成功,且組件從新渲染後調用。

設置組件屬性,並從新渲染組件。

props至關於組件的數據流,它老是會從父組件向下傳遞至全部的子組件中。當和一個外部的JavaScript應用集成時,咱們可能會須要向組件傳遞數據或通知React.render()組件須要從新渲染,可使用setProps()

更新組件,我能夠在節點上再次調用React.render(),也能夠經過setProps()方法改變組件屬性,觸發組件從新渲染。

 4)替換屬性 : repalceProps

replaceProps(object nextProps[, function callback])
  • nextProps,將要設置的新屬性,該屬性會替換當前的props
  • callback,可選參數,回調函數。該函數會在replaceProps設置成功,且組件從新渲染後調用。

replaceProps()方法與setProps相似,但它會刪除原有props

 5)強制更新 :forceUpdate

forceUpdate([function callback])

參數說明:
  • callback,可選參數,回調函數。該函數會在組件render()方法調用後調用。

forceUpdate()方法會使組件調用自身的render()方法從新渲染組件,組件的子組件也會調用本身的render()。可是,組件從新渲染時,依然會讀取this.props和this.state,若是狀態沒有改變,那麼React只會更新DOM。

forceUpdate()方法適用於this.props和this.state以外的組件重繪(如:修改了this.state後),經過該方法通知React須要調用render()

通常來講,應該儘可能避免使用forceUpdate(),而僅從this.props和this.state中讀取狀態並由React觸發render()調用。

6)獲取DOM節點:findDOMNode

DOMElement findDOMNode()

  • 返回值:DOM元素DOMElement

若是組件已經掛載到DOM中,該方法返回對應的本地瀏覽器 DOM 元素。當render返回null 或 false時,this.findDOMNode()也會返回null。從DOM 中讀取值的時候,該方法頗有用,如:獲取表單字段的值和作一些 DOM 操做。

 7)判斷組件掛載狀態:isMounted  

  bool isMounted()
  • 返回值:truefalse,表示組件是否已掛載到DOM中

isMounted()方法用於判斷組件是否已掛載到DOM中。可使用該方法保證了setState()forceUpdate()在異步場景下的調用不會出錯。

 八、React 組件生命週期

    

組件的生命週期可分紅三個狀態:

  • Mounting:已插入真實 DOM
  • Updating:正在被從新渲染
  • Unmounting:已移出真實 DOM

生命週期的方法有:

  componentWillMount 在渲染前調用,在客戶端也在服務器。

componentDidMount:在第一次渲染後調用,只在客戶端。以後組件已經生成了對應的DOM結構,能夠經過this.getDOMNode()來進行訪問。 若是你想和其餘JavaScript框架一塊兒使用,能夠在這個方法中調用setTimeout, setInterval或者發送AJAX請求等操做(防止異部操做阻塞UI)。

omponentWillReceiveProps 在組件接收到一個新的prop時被調用。這個方法在初始化render時不會被調用。

shouldComponentUpdate 返回一個布爾值。在組件接收到新的props或者state時被調用。在初始化時或者使用forceUpdate時不被調用。 

能夠在你確認不須要更新組件時使用

componentWillUpdate在組件接收到新的props或者state但尚未render時被調用。在初始化時不會被調用。

componentDidUpdate 在組件完成更新後當即調用。在初始化時不會被調用

 

componentWillUnmount在組件從 DOM 中移除的時候馬上被調用

如下實例在 Hello 組件加載之後,經過 componentDidMount 方法設置一個定時器,每隔100毫秒從新設置組件的透明度,並從新渲染:

var Hello = React.createClass({
getInitialState:function(){
return {
opacity:1.0
};
},
componentDidMount:function(){
this.timer = setInterval(function(){
var opacity = this.state.opacity;
opacity-= 0.05;
if(opacity<0.1){
opacity = 1.0;
}
this.setState({
opacity:opacity
});
}.bind(this),100);
},
render:function(){
return (
<div style={{opacity:this.state.opacity,color:"red"}}>
Hello {this.props.name}
</div>
);
}
});
ReactDOM.render(
<Hello name="菜鳥教程"/>,
document.getElementById("example")
);

如下實例初始化 state , setNewnumber 用於更新 state。全部生命週期在 Content 組件中。

 

var Button = React.createClass({
getInitialState:function(){
return {
data:0
};
},
setNewNumber:function(){
this.setState({data:this.state.data+1});
},
render:function(){
return (
<div>
<button onClick={this.setNewNumber}>newNumber</button>
<Content myNumber={this.state.data}/>
</div>
);
}

});
var Content = React.createClass({
componentWillMount:function() {
console.log('Component WILL MOUNT!')
},
componentDidMount:function() {
console.log('Component DID MOUNT!')
},
componentWillReceiveProps:function(newProps) {
console.log('Component WILL RECEIVE PROPS!')
},
shouldComponentUpdate:function(newProps, newState) {
return true;
},
componentWillUpdate:function(nextProps, nextState) {
console.log('Component WILL UPDATE!');
},
componentDidUpdate:function(prevProps, prevState) {
console.log('Component DID UPDATE!')
},
componentWillUnmount:function() {
console.log('Component WILL UNMOUNT!')
},
render:function(){
return (
<h1>{this.props.myNumber}</h1>
);
}
});
ReactDOM.render(
<Button/>,
document.getElementById("example")
);

 九、React AJAX

 

React 組件的數據能夠經過 componentDidMount 方法中的 Ajax 來獲取,當從服務端獲取數據庫能夠將數據存儲在 state 中,再用 this.setState 方法從新渲染 UI。

當使用異步加載數據時,在組件卸載前使用 componentWillUnmount 來取消未完成的請求。

如下實例演示了獲取 Github 用戶最新 gist 共享描述:

var UserGist = React.createClass({
getInitialState:function(){
return {
username:'',
lastGistUrl:''
};
},
componentDidMount:function(){
this.serverRequest = $.get(this.props.source,function(result){
var lastGist = result[0];
this.setState({
username:lastGist.owner.login,
lastGistUrl:lastGist.html_url
});
}.bind(this));
},
componentWillUnmount: function() {
this.serverRequest.abort();
},
render:function(){
return (
<div>
{this.state.username}用戶最新的Gist 共享地址
<a href="{this.state.lastGistUrl}">{this.state.lastGistUrl}</a>
</div>
);
}
});
ReactDOM.render(
<UserGist source="https://api.github.com/users/octocat/gists"/>,
document.getElementById("example")
)

 十、React 表單與事件

  

一個簡單的實例

在實例中咱們設置了輸入框 input 值value = {this.state.data}。在輸入框值發生變化時咱們能夠更新 state。咱們可使用 onChange 事件來監聽 input 的變化,並修改 state。

 

var  HelloMessage = React.createClass({
getInitialState: function (){
return {value: "Hello weiwei"};
},
handleChange:function (event){
this.setState({value:event.target.value});
},
render:function(){
var value = this.state.value;
return (
<div>
<input type="text" value = {value} onChange={this.handleChange}/>
<h4>{value}</h4>
</div>
);
}
});
ReactDOM.render(
<HelloMessage/>,
document.getElementById("example")
);

 上面的代碼將渲染出一個值爲 Hello Runoob! 的 input 元素,並經過 onChange 事件響應更新用戶輸入的值。

 

在如下實例中咱們將爲你們演示如何在子組件上使用表單。 onChange 方法將觸發 state 的更新並將更新的值傳遞到子組件的輸入框的 value 上來從新渲染界面。

你須要在父組件經過建立事件句柄 (handleChange) ,並做爲 prop (updateStateProp) 傳遞到你的子組件上。

 

var Content = React.createClass({
render:function(){
return (
<div>
<input type="text" value={this.props.myDataProp} onChange={this.props.updateStateProp}/>
<h4>{this.props.myDataProp}</h4>
</div>
)
}
});
var HelloWorld = React.createClass({
getInitialState:function(){
return {value:"Hello world"};
},
handleChange:function(event){
this.setState({value:event.target.value});
},
render:function(){
var value = this.state.value;
return (
<div>
<Content myDataProp={value} updateStateProp={this.handleChange}></Content> //這裏能夠寫單標籤也能夠寫雙標籤
</div>
);
}
});
ReactDOM.render(<HelloWorld/>,
document.getElementById("example")
);

 

React 事件

如下實例演示經過 onClick 事件來修改數據:

var HelloMassage = React.createClass({
getInitialState:function(){
return {value:"hai,Merry"};
},
handleChange:function(){
this.setState({value:"百度一下,你就知道!"});
},
render:function(){
var value = this.state.value;
return (
<div>
<button onClick={this.handleChange}>點我</button>
<h4>{value}</h4>
</div>
);
}
});
ReactDOM.render(
<HelloMassage/>,
document.getElementById("example")
);

 當你須要從子組件中更新父組件的 state 時,你須要在父組件經過建立事件句柄 (handleChange) ,並做爲 prop (updateStateProp) 傳遞到你的子組件上。實例以下:

 

var Content = React.createClass({
render: function() {
return <div>
<button onClick = {this.props.updateStateProp}>點我</button>
<h4>{this.props.myDataProp}</h4>
</div>
}
});
var HelloMessage = React.createClass({
getInitialState: function() {
return {value: 'Hello Runoob!'};
},
handleChange: function(event) {
this.setState({value: '菜鳥教程'})
},
render: function() {
var value = this.state.value;
return <div>
<Content myDataProp = {value}
updateStateProp = {this.handleChange}></Content>
</div>;
}
});
ReactDOM.render(
<HelloMessage />,
document.getElementById('example')
);

 十一、React Refs

 

React 支持一種很是特殊的屬性 Ref ,你能夠用來綁定到 render() 輸出的任何組件上。

這個特殊的屬性容許你引用 render() 返回的相應的支撐實例( backing instance )。這樣就能夠確保在任什麼時候間老是拿到正確的實例。

使用方法

綁定一個 ref 屬性到 render 的返回值上:

 

<input ref="myInput" />

在其它代碼中,經過 this.refs 獲取支撐實例:

var input = this.refs.myInput; var inputValue = input.value; var inputRect = input.getBoundingClientRect();

完整實例

var MyComponent = React.createClass({
handleClick:function(){
this.refs.myInput.focus();
},
render:function(){
return (
<div>
<input type="text" ref="myInput" />
<input type="button" value="點我輸入框獲取焦點" onClick={this.handleClick}/>
</div>
)
}
});
ReactDOM.render(<MyComponent />,
document.getElementById("example")
);

實例中,咱們獲取了輸入框的支撐實例的引用,點擊按鈕後輸入框獲取焦點。

咱們也可使用 getDOMNode()方法獲取DOM元素

相關文章
相關標籤/搜索