当前位置: 首页 > news >正文

React组件详解

React组件分为两大类
1.函数组件
2.类组件(最常用)

组件化

import ReactDom from "react-dom";//
// 1.通过函数创建一个组件
// 2.函数名字必须大写开头
// 3.函数必须有返回值
function Func1() {return <h2>这是一个基础组件</h2>;
}const Hello = () => <div>我是一个箭头组件</div>;const element = (<div><h1>函数组件学习</h1><Func1></Func1><Hello></Hello></div>
);ReactDom.render(element, document.getElementById("root"));

若定义的是函数组件需要满足:
1.通过函数创建一个组件
2.函数名字必须大写开头
3.函数必须有返回值

类组件

import ReactDom from "react-dom";class Teacher {// 构造函数constructor(name, age) {this.name = name;this.age = age;}sayhi() {console.log("大家好,我是", this.name);}
}const student = new Teacher("张三", 30);
student.sayhi();const element = () => <div>标题</div>;ReactDom.render(element, document.getElementById("root"));

类的继承

import ReactDom from "react-dom";class Teacher {// 构造函数constructor(name, age) {this.name = name;this.age = age;}sayhi() {console.log("大家好,我是", this.name);}
}
//
// const student = new Teacher("张三", 30);
// student.sayhi();class SuperTeach extends Teacher {constructor(name, age, skill) {super();this.skill = skill;}say() {console.log("口若悬河");}
}const teach = new Teacher("ZHANGYU", 98);
const superteach = new SuperTeach("ZHANG8", 100000, "激光眼");
superteach.say();
teach.sayhi();
console.log(superteach.skill);const element = () => <div>标题</div>;ReactDom.render(element, document.getElementById("root"));

**extends:**是继承的关键词
**super()😗*可以进行属性的继承,并且增加新的属性

类组件

  • 类组件必须继承React.Component
  • 类中必须有render()
import ReactDom from "react-dom";
import React from "react";
// 1.类组件必须继承React.Component
//2.类中必须有方法class Hello extends React.Component {render() {return <div>我是Hello组件</div>;}
}const element = (<div><h1>类组件</h1><Hello></Hello></div>
);ReactDom.render(element, document.getElementById("root"));

如何把组件单独抽取到JS文件中

新建一个Hello.js的文件

import { Component } from "react";class Hello extends Component {render() {return <div>我是一个Hello组件</div>;}
}export default Hello;

在index.js文件中引入Hello.js文件

import ReactDom from "react-dom";
import React from "react";
import Hello from "./Components/Hello";
import Demo from "./Components/Demo";
// 1.类组件必须继承React.Componentconst element = (<div><h1>类组件</h1><Hello></Hello><Demo></Demo></div>
);ReactDom.render(element, document.getElementById("root"));

有状态组件和无状态组件

  • 函数组件是无状态组件函数组件不能自己提供数据
  • 类组件是有状态组件,它可以自己提供数据
  • 状态(State)为组件的私有数据,当组件状态发生变化时,页面结构也会发生变化
  • 函数组件没有状态,只负责页面展示,性能比较高
  • 类组件有着自己的状态,负责**更新UI,**只要类组件数据发生变化,UI就会发生更新
  • 在复杂的项目中,一般都是由函数组件和类组件共同完成的,React16.8以后提出的Hooks,让我们更多的使用函数组件完成

类组件如何提供状态

import { Component } from "react";class Hello extends Component {constructor() {super();this.state = {msg: "Hello",content: 0,};}render() {return <div>我是一个Hello组件{this.state.msg}</div>;}
}export default Hello;
import ReactDom from "react-dom";
import React from "react";
import Hello from "./Components/Hello";
import Demo from "./Components/Demo";
// 1.类组件必须继承React.Componentconst element = (<div><h1>类组件</h1><Hello></Hello><Demo></Demo></div>
);ReactDom.render(element, document.getElementById("root"));

方法二:
支持类实例属性
image.png

受控组件

import ReactDom from "react-dom";
import React, { Component } from "react";class App extends Component {state = {count: 0,msg: "啦啦啦",lists: ["张三", "李四", "王五"],newItem: "", // 添加一个新的 state 属性用于存储输入框的值username: "",desc: "",city: "",checkbox: false,};render() {return (<div><h1>常见的受控组件</h1><h3>文本框</h3><div>姓名:<inputtype="text"value={this.state.username}onChange={this.changeUsername}/></div><h3>文本域</h3><div>描述:<textareaname=""id=""cols="30"rows="10"value={this.state.desc}onChange={this.changeTextarea}></textarea></div><h3>下拉框</h3><selectname=""id=""value={this.state.city}onChange={this.changeSelect}>选择城市:<option value="1">北京</option><option value="2">上海</option><option value="3">广州</option><option value="4">深圳</option></select><h3>多选框</h3><div><inputtype="checkbox"checked={this.state.checkbox}onChange={this.changeBox}/>是否同意协议</div></div>);}changeUsername = (e) => {this.setState({username: e.target.value,});};changeTextarea = (e) => {this.setState({desc: e.target.value,});};changeSelect = (e) => {this.setState({city: e.target.value,});};changeBox = (e) => {this.setState({checkbox: e.target.checked,});};
}
ReactDom.render(<App />, document.getElementById("root"));

总结:首先提供一个State属性,然后提供一个onchange方法,在onchange里面提供一个函数用来改变值

多个受控组件封装

import ReactDom from "react-dom";
import React, { Component } from "react";class App extends Component {state = {count: 0,msg: "啦啦啦",lists: ["张三", "李四", "王五"],newItem: "", // 添加一个新的 state 属性用于存储输入框的值username: "",desc: "",city: "",checkbox: false,};render() {return (<div><h1>常见的受控组件</h1><h3>文本框</h3><div>姓名:<inputtype="text"value={this.state.username}onChange={this.handleChange}name="username"/></div><h3>文本域</h3><div>描述:<textareaname=""id=""cols="30"rows="10"value={this.state.desc}onChange={this.handleChange}name="desc"></textarea></div><h3>下拉框</h3><selectname="city"id=""value={this.state.city}onChange={this.handleChange}>选择城市:<option value="1">北京</option><option value="2">上海</option><option value="3">广州</option><option value="4">深圳</option></select><h3>多选框</h3><div><inputtype="checkbox"checked={this.state.checkbox}onChange={this.handleChange}name="checkbox"/>是否同意协议</div></div>);}handleChange = (e) => {const { name, type } = e.target;console.log(name);this.setState({[name]: type === "checkbox" ? e.target.checked : e.target.value,});};
}
ReactDom.render(<App />, document.getElementById("root"));

使用一个onchange方法然后,使用name判断其使用的是哪个方法

react属性名表达式

在es6以后属性名可以做为表达式使用但是需要使用【】

非受控组件

:::info
非受控组件借助ref,使用原生DOM的方式来获取表单的元素的值
:::
使用设置
1.使用React.createRef()函数创建引用

costructor(){super()this.txtRef = React.createRef()
}
txtRef = React.createRef()

2.创建引用对象时,添加文本框

<input type="text" ref={this.txtRef}>

3.通过ref对象获取文本框的内容

handleClick() =>{console.log(this.txtRef.current.value)
}

不常用的组件,推荐使用配置的组件

相关文章:

React组件详解

React组件分为两大类 1.函数组件 2.类组件&#xff08;最常用&#xff09; 组件化 import ReactDom from "react-dom";// // 1.通过函数创建一个组件 // 2.函数名字必须大写开头 // 3.函数必须有返回值 function Func1() {return <h2>这是一个基础组件</h…...

C++面试:内存溢出、内存泄漏的原因与解决

目录 内存溢出&#xff08;Memory Overflow&#xff09; 内存溢出介绍 解决内存溢出问题的方法 内存泄漏&#xff08;Memory Leak&#xff09; 内存泄露基础 解决内存泄漏问题的方法 内存溢出&#xff08;Memory Overflow&#xff09; 内存溢出介绍 内存溢出是指程序在执…...

【Java程序员面试专栏 算法思维】二 高频面试算法题:二分查找

一轮的算法训练完成后,对相关的题目有了一个初步理解了,接下来进行专题训练,以下这些题目就是汇总的高频题目,本篇主要聊聊二分查找,包括基础二分,寻找目标值的左右边界,搜索旋转数组以及波峰,以及x的平方根问题,所以放到一篇Blog中集中练习 题目关键字解题思路时间空…...

kaldi 详细安装教程、PyTorch-Kaldi、TIMIT下载、Librispeech下载

kaldi 详细安装教程 本kaldi 安装教程 转载于该链接kaldi 详细安装教程 安装系统依赖&#xff08;如果经常使用linux 服务器&#xff0c;一般都会有&#xff09; apt-get updateapt-get install -y --no-install-recommends g make automake autoconf bzip2 unzip wget sox …...

EtherCAT 转 ModbusTCP 网关

功能概述 本产品是 EtherCAT 和 Modbus TCP 网关&#xff0c;使用数据映射方式工作。 本产品在 EtherCAT 侧作为 EtherCAT 从站&#xff0c;接 TwinCAT 、CodeSYS 、PLC 等&#xff1b;在 ModbusTCP 侧做为 ModbusTCP 主站&#xff08;Client&#xff09;或从站&#xff08;Se…...

iMazing2024Windows和Mac的iOS设备管理软件(可以替代iTunes进行数据备份和管理)

iMazing2024是一款兼容 Windows 和 Mac 的 iOS 设备管理软件&#xff0c;可以替代 iTunes 进行数据备份和管理。以下是一些 iMazing 的主要功能和优点&#xff1a; 数据备份和恢复&#xff1a;iMazing 提供了强大的数据备份和恢复功能&#xff0c;可以备份 iOS 设备上的各种数据…...

carpower

车载android 电源管理 车载音响电源管理器_definitely的技术博客_51CTO博客...

数据结构2月25日

第一道&#xff1a; 第二道&#xff1a; 1、插入到prev和next中间 1.new(struct list_head*)malloc(sizeof(struct list_head*)); if(newNULL) { printf("失败\n"); return; } new->nextprev->next; prev->nextnew; return; 2、删除prve和next…...

改进 RAG:自查询检索

原文地址&#xff1a;Improving RAG: Self Querying Retrieval 2024 年 2 月 11 日 让我们来解决构建 RAG 系统时的一个大问题。 我们不能依赖语义搜索来完成每个检索任务。只有当我们追求单词的含义和意图时&#xff0c;语义搜索才有意义。 But in case&#xff0c;我们正…...

【Git企业实战开发】Git常用开发流操作总结

【Git企业实战开发】Git常用开发流操作总结 大家好 我是寸铁&#x1f44a; 总结了一篇Git常用开发流操作总结的文章✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 现在刚做项目的伙伴&#xff0c;可能你之前学过git&#xff0c;但是一实战发现不熟悉 没关系&#xff0c;看寸铁这篇…...

vue2+element医院安全(不良)事件报告管理系统源代码

目录 安全不良事件类型 源码技术栈 医院安全&#xff08;不良&#xff09;事件报告管理系统采用无责的、自愿的填报不良事件方式&#xff0c;有效地减轻医护人员的思想压力&#xff0c;实现以事件为主要对象&#xff0c;可以自动、及时、实际地反应医院的安全、不良、近失事件…...

leetcode初级算法(python)- 字符串

文章目录 1.反转字符串常规算法pythonic 算法2.整数反转数学法字符串法3.字符串中的第一个唯一字符pythonic算法哈希算法4.有效的字母异位词常规算法进阶算法5.最长公共前缀1.反转字符串 输入:[‘h’,‘e’,‘l’,‘l’,‘o’] 输出:[‘o’,‘l’,‘l’,‘e’,‘h’]...

Python 鼠标模拟

鼠标模拟即&#xff1a;通过python 进行模拟鼠标操作 引入类库 示例如下&#xff1a; import win32api import win32con import time 设置鼠标位置 设置鼠标位置为窗口中的回收站。 示例如下&#xff1a; # 设置鼠标的位置 win32api.SetCursorPos([30, 40]) 双击图标 设置…...

Linux进程 ----- 信号处理

前言 从信号产生到信号保存&#xff0c;中间经历了很多&#xff0c;当操作系统准备对信号进行处理时&#xff0c;还需要判断时机是否 “合适”&#xff0c;在绝大多数情况下&#xff0c;只有在 “合适” 的时机才能处理信号&#xff0c;即调用信号的执行动作。 一、信号的处理…...

【数位】【数论】【分类讨论】2999. 统计强大整数的数目

作者推荐 动态规划的时间复杂度优化 本文涉及知识点 数位 数论 LeetCode2999. 统计强大整数的数目 给你三个整数 start &#xff0c;finish 和 limit 。同时给你一个下标从 0 开始的字符串 s &#xff0c;表示一个 正 整数。 如果一个 正 整数 x 末尾部分是 s &#xff08…...

MongoDB聚合运算符:$atan2

$atan2用来计算反正切&#xff0c;返回指定表达式的反正切值&#xff0c;与$antan的区别主要是参数不同。 语法 { $atan2: [<expression1>, <expression1>] }<expression>为可被解析为数值的表达式$atan2返回弧度&#xff0c;使用$radiansToDegrees运算符可…...

敏捷开发最佳实践:价值维度实践案例之ABTest中台化

22年敏捷白皮书调研发现&#xff0c;仅有14%的企业部分实现价值管理闭环&#xff0c;8%的企业能够做到企业战略和业务目标与价值管理紧密结合。这一现象说明了大部分中国企业还不能在敏捷实践中实现需求价值的体系化及多维度价值度量&#xff0c;因此推广优秀的敏捷实践至关重要…...

爬虫基本库的使用(requests库的详细解析)

注&#xff1a;本文一共4万多字&#xff0c;希望读者能耐心读完&#xff01;&#xff01;&#xff01; 前面,我们了解了urllib库的基本用法&#xff08;爬虫基本库的使用(urllib库的详细解析)-CSDN博客&#xff09;。其中&#xff0c;确实又不方便的地方。例如处理网页验证…...

QT实现串口通信

一.Qt串口通信 Qt提供了两个关于串口通信的C类&#xff0c;分别是QSerialPort和QSerialPortInfo。 QSerialPort类提供了操作串口的各种接口。 QSerialPortInfo是一个辅助类&#xff0c;可以提供计算机中可用的串口的各种信息。 QSerialPortInfo Class用于提供外部串行端口的…...

微信小程序 --- 通用模块封装(showToast,showModal ,本地存储)

目录 01. 为什么进行模块封装 02. 消息提示模块封装 03. 模态对话框封装 04. 封装本地存储 API 05. 拓展:封装异步存储API优化代码 01. 为什么进行模块封装 在进行项目开发的时候&#xff0c;我们经常的会频繁的使用到一些 API&#xff0c; 例如&#xff1a;wx.showToast…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...