state 有狀態state的組件稱作複雜組件,沒有狀態的組件稱為簡單組件 狀態里存儲數據,數據的改變驅動頁面的展示 <script type="text/babel"> // 創建組件 class Weather extends React.Component { // 構造器調用1次 const ...
state
- 有狀態state的組件稱作複雜組件,沒有狀態的組件稱為簡單組件
- 狀態里存儲數據,數據的改變驅動頁面的展示
<script type="text/babel">
// 創建組件
class Weather extends React.Component {
// 構造器調用1次
constructor(props) {
super(props);
// 必須接收對象
this.state = { isHot: true };
// 左邊為實例對象,實例對象原本沒有changeWeather
// 順著原型對象查找到changeWeather , 再由bind修改綁定的this
// 最後左側多出了個函數,並賦值為changeWeather
this.changeWeather = this.changeWeather.bind(this);
}
// render調用 1+n次 初始1次,更新n次
render() {
// 給事件指定回調函數,不是賦值,不要有括弧
// onClick中C要大寫
// 這裡的changeWeather是實例的changeWeather
return <h1 onClick={this.changeWeather} >今天天氣{this.state.isHot ? '炎熱' : '涼爽'}</h1>
}
// changeWeather放在Weather的原型對象上,供實例使用
// 由於changeWeather是onClick的回調,所以不是通過實例調用的,而是直接調用的
// 類中的方法預設開啟了局部的嚴格模式 ,所以changeWeather中的this是undefined
// 更新n次,調用n次
changeWeather() {
// 狀態里的數據不能直接修改,以下就是直接修改
// 要藉助內置的api更改
// 以下這種寫法並未改變state
// this.state.isHot = !this.state.isHot;
// 要這樣更新,且更新是合併更新,未修改的不變
const isHot = this.state.isHot;
this.setState({ isHot: !isHot });
}
}
// 渲染組件
const root = ReactDOM.createRoot(document.getElementById('test'));
root.render(<Weather />);
</script>
state簡寫
class Weather extends React.Component {
state = { isHot: true };
render() {
return <h1 onClick={this.changeWeather} >今天天氣{this.state.isHot ? '炎熱' : '涼爽'}</h1>
}
// 箭頭函數沒有this,但會找外層函數的this
// 屬於自定義方法,算是賦值語句
changeWeather = () => {
const isHot = this.state.isHot;
this.setState({ isHot: !isHot });
}
}
const root = ReactDOM.createRoot(document.getElementById('test'));
root.render(<Weather />);
</script>