有了七篇基礎學習,瞭解相關的知識體系,以後即是系統地再來一次。css
[React] 01 - Intro: javaScript library for building user interfaceshtml
[React] 02 - Intro: react component and Design patternjava
[React] 03 - Intro: react.js in twelve demosreact
[React] 04 - Intro: MongoDB becomes popularwebpack
[React] 05 - Route: connect with ExpressJS 【Nodejs + Express + MongoDB 基礎篇】web
[React] 06 - Route: koa makes your life easier mongodb
[React] 07 - Flux: react communicates with mongodbnpm
From [React] 08, based on React JS Tutorials.bootstrap
1.Installs webpack globally on your system, that makes it available in terminal window.app
npm i webpack -g
2.運行代碼:
$ webpack-dev-server --content-base src
3.UI效果:數據綁定
client.js
若是需返回多個東東,則使用<div>標籤。
client.js
import Layout from "./components/Layout"; const app = document.getElementById('app'); // html的app在哪裏? ReactDOM.render(<Layout/>, app); // ----> 參見[對比1],第一個參數是組件內容,第二個是掛載位置
react會根據標籤制定的位置來動態改變html內容。
index.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>React Tutorials</title> <!-- change this up! http://www.bootstrapcdn.com/bootswatch/ --> <link href="https://maxcdn.bootstrapcdn.com/bootswatch/3.3.6/cosmo/bootstrap.min.css" type="text/css" rel="stylesheet"/> </head> <body> <div id="app"></div> // <---- 實際上成了一個變量,也便是react會根據標籤制定的位置來動態改變 <script src="client.min.js"></script> </body> </html>
這裏是 [對比1]:
ReactDOM.render( <div> <input type="text" value={value}/> // 注意單標籤必定要閉合「/」,不然會報錯 <button>{buttonName}</button> // 在{}中插入變量 </div>, document.getElementById("container") )
將Header和Footer做爲組件單獨實現,也就是【複合組件】。
Layout.js
render() { return ( <div> <Header changeTitle={this.changeTitle.bind(this)} title={this.state.title} /> <Footer /> </div> ); }
固然,Header也能夠進一步地獨立出來。
Header.js
import React from "react"; import Title from "./Header/Title"; export default class Header extends React.Component {
handleChange(e) { const title = e.target.value; this.props.changeTitle(title); } render() { return ( <div> <Title title={this.props.title} /> <input value={this.props.title} onChange={this.handleChange.bind(this)} /> </div> ); } }
Header中的標籤Title的實現處。
Title.js
export default class Title extends React.Component { render() { return ( <h1>{this.props.title}</h1> ); } }
Header.js
import React from "react"; import Title from "./Header/Title"; export default class Header extends React.Component { handleChange(e) { // e就是指:event // (1) 得到新的input數據 const title = e.target.value; // (2) 而後改變title數據 this.props.changeTitle(title); // 第二步:在邏輯上,虛擬DOM須要改變title, according to input // (3) 以後命令layout渲染 } render() { // input中的onChange做爲listener,觸發上面的handleChange() return ( <div> <Title title={this.props.title} /> <input value={this.props.title} onChange={this.handleChange.bind(this)} /> // 第一步:監聽事件得到input改變
</div>
);
}
改變title實際幹活的地方,以下。
Layout.js
import React from "react"; import Footer from "./Footer"; import Header from "./Header"; export default class Layout extends React.Component { constructor() { super(); this.state = { title: "Welcome", }; } changeTitle(title) { this.setState({title}); } render() { return ( <div> <Header changeTitle={this.changeTitle.bind(this)} title={this.state.title} /> // 將函數指針做爲參數傳給header子組件 <Footer /> </div> ); } }
可見,這裏其實透露出的是一種「分離」的思想。