中文文檔:State&生命周期-React
英文文檔:StateandLifecycle–React
簡單來說碑宴,一個組件的生命周期可以分為四個部分:
- 創(chuàng)造 - 生
- 掛載到頁面
- 更新
- 毀滅 - 死
用js來寫個簡單的例子
let app = document.getElementById('app');
//create div
let div = document.createElement('div');
div.style.border = '1px solid red';
let state = 0;
div.innerHTML = `
<p>${state}</p>
<button>+1</button>
<button>die</button>
`;
//mount div
app.appendChild(div);
div.querySelector('button').onClick = () => {
state += 1;
//update div
div.querySelector('p').innerText = state;
};
div.querySelectorAll('button')[1].onClick = () => {
//清理事件監(jiān)聽
div.querySelector('button').onClick = null;
div.querySelectorAll('button')[1].onClick = null;
div.remove();
//destroy div
div = null;
};
再來看看React的生命周期
值得注意的是软啼,函數(shù)是沒有生命周期的,只有class組件有
來看看React的生命周期里有哪些鉤子
import React from "react";
import ReactDOM from "react-dom";
import "./styles.css";
let div = document.createElement("div");
document.body.appendChild(div);
console.log = function(content) {
div.innerHTML += `${content}<br>`;
};
class Baba extends React.Component {
constructor() {
super();
this.state = {
hasChild: true
};
}
onClick() {
this.setState({
hasChild: false
});
}
callSon() {
this.setState({
word: "你還好吧"
});
}
render() {
return (
<div>
我是你爸爸
<button onClick={() => this.onClick()}>kill son</button>
<button onClick={() => this.callSon()}>call son</button>
{this.state.hasChild ? <App word={this.state.word} /> : null}
</div>
);
}
}
class App extends React.Component {
onClick() {
console.log("用戶點擊了");
this.setState({
n: this.state.n + 1
});
}
updateX() {
this.setState({
x: this.state.x + "!"
});
}
constructor() {
super();
this.state = {
n: 0,
x: "不展示"
};
}
componentWillMount() {
console.log("將要 mount App");
}
render() {
// update
console.log("填充/更新 App 的內(nèi)容");
return (
<div className="App">
{this.state.n}
<br />
我爸說 {this.props.word}
<br />
<button onClick={() => this.onClick()}>+1</button>
<button onClick={() => this.updateX()}>update x</button>
</div>
);
}
componentDidMount() {
console.log("mount App 完畢");
}
componentWillUpdate() {
console.log("update App 之前");
}
shouldComponentUpdate(nextProps, nextState) {
console.log("要不要更新呢延柠?");
if (this.state.n === nextState.n) {
console.log('不更新')
return false;
} else {
console.log('更新')
return true;
}
}
//update is render
componentDidUpdate() {
console.log("update App 之后");
}
componentWillUnmount() {
console.log("App 快要死了祸挪,記得喂狗");
}
componentWillReceiveProps() {
console.log("我爸說話了");
}
}
const rootElement = document.getElementById("root");
ReactDOM.render(<Baba />, rootElement);
關于React生命周期的幾道面試題
生命周期的哪個階段異步請求數(shù)據(jù)?
componentDidMount
最主要的原因是:
- 在componentWillUnMount中無法確保在執(zhí)行render前已經(jīng)獲得了異步請求的數(shù)據(jù)贞间,componentDidMount不存在這個問題贿条;
- 為了性能的需要,React下一代tiao'he
- 無法保證ajax請求在組件的更新階段里成功返回數(shù)據(jù)榜跌,有可能當我們進行setState處理的時候闪唆,組件已經(jīng)被銷毀了。
請說出所有的生命周期鉤子
- constructor()
- componentWillMount() // 將要Mount
- render() // 填充/更新
- componentDidMount() // Mount 完畢
- componentWillUpdate // 更新之前
- componentDidUpdate // 更新之后
- componentWillUnmount() // 組件被銷毀之前钓葫,只能由父組件銷毀子組件
- componentWillReceiveProps() // 父組件向子組件傳值了
- shouldComponentUpdate() //是否要更新