react基础 - 组件实例的三大核心属性-state

注意:在使用类创建组件才会有组件实例对象,从而才会有核心属性的概念~

 state

1. 组件被称为"状态机"(组件里存着状态,状态里存数据), 页面的显示是根据组件的state属性的数据来显示(重新渲染组件),值是一个对象,可以包含多个key-value的组合
2. 初始化指定:

//借助构造器初始化状态 
constructor() {
      super()
      this.state = {
        stateName1 : stateValue1,
        stateName2 : stateValue2
      }
    }


3. 读取显示: 
    this.state.stateName1
4. 更新状态-->更新界面 : 内置API : setState传入一个对象
    this.setState({stateName1 : newValue})


视频课中的一个demo

原生js的事件绑定三种方式:

在react中,把原生的onclick,onblur,封装为了 onClick ,onBlur,(为了更好的兼容性),且监听者必须是函数,,因此写法为:onClick={demo}

 那么思考一下,如何在类中的自定义方法中拿到类的实例对象?拿到了实例才能拿到state,从而才能修改isHot的值----

 bind可以做两件事 1.帮你生成一个新函数,不调用不执行   2.改变这个函数的this指向

此时将构造器中的this绑定到this.changeWeather上,,并把这个新函数放在实例身上,命名为changeWeather,,此时实例身上就多了一个changeWeather方法,,,再进行点击操作的时候,触发的方法就是实例自身的changeWeather方法,而非原型上的

总结一下思路---拿原型上的方法去生成新的方法并挂载到实例自身,调用的时候用的是自身的。

<body>
    //完整写法

    <!-- 准备一个容器 -->
    <div id="test"></div>

      <!-- 引入库 -->
      <script type="text/javascript" src="../js/react.development.js"></script>
      <script type="text/javascript" src="../js/react-dom.development.js"></script>
      <script type="text/javascript" src="../js/babel.min.js"></script>

    <script type="text/babel">
    //1. 创建类式组件
    class Weather extends React.Component{

        //构造器调用几次?----1  使用几次组件标签就产生了几个实例就调用几次
        constructor(props){
            super(props)
            // 初始化状态
            // 数据放状态里,更改数据驱动页面的修改
            this.state={isHot:false}
            this.changeWeather=this.changeWeather.bind(this)
        }

        //render调用几次?----1+n  1:初始化的时候调用  n:状态state更新的次数
        render() {
        //render是在类的原型对象上,供组件实例使用 
         const {isHot}=this.state
         return <h1 onClick={this.changeWeather}>今天天气很{isHot?'炎热':'凉爽'}   </h1>
        }

        //changeWeather放在那了?--Weather的原型对象上,供实例使用
        //那么通过Weather的实例调用changeWeather时,changeWeather中的this就是Weather实例、
        // 类中自定义方法自动为局部的严格模式
        // changeWeather调用几次?  点几次调几次
        changeWeather(){
            // 获取isHot的值
            const isHot=this.state.isHot
            // !!!状态里的数据不能直接更改,,react不认可,无法显示到页面
            // this.state.isHot=!isHot  错!
            // 借助内置API ---setState  来修改更新状态,且更新是一种合并,不是替换
            this.setState({isHot:!isHot})
        }
       
    }
    // 2.渲染组件到页面
    ReactDOM.render(<Weather/>,document.getElementById('test'))

    </script>
</body>
<body>
    //简写!!!!开发中写法
  
    <div id="test"></div>

    <script type="text/javascript" src="../js/react.development.js"></script>
    <script type="text/javascript" src="../js/react-dom.development.js"></script>
    <script type="text/javascript" src="../js/babel.min.js"></script>

    <script type="text/babel">
    class Weather extends React.Component{
        // 初始化状态---类中写赋值语句直接放在实例身上
        state={isHot:false}
        render() {
         const {isHot}=this.state
         return <h1 onClick={this.changeWeather}>今天天气很{isHot?'炎热':'凉爽'}   </h1>
        }
        //自定义方法-----赋值语句+箭头函数
        changeWeather=()=>{
            const isHot=this.state.isHot 
            this.setState({isHot:!isHot})
        }     
    }
    ReactDOM.render(<Weather/>,document.getElementById('test'))
    </script>
</body>

强烈注意:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值