类式组件的用法

案例: 点击标签切换内容(标准写法)

在这里插入图片描述点击后:
在这里插入图片描述


<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/react/16.13.1/umd/react.development.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/react-dom/16.13.1/umd/react-dom.development.js"></script>
    <!-- <script src="https://cdn.bootcdn.net/ajax/libs/babel-standalone/6.26.0/babel.js"></script> -->
    <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>

</head>

<body>
    <div id="app">

    </div>
    <script type="text/babel">

        // 创建组件  
        class HelloMessage extends React.Component {  //构造器指挥调用一次
            constructor(props) {
                super(props)  // spuer 必须让在this操作的前面
                this.state = { cont: true, day: false}
                this.myFn = this.myFn.bind(this) // bind 可以生成新的函数也可以 帮你改函数里面的this指向构造器
                console.log(this)
            }
            render() { // render 会调用1+n次  1是初始化的一次  n是状态跟新的次数
                const {cont, day} = this.state;
                return (
                    <div>
                        Hello {this.props.name}
                        this是HelloMessage组件的实例对象
                        <p onClick={this.myFn}>利用state点击改变数据({this.state.cont ? 'hello' : 'hi'}), 今天是第{day?'1天':'2天'}</p> 等号是赋值 myFn 是对象指向   myFn()是执行函数  所以 写()的话打开页面会直接执行函数
                    </div> 
                );
            } 
            myFn() {  // myFn 会调用次数 == 点击的次数  
                 
                    /* this.state.cont = !this.state.cont  // 此时的cont 确实更改了 但是页面并没有发生改变 react不认可   错误写法
                    let cont = this.state.cont
                    console.log(cont);*/
                    // 状态(state) 不可以直接更改,要借助一个内置的API更改
                    let cont = this.state.cont
                    let day = this.state.day
                    // 状态必须通过setState进行跟新
                    this.setState({cont:!cont, day:!day})
                    console.log(cont);
                    console.log(day);

                }
        }
        ReactDOM.render(<HelloMessage name="Taylor" />, document.getElementById('app'))


		//bind:创建新的函数
        // function demo() {
        //     console.log(this);
        // }
        // deomo()
        // const x = demo.bind({a:1, b:2}) 
        // x()// 此时的bind 创建了新的函数  不赋值x 是不会执行
    </script>
</body>

react类式组件执行步骤:
  • 执行 ReactDOM.render( <HelloMessage na…之后React解析组件标签,找到HelloMessage组件,
  • 发现组件是使用类定义的,随后new出来该类的实例,并通过实例调用到原型上render方法
  • 将render返回的虚拟dom转换为真实的dom然后呈现到页面种

类式组件的执行次数:

  • 先执行 coustructor 一次 在执行函数 最后执行render 跟新页面
  • render 会调用1+n次 1是初始化的一次 n是状态跟新的次数
  • myFn 会调用次数 == 点击的次数
等号是赋值,myFn 是对象指向 ,myFn()是执行函数 如果直接写onClick = {myFn() }的话打开页面会直接执行函数

简写以上案例:

<body>
    <div id="app">

    </div>
    <script type="text/babel">
    // 创建组件
        class HelloMessage extends React.Component {
    
      
        // 初始化状态
           state = {
    
    cont:true, day:true}
            render() {
    
     
                const {
    
    cont, day} = this.state;
                return (
                    <div>
                        <h1 onClick={
    
    this.myFn}>利用state点击改变数据({
    
    cont ? 'hello' : 'hi'}), 今天是第{
    
    day?'1天':'2天'}</h1> 
                    </div> 
                );
            } 
            // 自定义方法 要用赋值语句写+箭头函数
            myFn = ()=> {
    
     
                    let cont = this.state.cont
                    let day = this.state.day
                   this.setState({
    
    cont:!cont, day: !day})
                }
        }
        ReactDOM.render(<HelloMessage name="Taylor" />, document.getElementById('app'))
    </script>
</body>

</html>

猜你喜欢

转载自blog.csdn.net/weixin_54645059/article/details/114636691