前端React開發入門筆記
阿新 • • 發佈:2018-10-31
什麼是React
React是一個JavaScript庫,是由FaceBook和Instagram開發的,主要用於使用者建立圖形化介面。
Hello world
<!DOCTYPE html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script src="build/react.js"></script>
<script src="build/react-dom.js"></script>
<script src="build/browser.min.js"></script>
<!-- browser.min.js將JSX語法轉換成JavaScript語法 -->
<script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/1.9.1/jquery.min.js"></script>
<title>React Hello world</title>
</head>
<body>
<div id="example1"></div>
<!-- React獨有的JSX語法,跟JavaScript不相容,凡是使用JSX的地方,都要加上type = “text/babel” -->
<!-- JSX的基本語法規則:遇到HTML標籤(以<開頭),就用HTML規則解析;遇到程式碼塊(以{開頭),就用JavaScript規則解析。 -->
<script type="text/babel">
ReactDOM.render(
<h1>Hello,World!</h1>,
document.getElementById ('example1')
);
</script>
</body>
</html>
map 遍歷
var animals = ['dog','cat','pig'];
ReactDOM.render(
<div>
{
animals.map(function(animal, key) {
return <h3 key={key}>{animal}</h3>
})
}
</div>,
document.getElementById('example2')
);
元件化
React.createClass方法就是用於生成一個元件類。元件首字母大寫
var ZGButton = React.createClass({
render:function() {
return <button>ZG{this.props.name}</button>
}
});
ReactDOM.render(
<ZGButton name='Button1'/>,
document.getElementById('example3')
);
this.props
this.props物件的屬性和元件的屬性一一對應,但是有個children除外,它表示的是元件的所有子節點
var Students = React.createClass({
render:function() {
return (
<ol>
{
React.Children.map(this.props.children,function(child) {
return <li>{child}</li>
})
}
</ol>
);
}
});
ReactDOM.render(
<Students>
<span>zhangsan</span>
<span>lisi</span>
</Students>,
document.getElementById('example4')
);
PropTypes
元件的屬性可以接受任意值,字串、物件、函式都行。這裡面有一個propTypes,可以用來限定提供的屬性是否滿足要求
var Student = React.createClass({
getDefaultProps: function() {
//getDefaultProps就類似與我們在開發iOS或者Java的時候對宣告屬性的時候進行賦初始化值。
return {
myName:"Default React"
}
},
propTypes: {
myName:React.PropTypes.string.isRequired,
},
render:function() {
return <h1>
{this.props.myName}
</h1>
}
});
var myNameStr = "React";
ReactDOM.render(
<Student myName = {myNameStr} />,
document.getElementById('example5')
);
Virtual DOM
虛擬DOM,只有插入文件的時候才會變成真實的DOM.根據React的設計,當重新渲染元件的時候,會通多diff尋找到變更的DOM節點,再把這個修改更新到瀏覽器實際的DOM節點上,所以實際上並不是渲染整個DOM數,這個Virtual DOM是一個純粹的JS資料結構,效能比原生DOM快很多。
var MyComponment = React.createClass({
render:function(){
return (
<div>
<input type = "text" ref = "myTextInput"/>
<input type = "button" value = "Focus the text input" onClick={this.handleClick}/>
</div>
);
},
handleClick:function() {
alert(this.refs.myTextInput.value);
this.refs.myTextInput.focus();
}
});
ReactDOM.render(
<MyComponment/>,
document.getElementById('example6')
);
this.state拿到元件的狀態
var LinkButton = React.createClass({
getInitialState:function () {
return {linked:false};
},
handleClick:function() {
this.setState({linked:!this.state.linked});
},
render:function() {
var text = this.state.linked? 'linked':'not linked';
return (
<p onClick={this.handleClick}>
You {text} this. Click to toggle
</p>
);
}
});
ReactDOM.render(
<LinkButton/>,
document.getElementById('example7')
);
表單
var Form = React.createClass({
getInitialState:function() {
return {value:'Hello'};
},
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}/>
<p>{value}</p>
</div>
);
}
});
ReactDOM.render(
<Form/>,
document.getElementById('example8')
);
元件生命週期
元件有三個主要的生命週期:
- Mounting:元件插入到DOM
- Updating:元件被重新渲染,如果DOM需要更新
- Unmounting:從DOM中刪除元件
React為每個狀態都提供了兩種處理函式,will函式在進入狀態之前呼叫,did在進入狀態之後呼叫。
var MyButton = React.createClass({
componentDidMount:function() {
console.log("已經裝載");
},
componentWillMount:function() {
console.log("將要裝載");
},
componentWillUpdate:function() {
console.log("將要更新");
},
componentDidUpdate:function() {
console.log("已經更新");
},
componentWillUnmount:function() {
console.log("將要移除");
},
render:function(){
return (
<button>MyButton</button>
);
},
});
var LoadButton = React.createClass({
loadMyButton:function() {
ReactDOM.render(
<MyButton/>,
document.getElementById('myBTN')
);
},
removeMyButton:function() {
var result = ReactDOM.unmountComponentAtNode(document.getElementById('myBTN'));
console.log(result);
},
render:function() {
return (
<div>
<button onClick={this.removeMyButton}>解除安裝MyButton</button>
<button onClick={this.loadMyButton}>裝載MyButton</button>
<div id="myBTN">這裡是mybuttonquyu</div>
</div>
);
}
});
ReactDOM.render(
<LoadButton/>,
document.getElementById('example1')
);
Ajax請求
元件的資料通常是通過Ajax請求伺服器獲取的,可以使用componentDidMount方法來設定Ajax請求,等到請求成功,再用this.setState方法重新渲染UI
var UserGist = React.createClass({
getInitialState:function() {
return {
username:'',
lastGistUrl:''
}
},
componentDidMount:function(){
$.get(this.props.source,function(result){
var lastGist = result[0];
if (this.isMounted()) {
this.setState({
username:lastGist.owner.login,
lastGistUrl:lastGist.html_url
});
}
}.bind(this));
},
render:function() {
return (
<div>
{this.state.username}'s last gist is
<a href={this.state.lastGistUrl}>here</a>
</div>
);
}
});
ReactDOM.render(
<UserGist source = "https://api.github.com/users/octocat/gists"/>,
document.getElementById('example1')
);
使用Promise物件
將Promise物件作為屬性,傳給RepoList元件。
如果Promise物件正在抓取資料(pending狀態),元件顯示"正在載入";如果Promise物件報錯(rejected狀態),元件顯示報錯資訊;如果Promise物件抓取資料成功(fulfilled狀態),元件顯示獲取的資料。
var RepoList = React.createClass({
getInitialState: function() {
return { loading: true, error: null, data: null};
},
componentDidMount() {
this.props.promise.then(
value => this.setState({loading: false, data: value}),
error => this.setState({loading: false, error: error})
);
},
render: function() {
if (this.state.loading) {
return <span>Loading...</span>;
}
else if (this.state.error !== null) {
return <span>Error: {this.state.error.message}</span>;
}
else {
var repos = this.state.data.items;
var repoList = repos.map(function(repo, key) {
return (
<li key={key}>
<a href={repo.html_url}>{repo.name}</a> ({repo.stargazers_count} stars) <br/> {repo.description}
</li>
);
});
return (
<main>
<h1>Most Popular JavaScript Projects in Github</h1>
<ol>{repoList}</ol>
</main>
);
}
}
});
ReactDOM.render(
<RepoList
promise={$.getJSON('https://api.github.com/search/repositories?q=javascript&sort=stars')}
/>,
document.getElementById('example2')
);
參考:http://www.ruanyifeng.com/blog/2015/03/react.html
http://www.cnblogs.com/zhanggui/p/5962037.html