(三)React组件的三大特性 State

React组件的三大特性 State

了解State的使用:(通过原理)

展示state里面的this指向问题(做参考 实际是简写方式)

这是一个修改天气的案例,使用state存储状态,在展示的地方进行获取展示,然后在更新状态的时候是怎么一个的状态,render调用几次,在声明方法的时候是怎么的格式。以及相关的this的指向。

class Weather extends React.Component{
            //构造器调用几次? ———— 1次
            constructor(props){
                console.log('constructor');
                super(props)
                //初始化状态
                this.state = {isHot:false,wind:'微风'}
                //解决changeWeather中this指向问题 
                this.changeWeather = this.changeWeather.bind(this)
            }
            //render调用几次? ———— 1+n次 1是初始化的那次 n是状态更新的次数
            render(){
                console.log('render');
                //读取状态
                const {isHot,wind} = this.state
                return <h1 onClick={this.changeWeather}>今天天气很{isHot ? '炎热' : '凉爽'},{wind}</h1>
            }
            //changeWeather调用几次? ———— 点几次调几次
            changeWeather(){
                //changeWeather放在哪里? ———— Weather的原型对象上,供实例使用
                //由于changeWeather是作为onClick的回调,所以不是通过实例调用的,是直接调用
                //类中的方法默认开启了局部的严格模式,所以changeWeather中的this为undefined
                
                console.log('changeWeather');
                //获取原来的isHot值
                const isHot = this.state.isHot
                //严重注意:状态必须通过setState进行更新,且更新是一种合并,不是替换。
                this.setState({isHot:!isHot})
                console.log(this);
                //严重注意:状态(state)不可直接更改,下面这行就是直接更改!!!
                //this.state.isHot = !isHot //这是错误的写法
            }
        }
        //2.渲染组件到页面
        ReactDOM.render(<Weather/>,document.getElementById('test'))

总结:

就是在使用jsx书写相关的事件的时候,定义的回调方法就是放在类里面的 但是不是实例对象进行调用的,因为你在使用的是时候,不是写的new 一个类 而是react的去声明使用的,所以是调用不到的(自己理解就是 你类里面的这个方法没有挂载到实例上面 所以里面的this指向是没有指向到实例对象的)

解决方案是啥 就是在你写的是这个组件(类里面) this.changeWeather = this.changeWeather.bind(this) 通过这种方法进行挂载 或者说就是通过改变去修改this的指向问题

state的作用就是进行储存状态 暂且可以理解为vue的data 但是在修改的时候需要 写 this.setState( { } ) 进行修改相应的数据 所有才会有上面说的方法this获取不到实例对象

但是在 render 里面是可以直接 this.state. 得到相应的数据的

后面要写简写模式 不要很麻烦

上述产生的问题就是this的指向问题,你的这个点击事件的方法本身不是自己new出来的,所以拿不到。但是给了一个解决方案,但是后期采用简写方法就不会出现这个问题。

state的简写方式

要注意的点 类里面的方法
//自定义方法————要用赋值语句的形式+箭头函数 (复习箭头函数 匿名函数)
简写方式就是改成了赋值的方法 ,之前的方式写的方法是放在的了原型上边,this指的不是实例,改成赋值方法 然后用箭头函数的形式 因为箭头函数没有this 所以指向可以

   //1.创建组件
        class Weather extends React.Component{
            //初始化状态
            state = {isHot:false,wind:'微风'}
            render(){
                const {isHot,wind} = this.state
                return <h1 onClick={this.changeWeather}>今天天气很{isHot ? '炎热' : '凉爽'},{wind}</h1>
            }
            //自定义方法————要用赋值语句的形式+箭头函数
            changeWeather = ()=>{
                const isHot = this.state.isHot
                this.setState({isHot:!isHot})
            }
        }
        //2.渲染组件到页面
        ReactDOM.render(<Weather/>,document.getElementById('test'))

理解:

1.state是组件对象最重要的属性, 值是对象(可以包含多个key-value的组合)
2.组件被称为"状态机", 通过更新组件的state来更新对应的页面显示(重新渲染组件)

强烈注意:

1.组件中render方法中的this为组件实例对象
2.组件自定义的方法中this为undefined,如何解决?
   a.强制绑定this: 通过函数对象的bind()
   b.箭头函数
3.状态数据,不能直接修改或更新 只能使用setState

posted @ 2021-10-13 17:18  无梦南柯  阅读(96)  评论(0编辑  收藏  举报