1.第一个例子
利用state改变天气的状态
<!-- 准备一个容器 -->
<div id="test"></div>
...引入React库(此处省略)
<script type="text/babel">
//1.创建组件
class Weather extends React.Component {
constructor(props) {
super(props);
//初始化状态
this.state = {isHot: true,wind:'微风'};
this.changeWeather = this.changeWeather.bind(this);
}
render() {
//读取状态
const {isHot,wind} = this.state;
return <h1 onClick={this.changeWeather}>今天天气很{isHot ? '炎热' : '瑟瑟发抖'},{wind}</h1>
}
changeWeather() {
//changeWeather放在哪里? —— Weather的原型对象上,供实例使用
//由于changeWeather是作为onClick的回调,所以不是通过实例调用,是直接调用
//类中的方法默认开启了局部的严格模式,所以changeWeather中的this为undefined
// console.log(this);
//获取原来的isHot值
const isHot = this.state.isHot;
// 严重注意:状态必须通过setState进行更新,且更新是一种合并,不是替换。
this.setState({isHot:!isHot})
//严重注意:状态(state)不可直接更改,下面就是直接更改
// this.state.isHot = !isHot; 错误写法
}
}
//2.渲染组件到页面
ReactDOM.render(<Weather/>, document.getElementById('test'));
</script>
相关问题
构造器调用几次? ——1次
render调用几次? ——1+n次 1是初始化的那次,n是状态更新的次数
changeWeather调用几次? ——点几次调几次
2.state的简写方式
同样是点击改变文字内容
<div id="test"></div>
...引入React库(此处省略)
<script type="text/babel">
//1.创建组件
class Love extends React.Component {
//初始化状态
state = {isLove:true};
render(){
const {isLove} = this.state;
return <h1 onClick={this.changeLove}>你到底爱不爱我?{isLove?'我爱你':'我不爱你'}</h1>
}
//自定义方法——要用赋值语句的形式+箭头函数
changeLove = () => {
const isLove = this.state.isLove;
this.setState({isLove:!isLove});
}
}
//2.渲染组件到页面
ReactDOM.render(<Love/>,document.getElementById('test'));
</script>
总结
- state是组件对象最重要的属性,值是对象(可以包含多个key-value的组合)
- 组件被成为"状态机",通过更新组件state来更新对应的页面显示(重新渲染组件)