React中没有state(状态)的组件称为简单组件;有state称为复杂组件。
下面我们来一步一步认识state,并最后给出日常开发中使用state的形式。
下面展示一个小案例,通过点击文本,来切换今天的天气,如下图2-1所示:
第一步先把文本通过React组件显示在页面上,代码2-1如下:
组件对象三大属性之一state
state初始化及访问步骤:
注:
问题:
借助开发者工具查看下组件实例,如下图2-1所示:
在上面呢,我们完成了state的初始化和读取,实现了文本的展示,那么如果通过鼠标点击来完成切换呢?
参考js很容易想到,要通过绑定鼠标点击事件来完成。那么在Reac中如何绑定事件呢?
第一步在类中定义鼠标点击处理函数:
changeWeather() {console.log(this);this.state.isHot = !this.state.isHot}
第二步在render函数返回标签上绑定点击事件:
render() {// 读取状态console.log(this);return 今天天气很{this.state.isHot ? '炎热' : '凉爽'}
}
注:
鼠标点击查看console输出:
undefined
Inline Babel script:25 Uncaught TypeError: Cannot read properties of undefined (reading 'state')
为啥呢?下面讲解
示例代码如下:
3_类方法中this的指向
输出:
Person
undefined
Window
undefined
解答下上面为什么点击,调用changeWeather(),输出是undefied问题?
onClick={this.changeWeather},这里为鼠标点击之前,通过this实例原型链找到changeWeather方法,交给onClick用于回调。当点击的时候属于直接调用changeWeather()方法,而不是通过Weather的实例对象。
又因为类中普通方法默认开启严格模式,且经过babel翻译,所以是undefined不是windows也不是Weather实例
解决方案一:既然此处是非实例调用,导致this执行改变,那么我们通过bind方法改变this指向为Weather实例并重新放置在Weather实例上。
代码调整如下: