3.组件的基本用法

news2024/11/17 21:56:51

目录

1  创建组件

1.1  用函数创建组件

1.2  使用类创建组件

2  项目上组件的使用方式

3  事件处理

3.1  事件绑定

3.1.1  类组件绑定事件

3.1.2  函数组件绑定事件

3.2  事件对象

4  组件状态

4.1  初始化状态

4.2  获取状态

4.3  设置状态

4.3.1  箭头函数

4.3.2  重新绑定this

5  表单处理

5.1  受控组件

5.1.1  input

5.1.2  textarea

5.1.3  select

5.1.4  checkbox

5.1.5  多表单元素优化

5.2  非受控组件

6  发表评论案例


1  创建组件

1.1  用函数创建组件

创建组件的函数名称必须以大写字母开头,小写会报错导致不能成功渲染,原因是你发现html的标签首字母都是小写的,你自定义组件用大写有个区分

创建组件的函数必须有返回值,不写不行,至少要写成 return null 才不会报错

定义的时候把jsx写在return中,用的使用使用以函数名相同的标签就行了,我下面的是双标签,你也可以使用单标签

一般来讲我们不会使用箭头函数作为创建组件的函数,但箭头函数可以创建组件

1.2  使用类创建组件

用关键字class定义一个类 My_components 用关键字extends继承 React.Component

  • 自定义组件需要以大写字母开头
  • 需要有render(),render()中需要有return

2  项目上组件的使用方式

一般来讲每一个组件都会独占一个JS文件,之后会有一个文件夹放所有的组件JS文件,我们下面做个例子

首先在src中创建一个文件夹Components,然后在Components中创建一个JS文件,这个JS文件的名字就是组件的名字

之后在My_components.js中创建组件,然后导出

之后进入index.js,引用后就可以渲染了

用函数定义的组件也可以像上面一样导出,index.js代码不变

3  事件处理

3.1  事件绑定

3.1.1  类组件绑定事件

  • this.something就是上面定义的something函数,如果你直接在onClick后的大括号中写console.log(1),那么在运行一开始就会被执行,且后面再点击是无效的
  • React事件采用驼峰命名法,onClick是点击事件,onMouseEnter是鼠标移动到元素上触发的事件

按照上面的代码后点击了3次,发现可以成功绑定事件

3.1.2  函数组件绑定事件

打开后点了三下

3.2  事件对象

React中的事件对象叫做合成事件或合成事件对象,可以兼容所有浏览器

给事件处理函数一个形参就可以拿到事件对象

用法和原生JS的事件对象用法相似,比如可以获取 pageX.pageY,e.preventDefault()可以阻止浏览器的默认行为(比如a标签的跳转页面)

4  组件状态

用函数创建的组件叫无状态组件,用类创建的组件叫有状态组件,状态(state)就是数据,比如说组件是否被勾选了这种就叫状态。

当我们只需要展示数据的时候我们用函数组件,需要交互的时候我们用类组件

我们通过 state 获取状态,通过 setState() 设置状态,state的值是对象,其中包含多组键值对,这些键值对在默认情况下只能在组件内部使用(通过组件通讯可以给其他的组件使用)

4.1  初始化状态

我们可以这样初始化state,其中constructor(),super(),this.state的名称都是固定的,count及后面的值是自定义的

也可以这样初始化state,一般来讲会用下面这种,写起来比较方便

4.2  获取状态

可以使用this.state拿到状态,我们搞一下看看

4.3  设置状态

不能直接操作this.state.count,比如用等于号进行赋值,对列表push这些操作,直接进行这些操作会报错。想要设置状态要使用this.setState()进行修改

设置状态后会对组件的渲染结果产生影响,如果我们想改变组件的一些内容,我们只需要对state进行修改就可以了

这样写会有this的指向问题

点击按钮后会报错,报错的原因是不能读取 undefined属性的setState属性,也就是说此时在add_one()中的this是undefined

可以用下面两种方法解决this指向的问题

4.3.1  箭头函数

箭头函数自身不绑定this,如果写了this默认为箭头函数外一层的this,也就是你定义的组件

点三下发现没问题,既改变了state中的count,又更新了UI

也可以这样写,这样写的this指向的是render()的this,render()的this就是组件的this

还可以这样写,这样写就给this传进来了,this就不再是undefined了

4.3.2  重新绑定this

也可以对this进行重新绑定

重新绑定后可以正常使用了

5  表单处理

5.1  受控组件

5.1.1  input

定义一个状态的变量something,然后把原本的value交给这个变量something来管理,之后定义onChange事件,每一次输入框内容改变的时候都会将文本框中的内容赋值给变量something

  • something是自定义的变量,名称自定
  • 调整完上面说的后,此时input受React控制,我们称input为受控组件

5.1.2  textarea

textarea除了改了个标签名,剩下没有变化

5.1.3  select

select有一些区别

由于我们给了默认值,所以刚打开页面的时候,就会以默认值渲染

选择其他选项后点击按钮可以正常获取信息

5.1.4  checkbox

checkbox需要将value改成checked,变量定为布尔量

打开后会渲染指定的状态

也可以获取目前的状态

5.1.5  多表单元素优化

每用一个表单元素都得需要一个变量存储状态的值,再加上一个处理程序修改值,那样会有很多个处理程序,很麻烦

我们简单做个判断,如果类型是checkbox就拿checked属性,如果不是就拿value属性,然后给每一个表单元素一个name,name与state中的状态名称相同

点击按钮后可以获取当前状态

5.2  非受控组件

这种方式不常用,看别人写了能懂就行

使用ref对象,ref全称是reference,React中的ref对象是操作DOM用的

6  发表评论案例

打开是这样的

输入评论人和评论内容后点击发表可以把内容显示在下面

全部代码 

class My_components extends React.Component {
    state = {
        username:"",
        remark:"",
        remark_list:[],
        // remark_list:[{username:1,remark:2,remark_id:0},{username:1,remark:3,remark_id:1}],
        remark_id:""
    }

    publish_remark = ()=>{
        if (this.state.username.trim() && this.state.remark.trim()) {
            this.setState({remark_id : this.state.remark_list.length},() => {
                const new_remark_list = [{...this.state,remark_id:this.state.remark_id},...this.state.remark_list]
                this.setState({remark_list : new_remark_list,username : "",remark : ""})
            })
        }
    }

    form_change = (e) => {
        const value = e.target.type==='checkbox'?e.target.checked:e.target.value
        this.setState({[e.target.name]:value})
    }

    load_remark = () => {
        if (this.state.remark_list.length === 0) {
            return <div>暂无评论,快去评论吧~</div>
        }
        else {
            return (
            <ul>
                {this.state.remark_list.map(item => <li key={item.remark_id}>评论人:{item.username} 评论内容:{item.remark}</li>)}
            </ul>
            ) 
        }
    }

    render() {
        return (
            <div>
                <input type="value" placeholder= "请输入评论人" name='username' value={this.state.username} onChange={this.form_change}></input>
                <br></br>
                <textarea placeholder= "清输入评论内容" name='remark' value={this.state.remark} onChange={this.form_change}></textarea>
                <br></br>
                <button onClick={this.publish_remark}>发表评论</button>
                {this.load_remark()}
            </div>
        )
    }
}

ReactDOM.createRoot(document.querySelector('div')).render(<My_components></My_components>)

这里的这个地方是一个回调函数,在JS中执行顺序与书写顺序不一定一致,我需要首先定义一个id,然后再给id,所以定义id一定在给id的代码之前

由于不能对状态直接进行操作,所以我们要新搞一个变量 new_remark_list 来覆盖掉之前的 remark_list

其中三个点的意思是继承指定变量的所有内容,这三个点可以用于对象也可以用于列表,如果用于列表可以选择将之前的内容放在前面还是放在后面,我下面的图是放在后面,如果写 [...this.state.remark_list,{...this.state,remark_id:this.state.remark_id}] 就是将之前的内容放在新列表的前面

可以直接返回html标签,然后在render()中直接使用函数进行渲染

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

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

相关文章

win10下Elasticsearch安装配置完整教程

一、在安装Elasticsearch引擎之前&#xff0c;必须安装ES需要的软件环境&#xff0c;安装Java JDK和配置JAVA_HOME环境变量 二.安装ElasticSearch服务&#xff0c;下载和安装es包 https://www.elastic.co/downloads/past-releases Elasticsearch 8.6.1 | Elastic 安装成功之…

数据结构 第五章 数组和广义表

还是会想你&#xff1a;点击收听 1 基本知识点 1、数组可以看作是下标和值的偶对的集合(具有相同类型的数据元素) 注意&#xff1a;数组是同类型值的集合&#xff1f;**错误**2、数组的存储方式&#xff1a;以行为主序(一行存储完成之后继续存储下一行)、以列为主序(一列存储…

【C++修行之路】C++入门之深剖变量

&#x1f37f;本文主题&#xff1a;C语法中的变量 &#x1f388;更多内容&#xff1a;C较C的改进 &#x1f495;我的主页&#xff1a;蓝色学者 文章目录前言概念什么是变量变量名变量类型为什么要有不同数据类型各自数据类型的本质结语前言 大家好久不见&#xff0c;今天是我…

22.1.29打卡 2023牛客寒假算法基础集训营1 ACDHKLM

2023牛客寒假算法基础集训营1_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ 网上高质量题解太多了, 我这就作为打卡日报随便写写 A 四个变量 a b记录两队得分 c d记录两队最多还能获得的得分 简单模拟 /* ⣿⣿⣿⣿⣿⣿⡷⣯⢿⣿⣷⣻⢯⣿⡽⣻⢿⣿⣿⣿⣿⣿⣿⣿⣿…

Ruoyi-Cloud框架学习-【02 Redis安装搭建+Ruoyi下载+Nacos数据库配置】

Redis服务端与客户端的安装与搭建 参考该博文 https://joycez.blog.csdn.net/article/details/128776284?spm1001.2014.3001.5502 安装文件 链接&#xff1a;https://pan.baidu.com/s/1v19C9Dhh-ZkNQ8l1RVGQkA 提取码&#xff1a;6mim Ruoyi-Cloud下载以及数据库配置 1、前…

MySQL主从复制的数据同步延迟(二)

1、介绍 主从复制环境在单机应用的时候没有问题&#xff0c;但是在实际的生产环境中&#xff0c;会存在 复制延迟 的问题 查看从库同步状态 在从库中执行 show slave status\G &#xff1a; mysql> show slave status\G *************************** 1. row **************…

Matlab论文插图绘制模板第73期—带等高线的光影曲面图

在之前的文章中&#xff0c;分享了Matlab曲面图的绘制模板&#xff1a; 光影曲面图&#xff1a; 带等高线的曲面图&#xff1a; 进一步&#xff0c;再来看一下带等高线的光影曲面图的绘制模板。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;Matlab论文插图绘制模板系…

make <board_name>_defconfigmake menuconfig

1.make <board_name>_defconfig (1)在uboot的顶层目录的Makefile中查找目标&#xff08;defconfig无法查到&#xff09;&#xff0c;检索config&#xff0c;找到目标config和目标%config 因为我们的目标为<board_name>_defconfig&#xff0c;所以需要看的是有通配…

发现了一个提取时间序列技术指标的神器

互联网上有一个最简单而又强大的技术库&#xff0c;叫做pandas_ta。这个python库为你提供了一个简化的API&#xff0c;让你从时间序列中提取技术分析指标。今天我将和大家一起学习这个库。记得点赞、收藏&#xff5e; 虽然你可能会将这些函数应用于股票价格&#xff0c;但你可…

python开发环境搭建实践

这里写自定义目录标题前言搭建过程anaconda下载与安装下载安装配置环境变量pycharm下载和安装下载安装激活总结前言 新年新气象&#xff0c;我也把电脑进行了重装系统。所以现在需要重新搭建各种开发环境&#xff0c;也不能说是各种&#xff0c;因为我只会python和Java。 先搭…

全国产交换机基本介绍(分类、性能指标、硬件构成及工作方式)

关于全国产交换机基础知识&#xff0c;您了解多少呢&#xff1f;来和海翎光电的小编一起学习一下吧&#xff01; 一、交换机的分类与性能指标 1.1 交换机的分类 按照网络构成方式来分的话&#xff0c;交换机分为三类&#xff1a;接入层交换机、汇聚层交换机和核心层交换机。按照…

93.transformer、多头注意力以及代码实现

1. Transformer架构 2. 多头注意力 3. 数学上来解释多头注意力 4. 有掩码的多头注意力 5. 基于位置的前馈网络 6. 层归一化 batch norm&#xff1a;比如说一行是一个样本&#xff0c;那么BN就是对一列进行归一化&#xff0c;就是对所有数据项的某一列特征进行归一化 layer nor…

【数据结构和算法】了解认识栈,并实现栈的相关函数

到现在我们了解并认识了线性表的概念&#xff0c;动态、静态顺序表的建立&#xff0c;以及两种链表的实现&#xff0c;接下来我们要认识一个新的内容&#xff0c;新的概念&#xff0c;栈&#xff0c;是基于顺序表或者链表的一种新型数据结构。 目录 一、栈是什么&#xff1f; …

RabbitMQ入门中篇

本篇博文目录一.Spring整合RabbitMQ1.导入依赖2.生产者3.消费者4.测试二.SpringBoot整合RabbitMQ1.导入依赖2.生产者3.消费者4.测试三.代码下载一.Spring整合RabbitMQ 在spring项目中使用RabbitMQ的Exchange模式的Topics&#xff0c;项目分为消费者spring项目和生产者spring项目…

Centos7安装kvm服务器

Centos7安装kvm服务器什么是kvm检查硬件是否支持kvm虚拟化启用嵌套虚拟化(可选)查看是否启用嵌套虚拟化嵌套虚拟化立即生效(临时)重新加载模块并验证虚拟机硬件直通虚拟机内查看嵌套虚拟化是否成功安装kvm服务器安装kvm的所有包(不推荐)启动libvirt服务查看是否正确设置了虚拟化…

Linux操作系统之线程安全

一、引入线程安全关于strtok函数不能在多线程中使用&#xff0c;为什么&#xff1f;运行结果原因如下&#xff1a;在strtok内部会有一个全局变量静态指针&#xff08;static char* ptr&#xff09;&#xff0c;一开始指针指向主线程的a&#xff0c;等到后面子线程开始分割时&am…

18 Java反射reflect(类加载+获取类对象+通用操作+设计模式+枚举+注解)

Java反射18 反射reflect18.1 类的加载18.2 Class对象18.3 获取类对象的3种方法18.4 反射通用操作18.4.1 常见方法18.4.2 通用操作18.5 设计模式18.5.1 概念18.5.2 好处18.5.3 工厂设计模式18.5.4 单例模式18.6 枚举18.7 注解18.7.1 概念18.7.2 定义注解18.7.3 注解属性类型18.7…

知名休闲服饰品牌——慕尚集团借力泛微实现统一办公、业务协同

客户简介 宁波中哲慕尚控股有限公司&#xff08;以下简称慕尚集团&#xff09;是中国知名的由新零售模式驱动的休闲时尚服饰多品牌运营公司。 旗下品牌有GXG,gxgjeans,gxg.kids,MODE COMMUTER等&#xff0c;覆盖时尚男女装、童装市场和其他时尚领域。2019年5月慕尚集团正式登…

不要在线上滥用CopyOnWriteArrayList,姿势不对性能真的很拉胯

从JDK1.5版本&#xff0c;JAVA提供了线程安全的List增强版CopyOnWriteArrayList&#xff0c;其保持线程安全的方式是&#xff1a;每次修改数据时&#xff0c;不会直接修改数据&#xff0c;而是把数据复制出来一份&#xff0c;对复制出来的数组进行操作。 通过这样的机制&#…

【图像算法】马赛克识别

【目的】 校验视频中出现马赛克的频率&#xff0c;抽象成将视频切割成图片&#xff0c;对每张代测图片进行自动化验证。 【实现】 图像边缘检测算法识别 算法步骤&#xff1a; 使用高斯滤波器&#xff0c;以平滑图像&#xff0c;滤除噪声。计算图像中每个像素点的梯度强度和…