本系列將盡量使用ES6(ES2015)語法。因此均在上節webpack的基礎上作開發。html
React是Facebook開發的一款JS庫,由於基於Virtual DOM,因此響應速度快,以及支持跨平臺。
(實際上,Virtual DOM在某些狀況都會損耗一些性能在diff上,但相比其餘MVVM框架比起來性能影響不多,同時大幅提高開發效率也是目前推薦的方式)前端
安裝React: npm i -S react react-dom
react
安裝Babel:npm i babel-loader babel-preset-react babel-plugin-import -S
webpack
import React from 'react'; import ReactDOM from 'react-dom'; ReactDOM.render( <h1>Hello, world!</h1>, document.getElementById('root') );
JavaScript 的一種擴展語法。咱們推薦在 React 中使用這種語法來描述 UI 信息。web
const element = ( <h1 className="greeting"> Hello, world! </h1> );
const element = React.createElement( 'h1', { className: 'greeting' }, 'Hello, world!' );
// 注意: 如下示例是簡化過的(不表明在 React 源碼中是這樣) const element = { type: 'h1', props: { className: 'greeting', children: 'Hello, world' } };
React框架的一大特點就是它經過組件化的方式來構建和渲染前端頁面。
定義組件有不少方式,最主流的爲:函數 和 類(類容許咱們在其中添加本地狀態(state)和生命週期鉤子。)ajax
function Welcome(props) { return <h1>Hello, {props.name}</h1>; }
class Welcome extends React.Component { render() { return <h1>Hello, {this.props.name}</h1>; } }
React組件的生命週期事件不少,經常使用的有:npm
生命週期事件又分爲3條流程:babel
React負責渲染表單的組件仍然控制用戶後續輸入時所發生的變化。相應的,其值由React控制的輸入表單元素稱爲「受控組件」。框架
class ShowInput extends Component { constructor(props) { super(props); this.state = { val: 'hello' } } onChange(e) { this.setState({ val: e.target.value }) } render() { return ( <div> <input type="text" onChange={e => this.onChange(e)} /> <div>{this.state.val}</div> </div> ) } }
DivInput組件中的input元素就是受控組件。value 和 onChnage都會由React控制。less
render() { return ( <div> <input type="text" ref={e => this.input = e} /> <button onClick={() => console.log(this.input.value)}>Click</button> </div> ); }
掛到組件(這裏組件指的是有狀態組件)上的ref表示對組件實例的引用,而掛載到dom元素上時表示具體的dom元素節點。(stateless構造的組件是不會實例化,因此ref引用的爲null)
ref屬性能夠設置爲一個回調函數,這也是官方強烈推薦的用法;這個函數執行的時機爲:
ReactDOM.findDOMNode(ref)來獲取組件掛載後真正的dom節點。
組件之間通訊的解決方案一般有2種: