React学习2(面向组件编程)

news/2024/7/15 18:42:32 标签: react.js, 学习, javascript

模块与组件,模块化与组件化的理解

模块

理解:向外提供特殊功能的JS程序,一般就是一个js文件;

为什么要拆成模块:随着业务逻辑的增多,代码越来越多且复杂;

作用:复用js,简化js的编写,提高js运行效率。

组件

理解:用来实现局部功能效果的代码和资源的集合;

为什么:一个界面的功能更复杂;

作用:复用代码,简化项目编码,提高运行效率;

模块化

当应用的js都已模块来编写的,这个应用就是一个模块化的应用

组件化

当应用是以多组件的方式实现,这个应用就是一个组件化的应用

定义函数式组件和类式组件

函数式组件

<!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>函数定义的组件</title>
</head>
<body>
  <!---准备好一个容器-->
  <div id="test">

  </div>

  <!---引入核心库,必须最先引入-->
  <script src="../js//react.development.js"></script>
  <!---引入react-dom,用于支持react操作dom,其次引入-->
  <script src="../js/react-dom.development.js"></script>
  <!---引入babel,用于将jsx转化为js,最后引入-->
  <script src="../js/babel.min.js"></script>

  <script type="text/babel">
    //1.创建函数式组件
    function Mycomponent() {
      console.log(this) // 此处的this是undefine,因为babel编译后开启了严格模式
      return <h2>我是用函数定义的组件(适用于【简单】组件的定义)</h2>
    }
    //2.渲染组件到页面
    ReactDOM.render(<Mycomponent />, document.getElementById('test'))

  </script>
</body>
</html>

执行了ReactDOM.render(Mycomponent />, document.getElementById('test'))之后,发生了什

么?

1.react解析组件标签,找到了Mycomponent函数组件,如果找不到,则报错

2.发现组件是使用函数定义的,随后调用该函数,将返回的虚拟dom转为真实dom,随后呈现在页

面中

定义类组件

定义类式组件,要求自己的类必须继承react中的类(React.component),该类是react内置的

创建类组件必须要满足的三点:

       1.必须继承react当中的类(React.component)

      2.必须写render() {}

      3.render函数中必须写返回值

<!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>类式组件</title>
</head>
<body>
  <!---准备好一个容器-->
  <div id="test">

  </div>

  <!---引入核心库,必须最先引入-->
  <script src="../js//react.development.js"></script>
  <!---引入react-dom,用于支持react操作dom,其次引入-->
  <script src="../js/react-dom.development.js"></script>
  <!---引入babel,用于将jsx转化为js,最后引入-->
  <script src="../js/babel.min.js"></script>

  <script type="text/babel">
  //1.创建类式组件(类名就是组件名)
  //react如果定义类式组件,要求自己的类必须继承react中的类(React.component),该类是react内置的
  /*
    创建类式组件必须要满足的三点
      1.必须继承react当中的类(React.component)
      2.必须写render() {}
      3.render函数中必须写返回值
  */
  class Mycomponent extends React.Component{
    render() {
      // render函数放在了哪里?--放在了myComponent的原型对象上,供实例使用
      // render中的this是谁?----myComponent的实例对象,也是myComponent组件实例对象
      console.log('render中的this是:',this)
      return <h2>我是用类定义的组件(适用于【复杂】组件的定义)</h2>    
    }
  }
  //2.渲染组件
  ReactDOM.render(<Mycomponent />, document.getElementById('test'))

  </script>
</body>
</html>

执行了ReactDOM.render(Mycomponent />, document.getElementById('test'))之后,发生了什

么?

1.react解析组件标签,找到了myComponent函数组件,如果找不到,则报错

2.发现组件是使用类定义的,随后new出来该类实的例,并通过该实调例用到原型上的render方法

3.将render返回的虚拟dom转为真实dom,随后呈现在页面中

复习类的基础知识

类的定义及使用

<!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>类的基本知识</title>
</head>
<body>
  <script>
    // 创建一个person类,class是定义类的关键字
    class Person {
      // 构造器方法
      constructor(name, age){  // 该函数主要是接收new实例对象传递的参数
        // 构造器中的this是谁?-----是类的实例对象
        console.log('@@@',this);
        this.name = name
        this.age = age
      }
      // 一般方法
      speak() {
        console.log('speak',this);
        // speak方法放在了哪里?---类的原型对象上,供实例使用
        // 通过Person实例调用speak()时,speak中的this就是Person实例
        console.log(`我叫${this.name},我年龄是${this.age}`)
      }
    }
    // 创建一个person实例
    const p1 = new Person('tom', 18)
    const p2 = new Person('jerry',19)

    console.log(p1)
    console.log(p2)

    p1.speak()
    p2.speak()
  </script>
</body>
</html>

类的继承

<!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>继承</title>
</head>
<body>
  <script>
    // 创建一个person类,class是定义类的关键字
    class Person {
      // 构造器方法
      constructor(name, age){  // 函数主要是接收new实例对象传递的参数
        // 构造器中的this是谁?-----是类的实例对象
        this.name = name
        this.age = age
      }
      // 一般方法
      speak() {
        // speak方法放在了哪里?---类的原型对象上,供实例使用
        // 通过Person实例调用speak()时,speak中的this就是Person实例
        console.log(`我叫${this.name},我年龄是${this.name}`)
      }
    }

    // 创建一个student类,继承与person类
    class Student extends Person {
      constructor(name, age, grade) {
        super(name,age) // 把接收到的相同信息发给父类,调用父类的构造器方法
        this.grade = grade
      }
      // 重写重父类继承过来的方法
      speak() {
        console.log(`我叫${this.name},我年龄是${this.name},我年龄是${this.grade}年级`)
      }
      study() {
        //study方法放在了哪里?---类的原型对象上,供实例使用
        // 通过Student实例调用study中的this就是Student实例
        console.log('我很努力的学习')
      }
    }
    const s1 = new Student('toy', 18, '高三')
    console.log(s1)
    s1.speak()
    s1.study()

  </script>
</body>
</html>

总结:

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

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

新 增属性的 最前面

3.类中所定义的方法,都是放在了类的原型对象上,供实例去使用


http://www.niftyadmin.cn/n/16613.html

相关文章

【0155】multiplex SIGALRM interrupts应用场景一:阻止恶意客户端连接攻击

文章目录 1. 概述2. 判断“恶意客户端”的依据2.1 以下两情形,均结束postgres进程3. timeout reason如何完成阻止恶意客户端3.1 三部曲1. 概述 在【0152】深入分析multiplex SIGALRM interrupts(1) 中讲解了PG引入Multiplex SIGALRM Interrupts的目的。本文我们就对timeout…

【Linux】Linux软件包管理器yum

希望你今天有一个好心情 文章目录一、(客户端&&服务器) (软件包&&软件包管理器yum) (利益链&&逻辑链)1.客户端&&服务器2.软件包&&软件包管理器3.一条利益链一条逻辑链二、Linux下包管理器yum的使用(root身份或sudo提权进行搜索list…

【读懂Autosar代码】-7-INLINE的使用--内联函数(inline function)

点击返回「Autosar从入门到精通-实战篇」总目录 共2页精讲 "><--返回「实战篇」博文-总目录--> "><--返回「Autosar从入门到精通-实战篇」专栏主页--> 通常函数调用需要一定的时间开销。这意味着执行调用时花费了时间用于建立调用、传递参数、跳…

NetInside助力IT提高业务性能管理能力(一)

需求简介 某外高桥公司的OA系统是其重要的业务系统&#xff0c;OA系统负责人表示&#xff0c;部分用户反馈&#xff0c;访问OA系统时比较慢。需要通过分析系统看一下实际情况。 信息部已对企业领导定义了独立的组&#xff0c;本次要主动分析领导们的使用体验快慢。如果OA系统…

【卡尔曼滤波器】递归算法

大家好&#xff0c;我是小政。最近在学习卡尔曼滤波&#xff0c;本篇文章记录一下我学习的卡尔曼滤波器中的递归算法&#xff0c;通过举例子让大家更加清晰理解递归到底是什么&#xff1f;希望与同是卡尔曼滤波研究方向的同学进行一些交流。 递归算法1.为什么要用卡尔曼滤波器&…

电脑开不了机系统应该如何恢复正常

电脑不仅携带方便&#xff0c;而且功能也十分强大&#xff0c;不过电脑使用时会时不时出现问题&#xff0c;如果电脑开不了机怎么办 怎么回事?这是我们经常会遇到的这种的问题&#xff0c;今天小编就和大家分享电脑开不了机了的原因及解决方法。 工具/原料&#xff1a; 系统…

Mapbox 与 Babylon.js 可视化 glsl 特效篇(三十一)

我决定不从Babylonjs 基础来讲了 直接整合mapbox与babylonjs可视化来讲 我整合一个类库 后续不断更新中 npm i haibalai/mapbox-babylonjs 初始化mapbox-babylonjs 类库&#xff0c; map 是mapbox.gl 的map 对象 import { BabylonMapManager } from “haibalai/mapbox-baby…

微信支付-全面详解(学习总结---从入门到深化)

微信支付_产品介绍 微信支付介绍 微信支付&#xff08;https://pay.weixin.qq.com&#xff09;是腾讯集团旗下中国领先 的第三方支付平台&#xff0c;一直致力于为用户和企业提供安全、便捷、专业的在线支付服务。 付款码支付 付款码支付是指用户展示微信钱包内的“付款码”给商…