react模块化及类组件

一、react模块化

<MyComponent/>由babel翻译 自动调用函数MyComponent()

babel翻译时自动开启严格模式 严格模式自动禁止把this指向window 这时this指向的是undefined

<script type="text/babel">
    function MyComponent(){
        console.log(this);//undefined
        return <h1>我是h1</h1>
    }
    ReactDOM.render(<MyComponent/>,document.getElementById('test'))
</script>

二、React类组件

类的相关知识

构造器中的this指向:类的原型对象 供实例使用

一般方法放置位置:类的原型对象上,供实例使用

一般方法中的this指向主要看它怎么调用 call会改变this指向 这里会有两个undefined apply bind也会改变this指向

总结:

1、类中的构造器不是必须写的,要对实例进行一些初始化的操作,如添加指定属性时才写

2、如果A类继承了B类,且A类中写了构造器,那么A类构造器中的super是必须调用的

3、类中所定义的方法,都是放在了类的原型对象上

<script>
    // 创建一个person类
    class Person {
        // 构造器方法
        constructor(name, age) {
            // 构造器中的this指向:类的原型对象 供实例使用
            this.name = name
            this.age = age
        }
        speak() {
            // 一般方法放置位置:类的原型对象上,供实例使用
            // speak中的this就是Person实例对象
            console.log(`我叫${this.name},我今年${this.age}岁了`);
        }
    }
    console.log(88);
    let ls = new Person('李四', 18)
    ls.speak()
    //speak中的this指向主要看它怎么调用 call会改变this指向 
    //这里会有两个undefined  apply bind也会改变this指向
    ls.speak.call({ a: 1, b: 2 })
    console.log(ls);

    // 继承
    // class Students extends Person { }
    // let ww=new Students('王五',25)
    // ww.speak()
    class Students extends Person {
        constructor(name, age, grade) {
            super(name, age)//写在前面
            this.grade = grade
        }
        study() {
            console.log(`我叫${this.name},我现在${this.grade}`);
        }
    }
    let zs = new Students('张三', 22, '大三')
    zs.speak()
    zs.study()
    console.log(zs);
</script>

改变this指向的方法

import ReactDOM from "react-dom";
import { Component } from "react";

class Findthis extends Component{
  state={name:'kiki'}
  showThis(){
    console.log(this.state.name);
  }
  showThisTwo=()=>{
    console.log(this.state.name);
  }
  render(){
    return (
      <>
      <h1>this指向问题</h1>
      <div>{this.state.name}</div>
      {/* 解决this指向问题: */}
      {/* 方法一:在事件处理程序中使用回调函数 */}
      <button onClick={()=>{this.showThis()}}>点击1</button>
      {/* 方法二:在写方法时直接回调 */}
      <button onClick={this.showThisTwo}>点击2</button>
      {/* 方法三:绑定bind改变this指向 */}
      {/* 注意:bind返回的是一个新函数 这个新函数才是一个事件处理函数 */}
      <button onClick={this.showThis.bind(this)}>点击3</button>
      </>
    )
  }
}
ReactDOM.render(<Findthis/>,document.getElementById('root'))

react类组件

点击切换文字

不能直接修改状态 需要借助React.Component父类的setState

class MyComponent extends React.Component{//**
    constructor(props){
        super(props)//**
        this.state={isHot:false}
        this.change=this.change.bind(this)//**
    }
    render(){
        const {isHot}=this.state
        console.log(isHot);
        return <h1 onClick={this.change}>我是{isHot?'洋洋':'咩咩'}</h1>//**
    }
    change(){
        let isHot=this.state.isHot
        //不能直接修改状态 需要借助React.Component父类的setState
        console.dir(this.setState);
        this.setState({isHot:!isHot})//**
}
}
console.dir(React.Component);
ReactDOM.render(<MyComponent/>,document.getElementById('test'))

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值