第五章 在React中如何定义组件

news2025/2/22 12:56:40

一、安装react开发者工具

  在开始之前,我们先做准备一下辅助工具,类似于Vue的开发者工具,React 开发者工具是一款浏览器扩展,可以帮助您在浏览器中调试 React 应用程序。

下面是如何安装 React 开发者工具的步骤:

  1. 打开 Google Chrome 浏览器,访问 Chrome Web Store
  2. 在搜索框中输入 "React Developer Tools",然后点击结果。
  3. 点击 “添加至 Chrome” 按钮。
  4. 点击 “添加扩展程序”。
  5. 安装完成后,可以在 Chrome浏览器的右上角看到 React 开发者工具图标。

现在,您可以在任何加载了 React 应用程序的页面中使用 React 开发者工具。

在这里插入图片描述


二、react函数式组件

  React 函数式组件是 React 中一种编写组件的方式,它是一个 JavaScript 函数,可以接收 props 并返回要呈现的内容。与类组件不同,函数式组件不能存储状态,并且不能使用生命周期方法。

  • 首先搭建一个基本的代码架子,然后在一步一步添砖加瓦
<body>
    <!-- 准备好员工“容器” -->
    <div id="app"></div>

    <!-- 引入ReactJS核心库 -->
    <script type="text/javascript" src="../JS/react.development.js"></script>

    <!-- 引入React-DOM核心库,用于操作DOM -->
    <script type="text/javascript" src="../JS/react-dom.development.js"></script>

    <!-- 引入Babel,用于编译jsx为js -->
    <script type="text/javascript" src="../JS/babel.min.js"></script>

    <!-- 此处类型为babel -->
    <script type="text/babel">
      // 1、函数式创建组件
		
      
      // 2、将虚拟DOM渲染到页面
 
    </script>
</body>
  • 根据函数式的名字,我们以自己的理解,在script标签里面写一下代码
// 1、创建一个函数,里面返回使用jsx语法写的标签
function myFuncComponent () {
    return <h2>函数式组件,自己的理解</h2>
}

// 2、将虚拟DOM渲染到页面
ReactDOM.render(myFuncComponent,document.getElementId('app'))

此时将该代码运行在浏览器,浏览器并没有显示我们需要的内容,而是控制台报错了。

Warning: Functions are not valid as a React child. This may happen if you return a Component instead of <Component /> from render. Or maybe you meant to call this function rather than return it.

警告:函数作为React子函数无效。如果你从render中返回一个Component而不是<Component />,可能会发生这种情况。或者你想要调用这个函数而不是返回它。


  该错误告诉我们渲染组件,需要使用标签闭合的方式,那么我们在修改一下:

// 1、创建一个函数,里面返回使用jsx语法写的标签
function myFuncComponent () {
    return <h2>函数式组件,自己的理解</h2>
}

// 2、将虚拟DOM渲染到页面
ReactDOM.render(<myFuncComponent/>,document.getElementId('app'))

此时控制台又有了新的错误:

Warning: <myFuncComponent /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements. in myFuncComponent

Warning: The tag <myFuncComponent> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter. in myFuncComponent

警告:<myFuncComponent />使用了不正确的大小写。React组件使用PascalCase, HTML元素使用小写。在myFuncComponent

警告:标签<myFuncComponent>在此浏览器中无法识别。如果你想渲染一个React组件,请以大写字母开始它的名称。在myFuncComponent


  以上错误告诉我们,组件标签首字母要大写,我们在改一下:

// 1、创建一个函数,里面返回使用jsx语法写的标签
function MyFuncComponent () {
    return <h2>函数式组件,自己的理解</h2>
}

// 2、将虚拟DOM渲染到页面
ReactDOM.render(<MyFuncComponent/>,document.getElementId('app'))

此时终于在页面上渲染了我们想要的内容。开发者工具也捕获到了我们写的组件。

在这里插入图片描述


  • 在函数式组件中,this指向是谁?

我们可以打印一下:

// 1、创建一个函数,里面返回使用jsx语法写的标签
function MyFuncComponent () {
    // 打印this指向
    console.log(this)
    
    return <h2>函数式组件,自己的理解</h2>
}

// 2、将虚拟DOM渲染到页面
ReactDOM.render(<MyFuncComponent/>,document.getElementId('app'))

结果:undefined

  这里的this为什么是undefined呢?原因是我们这里使用了babel翻译,开启了严格模式,所以指向是undefined而不是window

是不是真的开启了严格模式,我们可以到babel官方网站 的Try it Out 试一试:

在这里插入图片描述


根据上图,我们知道是真的开启了严格模式,所以this指向是undefined

  • 总结函数式组件在React里面是怎么工作的

  我们知道React是在ReactDOM.render(<MyFuncComponent/>...) 中进行工作的。那么做了哪些工作呢?

  • 1、ReactDOM解析组件标签,找到了MyFuncComponent组件。
  • 2、发现组件是使用函数式定义的,随后调用该函数,将返回的虚拟DOM转为真实DOM,随后呈现在页面中。

三、类式组件

  React 类式组件是另一种在 React 中编写组件的方式。它是一个 JavaScript 类,可以使用生命周期方法和状态来实现更复杂的功能。

  • 首先同样搭建一个基本的代码架子,然后在一步一步添砖加瓦
<body>
    <!-- 准备好员工“容器” -->
    <div id="app"></div>

    <!-- 引入ReactJS核心库 -->
    <script type="text/javascript" src="../JS/react.development.js"></script>

    <!-- 引入React-DOM核心库,用于操作DOM -->
    <script type="text/javascript" src="../JS/react-dom.development.js"></script>

    <!-- 引入Babel,用于编译jsx为js -->
    <script type="text/javascript" src="../JS/babel.min.js"></script>

    <!-- 此处类型为babel -->
    <script type="text/babel">
      // 1、类式创建组件
		
      
      // 2、将虚拟DOM渲染到页面
 
    </script>
</body>
  • 我们以自己的理解,在script标签里面写一下代码

    参考官网文档,我们的类式组件需要继承ReactComponent

 // 1、类式创建组件
 class MyClassComponet extends React.Component{
     render() {
         return <h2>类式组件的定义</h2>
     }
 }		
      
 // 2、将虚拟DOM渲染到页面
 reactDOM.render(<MyClassComponet/>, document.getElementById('app'))

将此代码运行在浏览器中,发现可以加载出来内容,也没有报错,那是因为我们是参照官网的案例写的。但是我们还是要注意几点:

  • 组件名称,首字母必须要大写
  • 渲染组件时,要以标签的形式,且标签要闭合,否则会报语法错误。
  • 定义类式组件时,类必须继承ReactComponent

  • 接下来我们需要思考几个问题

1、类中的render方法来自哪里?

  既然我们能够使用这个方法,说明我们一定能够在这个类里面找到它,我们直接在浏览器里面输入类的名称看看会发生什么?

在这里插入图片描述

我们发现类的原型对象上出现了render函数,既然组件要使用到这个方法,必然要new应该实例对象调用。

所以render方法是在类的原型对象上面,供实例对象调用的。


2、render方法中的this是谁?

  想直接看到结果的方法就是我们在方法里面打印一下this,在一步一步研究。

 class MyClassComponet extends React.Component{
     render() {
         console.log(this)
         return <h2>类式组件的定义</h2>
     }
 }	

结果:

在这里插入图片描述

有图可知,该this指向的是由MyClassComponentnew出来的实例,且实例的原型对象上就是render方法。

所以我们类中**render方法中的this**指向的是类的实例对象,也叫组件实例对象。


  • 3、类式组件在React中是如何工作的?

  • 1、第一步呢和函数式组件是一样的,React解析组件标签,找到了MyClassComponent组件

  • 2、发现组件是类定义的,然后new出该类实例,并通过实例调用了原型上的render方法。

  • 3、将render方法返回的虚拟DOM转为真实DOM,最后呈现在页面中。


本章小结

  我们学习完React中函数式组件和类式组件,我们简单的回顾并总结一下它们到底有什么区别吧。

  • 定义方式不同:一个是用函数定义的,一个是用类定义的,当然这是显而易见的。
  • this的指向不同:函数式组件的thisundefined,类式组件的this是指向组件实例对象。
  • 性能不同:函数式组件通常比类式组件更快。显而易见,因为它们更简单,React可以更有效的优化它们。
  • 代码风格不同:函数式组件倾向于使用简洁、声明式的代码风格,而类式组件则可以更灵活的实现复杂的功能。
  • 状态不同:类式组件有状态,函数式组件无状态。状态是指组件内部的数据,可以通过this.statesetState方法管理。
  • 生命周期方法不同:类式组件有生命周期方法,函数式组件无生命周期方法。生命周期方法是指在组件的生命周期内待定时刻调用的方法,如:componentDidMountcomponentWillUnmount

  以上就是我们对函数式组件和对类式组件的总结和看法,当然最后两点需要通过后续学习来深入了解。在选择函数式组件还是类式组件时,请根据您的需求和代码风格进行决策。如果您需要处理状态或生命周期方法,则应该使用类式组件。如果您仅需要在屏幕上呈现数据,则可以使用函数式组件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/344672.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

常用类详解(三)StringBuilder

(1)一个可爱的字符序列。此类提供一个与StringBuffer兼容的API&#xff0c;但不保证同步(StringBuilder不是线程安全的)&#xff0c;该类被设计用作StringBuffer的一个简易替换&#xff0c;用在字符串缓冲区被单个线程使用的时候。如果可能&#xff0c;建议优先采用该类&#x…

保护品牌线上声誉的5种方法

我们如今生活在一个搜索便捷的世界&#xff0c;对于一个企业和个人来说&#xff0c;品牌的线上声誉也尤为重要。在客户考虑与您的公司开展业务之前&#xff0c;他们理所当然会先使用众多软件和平台搜索相关信息&#xff0c;以帮助他们了解和做决定。 因此&#xff0c;您的品牌…

2023最新整理软件测试面试题附答案

包含的模块&#xff1a; 本文分为十九个模块&#xff0c;分别是&#xff1a;软件测试 基础、liunx、MySQL、web测试、接口测试、APP测试 、管理工具、Python、性能测试、selenium、lordrunner、计算机网络、组成原理、数据结构与算法、逻辑题、人力资源需要的可以找我获取&…

预算砍砍砍,IT运维如何降本增效

疫情短暂过去&#xff0c;一个乐观的共识正在蔓延&#xff1a;2023年的互联网&#xff0c;绝对不会比2022年更差。 “降本”是过去一年许多公司的核心策略&#xff0c;营销大幅缩水、亏损业务大量撤裁&#xff0c;以及层出不穷的裁员消息。而2023年在可预期的经济复苏下&#…

ChatGPT走红| 微软ATP带你开启高校AI人才培育新时代

与传统搜索引擎不同的是&#xff0c;ChatGPT不是机械罗列出相关网页结果&#xff0c;而是将答案进行整理、优化&#xff0c;以对话形式呈现给用户&#xff0c;还能很快根据上下文互动&#xff01;甚至有人用它辅助自己写论文、完成文字性作业……▍抢跑早规划 入门AI不迷茫AI体…

【C++】类和对象(三)

目录 一、构造函数补充 1、初始化列表 1.1、初始化列表概念 1.2、初始化列表性质 2、explicit关键字 二、static成员 1、概念及使用 2、性质总结 三、友元 1、友元函数 2、友元类 四、内部类 五、拷贝对象时的一些编译器优化 一、构造函数补充 在《类和对象&#x…

GeoTools:FeatureShapefile之CRUD操作

之前在《GIS开源框架&#xff1a;ArcGIS文件地理数据库(GDB)解析与入库》中&#xff0c;从地理数据库的角度对Feature要素进行了解释&#xff0c;接下来&#xff0c;我们将从GeoTools库的角度&#xff0c;重新认识Feature要素&#xff0c;并通过GeoTools实现Shapefile文件在Fea…

产品、技术:如何编写有效的流程文档?

流程文档是指一系列的、连续的、有规律的活动过程&#xff0c;而这些活动以特定的方式进行&#xff0c;并导致特定结果&#xff08;创造价值&#xff09;的产生。流程梳理是指围绕企业的内部要素与外部要素&#xff0c;对整个企业的业务特点和现状进行深入细致的分析、整理、提…

Fiddler使用笔记(柠檬班)

Fiddler笔记 内部功能 Replay 重放请求。 号 移除请求&#xff0c;可以通过Shift Delete来选择要保存的请求&#xff0c;其他的都删掉。 Go 断点的时候使用&#xff0c;作用是转到下一步。 Stream 流模式&#xff0c;一般不用它。 Decode 用于解码信息。通常对响应…

Ambire AdEx 2023 年路线图

Ambire AdEx 是为简化 web3 显示广告而建立的&#xff0c;领先于时代。到 2023 年&#xff0c;它将专注于服务用户需求&#xff0c;同时保持其作为区块链隐私解决方案的核心&#xff0c;反对传统的数字广告模式。 回顾 2022 年 2022 年&#xff0c;AdEx 网络处理了超过 1 亿次展…

Hudi-并发控制

并发控制 Hudi支持的并发控制 MVCC Hudi的表操作&#xff0c;如压缩、清理、提交&#xff0c;hudi会利用多版本并发控制来提供多个表操作写入和查询之间的快照隔离。使用MVCC这种模型&#xff0c;Hudi支持并发任意数量的操作作业&#xff0c;并保证不会发生任何冲突。Hudi默…

小米电视安装 Plex 打造家庭影院

背景 最近突然想重温教父&#xff0c;本来想着直接投屏就可以&#xff0c;后来看了别人搭建的基于 NAS 的家庭影院很动心&#xff0c;也想依葫芦画瓢做一个&#xff0c;跟对象申请经费的时候被拒了&#xff0c;理由是有这钱还不如开个会员直接看。 我寻思不同电影在不同的平台…

遥感反演叶面积指数 (LAI)

叶面积指数 叶面积指数&#xff08;Leaf Area Index, LAI&#xff09;是反映一个生态系统中单位面积上的叶面积综合的一半&#xff0c;是模拟陆地生态过程、水热循环和生物地球化学循环的重要参数。 本文主要介绍LAI的遥感反演方法&#xff0c;其主要分为统计方法、植被辐射传输…

传奇私服搭建网站的几种方法

搭建网站的几种方法&#xff1a;一些人&#xff0c;连简单的搭建网站都不会&#xff0c;还要请技术帮忙&#xff0c;真是牛B&#xff0c;这里简单介绍下几种办法一&#xff1a;2003系统下&#xff0c;直接使用IIS&#xff0c;这个太简单了&#xff0c;桌面上就有IIS&#xff0c…

权威报告!这五个消费趋势,告诉你如何抓住中国消费者的心和钱包

有人说2023年是消费复苏的一年&#xff0c;市场回暖趋势明显&#xff1b;也有人说之前的亏空太大&#xff0c;想要短时间追上来不太可能&#xff0c;因此2023的消费市场最多是不低迷&#xff0c;达不到火热。这可把做生意的各位老板整纠结了&#xff0c;究竟今年要不要投个大手…

mysql 跳过事务 gtid

企业生产场景mysql主从复制故障原因 企业生产场景mysql主从复制故障原因 实验一&#xff1a; 目的&#xff1a;解决主从不同步&#xff08;本例中sql线程出现问题&#xff09; 方法&#xff1a;模拟故障场景 1.在SLAVE上建立一个名为yingying数据库。…

Webstorm 代码没有提示,uniapp 标签报错

问题 项目是用脚手架创建的&#xff1a; vue create -p dcloudio/uni-preset-vue my-project 打开之后&#xff0c;添加view标签警告报错的。代码也没有提示&#xff0c;按官方说法&#xff1a;CLI 工程默认带了 uni-app 语法提示和 5App 语法提示。 但是我这里就是有问题。…

Oracle实现高可用性的工具(负载均衡/故障切换)

Oracle实现高可用性的工具&#xff08;负载均衡/故障切换&#xff09;1 Oracle RAC故障转移负载均衡2 Data Guard负载均衡-读写分离Data Guard Broker3 GDSGSM&#xff1a;连接管理工具主要功能Data Guard Broker功能是监控Data Guard状态&#xff0c;当主库异常时自动切换角色…

idea2021版本新建maven项目

首先我们需要下载maven版本(maven下载地址Maven – Download Apache Maven)&#xff0c;并且配置好maven仓库与环境变量&#xff0c;这里不细述了。打开idea选择新建项目&#xff0c;选择maven&#xff0c;效果如下图 我们选择maven-archetype-webapp类型。 下一步&#xff0c;…

4.9 内部类

文章目录1.内部类概述2.特点3.练习 : 内部类入门案例4.成员内部类4.1 练习 : 被private修饰4.2 练习 : 被static修饰5.局部内部类6.匿名内部类1.内部类概述 如果一个类存在的意义就是为指定的另一个类&#xff0c;可以把这个类放入另一个类的内部。 就是把类定义在类的内部的情…