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

React之组件的使用

Vue、React和Angular是三个流行的前端框架,采用组件化的开发方式。支持虚拟DOM(Virtual DOM)技术,有丰富的生态系统、大量的插件和工具可以使用。Vue的语法是传统的HTML和JavaScript,React使用JSX语法,Angular使用了TypeScript。Vue和React使用的是响应式数据绑定机制,即数据变化会自动更新视图,Angular使用的是双向数据绑定机制,即视图和数据之间可以互相同步变化。Vue和React是轻量级的框架,只关注视图层;Angular是完整的MVC框架,提供了更多的功能和约束,Vue和React比较适合中小型项目,Angular更适合中大型项目,但这只是建议,读者可以根据项目需求和个人喜好,选择适合的框架。本文主要介绍React 的基础知识。

一、 React特点,优缺点

特点:

  1. 组件化:React通过将UI分解为独立的可重用组件来构建复杂的用户界面。每个组件都有自己的状态和属性,可以独立地进行开发、测试和维护。

  2. 虚拟DOM:React使用虚拟DOM(Virtual DOM)来管理用户界面的更新。虚拟DOM是一个轻量级的JavaScript对象树,它与实际DOM保持同步,并且只在需要更新时才更新实际DOM,以提高性能。

  3. 单向数据流:React采用单向数据流的数据模型,即数据从父组件传递到子组件,子组件不能直接修改父组件的数据。这样可以更好地管理和跟踪数据的变化。

  4. 高性能:由于使用虚拟DOM和精确的DOM更新算法,React能够提供出色的性能。它只更新需要更改的部分,而不是整个界面,从而减少了不必要的DOM操作。

优点:

  1. 组件化开发使代码更易于维护和重用,提高开发效率。
  2. 虚拟DOM的使用减少了对实际DOM操作的频率,提高了性能。
  3. 单向数据流使数据的变化更易于追踪和调试。

缺点:

  1. 学习曲线较陡峭,对于初学者来说可能需要一些时间来熟悉其概念和使用方法。
  2. React仅关注于用户界面的构建,对于其他方面(如路由、状态管理等)需要结合其他库或框架来使用。

二、组件概念,特点

React 中的组件是用来封装可重用代码的基本单元。组件可以是函数式组件或类组件,并且可以通过组合其他组件来创建更大的组件。

组件的特点如下:

  1. 可组合性:组件可以通过嵌套和组合的方式来创建更复杂的组件,这使得代码更具有模块化和可重用性。
  2. 可重用性:组件可以在应用程序的不同部分进行重复使用,从而减少了重复编写代码的工作量。
  3. 可维护性:组件可以独立进行开发、测试和维护,使代码的维护更加容易。
  4. 单一职责:每个组件应该只关注一项功能,并且应该尽可能地小而简单。
  5. 状态管理:组件可以通过状态(state)来保存和管理数据,并且可以通过 props 属性向子组件传递数据。
  6. 视图渲染:组件可以根据状态的变化,自动更新视图,使用户界面保持与数据同步。

总之,组件是 React 中非常重要的概念,它们使得构建复杂的用户界面变得更加简单和可维护。通过将应用程序拆分为多个组件,我们可以提高代码的可读性和可重用性,并且更容易进行维护和扩展。

三、简单组件制作实例

1、创建项目

使用vite创建React项目,此项目执行环境为Window 10系统,执行下列命令前必须选安装 nodejs模块,具体方法可以查询其它文章。

首先在Window 10上打开命令行窗口,改变当前目录在您所在的练习目录下,例如,练习目录为'“d:\data"目录。输入命令:

d:  回车

cd data  回车

创建项目命令如下:

npm  create vite  my-app   回车,选择React和Javascript

cd  my-app  回车

npm install  回车

npm  run   dev  回车 (项目启动)

在浏览器中的地址栏中输入"http://localhost:5173",出现如下效果,即是项目初始化成功。

2、编写简单组件

用以下代码二覆盖App.jsx,代码如下:

import React,{ Component }from 'react';class App extends Component {render() {return (<div><h1>Hello, React!</h1><p>This is a simple React component.</p></div>);}
}export default App;

这是一个名为App的React组件,它在这里作为应用的主组件。它继承自React.Component类,并实现了一个render方法。render方法返回了一个JSX元素,包含一个<h1>标题和一个<p>段落。最后,通过export default语句,将该组件导出以供其他组件使用。

四、 复杂组件示例

此示例是 一个简易的BBS的项目,在这个项目中有两个组件,一个是PostList,用于展示BBS的帖子列表,另外一个是PostItem组件,用于展示BBS帖子,PostList使用PostItem组件,这样两者就形成了父子关系。最终效果如下所示:

1、设计思路

React 应用组件设计的一般思路是,通过定义少数有状态的组件管理整个应用状态的变化 ,并且将状态通过props传递给其余无状态组件,由无状态组件完成界面绝大部分UI的渲染工作。总之,有状态组件主要关注状态变化的业务逻辑,无状态组件主要关注组件UI渲染。

根据设计思路,可以将:

PostList组件设计为一介有状态组件,负责帖子列表数据的获取及点赞行为的处理,主要设计为一个继承Component的组件类,使用数据posts存储帖子数据,handleVote函数负责处理点赞行为,具体代码如下:

import React, { Component } from 'react';
import './PostList.css';
import PortItem from './PostItem';
class PostList extends Component {  constructor(props) {super(props);this.state = {posts:[]};this.timer=null;//定义定时器this.handleVote=this.handleVote.bind(this);//绑定this     }componentDidMount(){this.timer=setTimeout(()=>{this.setState({posts:[{id:1,title:'大家一起讨论吧',author:'张三',date:'2017-09-01 10:00',vote:0},{id:2, title:'今天天气不错',author:'李四',date:'2017-09-01 10:00',vote:0},{ id:3,title:'明天天气不错',author:'王五',date:'2017-09-01 10:00',vote:0}]});},1000)}componentWillUnmount(){if(this.timer){clearTimeout(this.timer);}}handleVote(id){//根据帖子id找到对应帖子,并修改vote值const posts=this.state.posts.map(item=>{const newItem=item.id===id ? {...item,vote:item.vote+1}:item;return newItem;   });//使用新的帖子数组更新state this.setState({posts});   }render() {return (<div className='container'><h2>帖子列表:</h2> <ul>{this.state.posts.map(item=><PortItem  post={item} onVote={this.handleVote} key={item.id}          />)}</ul></div>);  }
}export default PostList;

,PostItem组件设计为一个无状态组件,只负责每一个帖子的展示,内部有一个状态变量vote记录每个帖子的点赞数,主要设计为组件函数,根据PostList传递的post属性渲染UI,当发生点赞行为时,调用props.onVote方法将点赞逻辑交给PostList中的handleVote方法处理。代码如下:

//PortItem.jsx
import  React from 'react';
import './PostItem.css';function PostItem(props){const handleClick=()=>{props.onVote(props.post.id);}const { post }=propsreturn (<li className='item'><div className='title'>{post.title}</div><div className='author'>创建人:<span>{post.author}</span></div><div>创建时间:<span>{post.date}</span></div><div className='like'><button onClick={handleClick}>点赞</button>&nbsp;<span>{post.vote}</span></div></li>);
}export default PostItem;

本文从React基本知识说起,简要说明了React的特点和优缺点,组件概念和特点,简单组件的编写,最后以一简化的BBS项目讲述了组件的设计原则和技术细节。

相关文章:

React之组件的使用

Vue、React和Angular是三个流行的前端框架&#xff0c;采用组件化的开发方式。支持虚拟DOM&#xff08;Virtual DOM&#xff09;技术&#xff0c;有丰富的生态系统、大量的插件和工具可以使用。Vue的语法是传统的HTML和JavaScript&#xff0c;React使用JSX语法&#xff0c;Angu…...

深度学习--长短期记忆网络

1.引入 RNN 可以将以前的信息与当前的信息进行连接。例如&#xff0c;在视频中&#xff0c;可以用前面的帧来 帮助理解当前帧的内容&#xff1b;在文本中&#xff0c;可以用前面半句话的内容来预测后面的内容。但是&#xff0c; RNN 存在一个记忆消失的问题。例如&#xff0c;…...

研0 冲刺算法竞赛 day29 P2249 【深基13.例1】查找

P2249 【深基13.例1】查找 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路&#xff1a; ①二分查找 ②stl函数&#xff1a;lower_bound(a.begin(),a.end(),x) 返回第一个大于等于 x的数的地址 代码&#xff1a; #include<iostream> #include<algorithm> …...

基于vue框架的CKD电子病历系统nfa2e(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;患者,医生,药品信息,电子病历,临时医嘱,长期医嘱,健康科普 开题报告内容 基于Vue框架的CKD电子病历系统 开题报告 一、选题背景 随着信息技术的飞速发展和医疗信息化的深入推进&#xff0c;电子病历系统&#xff08;Electronic Medic…...

笔记:python 安装tar包报错

报错信息 ERROR: Could not find a version that satisfies the requirement setuptools>40.8.0 (from versions: none)ERROR: No matching distribution found for setuptools>40.8.0分析 1&#xff0c;当前已安装 setuptools 并且版本超过40.8.0 解决方案 缺包了&am…...

575. 分糖果

哈喽&#xff01;大家好&#xff0c;我是奇哥&#xff0c;一位专门给面试官添堵的职业面试员 文章持续更新&#xff0c;可以微信搜索【小奇JAVA面试】第一时间阅读&#xff0c;回复【资料】更有我为大家准备的福利哟&#xff01; 文章目录 一、题目二、答案三、总结 一、题目 …...

手机电量消耗分析工具 Battery Historian 指南

阅读五分钟&#xff0c;每日十点&#xff0c;和您一起终身学习&#xff0c;这里是程序员Android 本篇文章主要介绍 Android 开发中 电量 的部分知识点&#xff0c;通过阅读本篇文章&#xff0c;您将收获以下内容: 一、安装Battery Historian二、收集Batterystats 数据三、使用B…...

笔试练习day4

目录 WY22 Fibonacci数列题目解析解法暴力解法贪心代码 NC242 单词搜索题目解析例子1解析例子2解析例子3解析解法深度优先遍历dfs实现最终代码 BC140 杨辉三角解法线性dp问题代码 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&am…...

公主少爷都爱看的haproxy七层代理详细介绍及常见实验详解

目录 一、负载均衡 1.1什么是负载均衡 1.2为什么要实验负载均衡 1.3四层负载均衡 1.4七层负载均衡 1.5四层负载均衡和七层负载均衡的对比 二、什么是haproxy 2.1定义 2. 2功能和特点 2.3应用场景 2.4haproxy的分类 三、安装及基本配置的信息 3.1软件的安装 3.2ha…...

Android笔试面试题AI答之Kotlin(6)

文章目录 24. 以下代码执行的结果是什么&#xff1f;25. 解释一下下述Kotlin 代码有什么问题&#xff1f;26. 如何在 Kotlin 中创建常量&#xff1f;示例注意事项总结 27. Koltin 可以互换使用 IntArray 和 Kotlin 中的 Array 吗&#xff1f;IntArrayArray<Int>互换使用从…...

“tcp控制协议”的理解

情景解释&#xff1a; 1.过程&#xff1a; 在用户进行网络间通信时&#xff0c;不管是客户端还是服务端&#xff0c;都会有两个缓冲区——发送缓冲区和接受缓冲区。 通过4个缓冲区进行数据交流。 用户通过write()将数据发送到他的发送缓冲区中&#xff0c;再传输到服务端的…...

考试成绩查询系统,发成绩不再愁

在考试季落幕后&#xff0c;家长们总是怀着紧张的心情&#xff0c;期待着孩子们的成绩单。传统上&#xff0c;老师们需要手动发送成绩单给每位家长&#xff0c;这个过程不仅耗时耗力&#xff0c;而且容易出错&#xff0c;给老师们带来了不小的压力。 随着科技的进步&#xff0c…...

【扒代码】图像数据 Transformer

def forward(self, x, bboxes):# 确定对象的数量&#xff0c;如果不是零样本学习场景&#xff0c;则根据bboxes的数量确定num_objects bboxes.size(1) if not self.zero_shot else self.num_objects# backbone# 通过主干网络提取特征backbone_features self.backbone(x)# pre…...

光伏仿真系统的使用流程

为了更有效地规划设计并评估光伏电站的性能与经济性&#xff0c;光伏仿真系统应运而生。该系统通过模拟实际运行场景&#xff0c;为项目开发者提供全面的数据支持和决策依据。 1、气象数据分析 气象数据是光伏系统性能评估的基础。此阶段&#xff0c;仿真系统需收集并处理项目…...

【Dash】使用 dash_mantine_components 创建图表

一、Styling Your App The examples in the previous section used Dash HTML Components to build a simple app layout, but you can style your app to look more professional. This section will give a brief overview of the multiple tools that you can use to enhan…...

Unity 输入模块 之 初识新输入系统(其实也不新)

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正​ 1.介绍 当年的宣传网页Unity新一代输入系统介绍 - 技术专栏 - Unity官方开发者社区 老输入系统每次配置新项目都需要写…...

springboot+redis集群实现集群拓扑动态刷新温故

springboot项目&#xff0c;并集成redis集群&#xff0c;当redis集群节点宕掉后又恢复了&#xff0c;但springboot调用redis集群服务报错&#xff0c;下面对springboot集成redis集群实现集群拓扑动态刷新进行温习和巩固。 原因分析&#xff1a; 使用lettuce连接redis集群实例&a…...

LoadRunner常用函数介绍

内置函数和Jmeter差不多&#xff0c;Jmeter更火&#xff0c;更好百度&#xff0c;毕竟开源&#xff0c;用的人多&#xff0c;所以有些函数如果不太懂用法&#xff0c;可以百度Jmeter作为参考来使用LR。 脚本中常用函数 事务组 lr_start_transaction("KaiShi"); //…...

通讯录管理系统

目录 一. 实验目的 二. 系统设计 三. 系统设计流程&#xff1a; 四. 实验结果及效果展示 五. 实验总结 六. 附录&#xff1a;源代码 一. 实验目的 本次实验旨在通过实现一个简单的通讯录管理系统&#xff0c;加深对C语言结构体、数组、指针、函数、控制结构等基本概念的理…...

基于Python爬虫+机器学习的长沙市租房价格预测研究

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会

在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...

基于单片机的宠物屋智能系统设计与实现(论文+源码)

本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢&#xff0c;连接红外测温传感器&#xff0c;可实时精准捕捉宠物体温变化&#xff0c;以便及时发现健康异常&#xff1b;水位检测传感器时刻监测饮用水余量&#xff0c;防止宠物…...