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

01_React简介、基础入门

React 简介、基础入门

  • 一、React 简介
    • 1、是什么?
    • 2、谁开发的?
    • 3、为什么要学?
    • 4、React 的特点
    • 5、学习 React 之前你要掌握的 Javascript 基础知识
  • 二、React 入门
    • 1、相关 js 库
    • 2、Hello React 入门小例子---React16.8.0 版本
    • 3、为什么不用 js ,而需要使用 jsx
      • 3.1 使用 jsx 创建虚拟 DOM
      • 3.2 使用 js 创建虚拟 DOM
      • 3.3 通过对比发现
    • 4、虚拟 DOM 与真实 DOM
      • 4.1 关于虚拟 DOM
    • 5、JSX 语法规则
      • 5.1 例子
      • 5.2 语法规则
      • 5.3 JSX 小练习
        • 5.3.1 区分:【js 语句(代码)】与【js 表达式】
      • 5.4 模块与组件、模块化与组件化的理解
        • 5.4.1 模块
        • 5.4.2 组件
        • 5.4.3 模块化
        • 5.4.4 组件化

一、React 简介

1、是什么?

用于构建用户界面的 JavaScript 库
界面–》 视图
只关注视图层
例子:使用原有的知识去展示数据的步骤
1)发送请求获取数据
2)处理数据(过滤、整理格式等)
3)操作 DOM 呈现页面 (React 只关注这一步骤)

React 是一个将数据渲染为 HTML 视图的开源 Javascript 库

2、谁开发的?

由 Facebook 开发的,且开源
时间线:
1)起初由 Facebook 的软件工程师 Jordan Walke 创建
2)于 2011 年部署于 Facebook 的 newsfeed
3)随后在 2012 年部署于 Instagram(INS)
4)2013 年 5 月宣布开源

近十年 “陈酿”React 正在被腾讯、阿里等一线大厂广泛使用

3、为什么要学?

1)原生 Javascript 操作 DOM 繁琐、效率低(DOM-API 操作 UI)

document.getElementById('app')
document.querySelector('#app')
document.getElementsByTagName('span')

2)使用 Javascript 直接操作 DOM, 浏览器会进行大量的重绘重排
3)原生 Javascript 没有组件化编码方案,代码复用率低
js 的模块化:将非常庞大的 js 按照功能点拆分成一个个小的 js,这就要做模块化
组件化:将结构和 js 都拆分成小的部分

以上是原生 JavaScript 的痛点。

4、React 的特点

1)采用 组件化 模式、声明式编码,提高开发效率及组件复用率。
命令式编程:缺少任何一个步骤都没法得到结果
声明式编程:只需要说出想要的结果,过程可以省略
2)在 React Native 中可以使用 React 语法进行 移动端开发。
3)使用 虚拟 DOM + 优秀的 Diffing 算法, 尽量减少与真实 DOM 的交互

5、学习 React 之前你要掌握的 Javascript 基础知识

1)判断 this 的指向
2)class(类)
3)ES6 语法规范,模板字符串等
4)npm 包管理器
5)原型、原型链
6)数组常用方法,筛选最值、条件求和等
7)模块化

二、React 入门

文档: https://react.docschina.org/

1、相关 js 库

1) react.js: React 核心库

jsx
在 js 的基础上增加一些语法和规范, 使用 babel 来转换

2)react-dom.js 提供操作 DOM 的 react 扩展库
3)babel.min.js 解析 JSX 语法代码转为 JS 代码的库

2、Hello React 入门小例子—React16.8.0 版本

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><div id="test"></div><!-- 引入 react 核心库 --><script type="text/javascript" src="../js/react.development.js"></script><!-- 引入 react-dom,用于支持 react 操作DOM --><scripttype="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、创建虚拟 DOM. 此处一定不要写引号,因为不是字符串const vDom = <h1>Hello, React</h1>// 2、渲染虚拟 DOM 到页面// ReactDOM.render(虚拟DOM,容器)ReactDOM.render(vDom, document.getElementById('test'))</script></body>
</html>

3、为什么不用 js ,而需要使用 jsx

3.1 使用 jsx 创建虚拟 DOM

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><div id="test"></div><!-- 引入 react 核心库 --><script type="text/javascript" src="../js/react.development.js"></script><!-- 引入 react-dom,用于支持 react 操作DOM --><scripttype="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、创建虚拟 DOM. 此处一定不要写引号,因为不是字符串const vDom = <h1>Hello, React</h1>// 2、渲染虚拟 DOM 到页面// ReactDOM.render(虚拟DOM,容器)ReactDOM.render(vDom, document.getElementById('test'))</script></body>
</html>

3.2 使用 js 创建虚拟 DOM

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><div id="test"></div><!-- 引入 react 核心库 --><script type="text/javascript" src="../js/react.development.js"></script><!-- 引入 react-dom,用于支持 react 操作DOM --><scripttype="text/javascript"src="../js/react-dom.development.js"></script><script type="text/javascript">// 1、创建虚拟 DOM React.createElement(标签名, 标签属性, 标签内容)const vDom = React.createElement('h1', { id: 'title' }, 'Hello, React')// 2、渲染虚拟 DOM 到页面// ReactDOM.render(虚拟DOM,容器)ReactDOM.render(vDom, document.getElementById('test'))</script></body>
</html>

3.3 通过对比发现

当标签内容都是 ‘Hello, React’ 的时候差别不大。
但是当标签 h1 需要嵌套一个 span 标签再显示 ‘Hello, React’ 的时候,
js 创建就需要这么写

React.createElement('h1',{ id: 'title' },React.createElement('span', {}, 'Hello, React'),
)

jsx 就这么写

const vDom = (<h1><span>Hello, React</span></h1>
)

jsx 创建虚拟 DOM 就是原生 js 写语法糖

4、虚拟 DOM 与真实 DOM

4.1 关于虚拟 DOM

(1)本质是 Object 类型的对象(一般对象)
(2)虚拟 DOM 比较“轻”,属性比较少,真实 DOM 比较“重”。因为虚拟 DOM 是 React 内部在用,无需真实 DOM 上那么多的属性。
(3)虚拟 DOM 最终会被 React 转化为真实 DOM,呈现在页面上。

5、JSX 语法规则

5.1 例子

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>JSX 语法规则</title><style>.title {background-color: aquamarine;}</style></head><body><div id="test"></div><!-- 引入 react 核心库 --><script type="text/javascript" src="../js/react.development.js"></script><!-- 引入 react-dom,用于支持 react 操作DOM --><scripttype="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">let MyId = 'TestIn'// 1、创建虚拟 DOM. 此处一定不要写引号,因为不是字符串const vDom = (<div><h1 className="title" id={MyId.toLowerCase()}><span style={{ color: 'red', fontSize: '120px' }}>Hello, React</span></h1><h1 className="title" id={MyId.toUpperCase()}><span style={{ color: 'red', fontSize: '80px' }}>Hello, React</span></h1><input type="text"></input><Good></Good></div>)// 2、渲染虚拟 DOM 到页面// ReactDOM.render(虚拟DOM,容器)ReactDOM.render(vDom, document.getElementById('test'))</script></body>
</html>

5.2 语法规则

(1)全称 Javascript XML
(2)react 定义的一种类似于 XML 的 JS 扩展语法:JS+XML
a. XML 早期用于存储和传输数据

<student><name>Tom</name><age>19</age>
</student>

使用 json 进行存储: “{“name”: “Tom”, “age”: 19}”

(3)定义虚拟 DOM 时,不要写引号
(4)标签中混入 JS 表达式时 要用花括号 {}
(5)样式的类名指定不要用 class,需要使用 className
a. class 是 es6 中的关键字,react 在设计的时候避开了这个,所以用 className
(6)内联样式,要用 style={{key: value}} 的形式去写
(7)虚拟 DOM 必须只有一个根标签
(8)标签必须闭合
(9)标签首字母
a. 若小写字母开头,则将该标签转为 html 中同名元素, 若 html 中无该标签对应的同名元素,则报错
b. 若大写字母开头,react 就去渲染对应的组件,若组件没有定义,则报错

5.3 JSX 小练习

在页面上动态展示 前端 js 框架列表

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>jsx小练习</title></head><body><div id="test"></div><!-- 引入 react 核心库 --><script type="text/javascript" src="../js/react.development.js"></script><!-- 引入 react-dom,用于支持 react 操作DOM --><scripttype="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">/*一定注意区分:【js 语句(代码)】与【js表达式】1. 表达式:一个表达式会产生一个值,可以放在任何一个需要值的地方下面这些都是表达式:(1) a(2) a+b(3) demo(1)(4) arr.map()(5) function test(){}2.js语句(代码):控制代码走向的下面这些都是语句(代码):(1) if(){}(2) for(){}(3) switch(){case: xxx}*/let data = ['Angluar', 'React', 'Vue']// 1、创建虚拟 DOM.const vDom = (<div><h1>前端 js 框架列表</h1><ul>{data.map((el, inx) => {return <li key={inx}>{el}</li>})}</ul></div>)// 2、渲染虚拟 DOM 到页面// ReactDOM.render(虚拟DOM,容器)ReactDOM.render(vDom, document.getElementById('test'))</script></body>
</html>
5.3.1 区分:【js 语句(代码)】与【js 表达式】

1. 表达式:一个表达式会产生一个值,可以放在任何一个需要值的地方
下面这些都是表达式:
(1) a
(2) a+b
(3) demo(1)
(4) arr.map()
(5) function test(){}

2.js 语句(代码):控制代码走向的
下面这些都是语句(代码):
(1) if(){}
(2) for(){}
(3) switch(){case: xxx}

5.4 模块与组件、模块化与组件化的理解

5.4.1 模块

1)理解:向外提供特定功能的 js 程序,一般就是一个 js 文件
2)为什么要拆分成模块:随着业务逻辑增加,代码越来越多且复杂
3)作用:复用 js ,简化 js 的编写,提高 js 运行效率

5.4.2 组件

1)理解:用来实现局部功能效果的代码和资源的集合(html、css、js、image 等)
2)为什么:一个界面的功能更复杂
3)作用:复用编码,简化项目编码、,提供运行效率

5.4.3 模块化

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

5.4.4 组件化

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

相关文章:

01_React简介、基础入门

React 简介、基础入门 一、React 简介1、是什么&#xff1f;2、谁开发的&#xff1f;3、为什么要学&#xff1f;4、React 的特点5、学习 React 之前你要掌握的 Javascript 基础知识 二、React 入门1、相关 js 库2、Hello React 入门小例子---React16.8.0 版本3、为什么不用 js …...

【Java 内存区域】

Java内存区域 JDK1.7 VS JDK1.8堆 (Heap)方法区 (Method Area)String 常量池 (String Pool)运行时常量池 (Runtime Constant Pool)虚拟机栈 (JVM Stack)局部变量表操作数栈动态链接方法返回信息 本地方法栈 (Native Method Stack)程序计数器 (Program Counter Register)元空间 …...

你是如何克服编程学习中的挫折感的?

一&#xff1a;学习之路 在编程学习的过程中&#xff0c;挫折和挑战是不可避免的。面对这些困难&#xff0c;我个人的一些经验和方法如下&#xff0c;或许能为你提供一些启示&#xff1a; 1. 学会分解问题 当遇到复杂的算法或者Bug时&#xff0c;我会将问题分解成更小的部分。…...

【AI应用实战】灵办AI插件集成详细指南

一、写在前面 随着AI技术的日新月异&#xff0c;大型模型应用如雨后春笋般涌现&#xff0c;从ChatGPT到文心一言&#xff0c;再到讯飞星火&#xff0c;无一不彰显着智能科技的无限潜力。而在这股浪潮中&#xff0c;我们欣喜地发现&#xff0c;一些创新的浏览器插件正悄然兴起&a…...

MySQL数据库连接超时问题排查报告

1、问题描述 边端设备访问云端过程中有概率出现MySQL数据库连接超时报错&#xff0c;具体报错代码如下&#xff1a; [2024-08-13 13:47:44,036] ERROR in app: Exception on /est-tasks/start [POST] Traceback (most recent call last): File "/usr/local/lib/python3.1…...

代码随想录第三天 | 链表

文章目录 链表理论知识定义链表删除链表 Leetcode203 移除链表元素代码实现 Leetcode707 设计链表代码实现复杂度分析错误点 Leetcode206 反转链表新建链表双指针法 链表理论知识 链接: https://programmercarl.com/%E9%93%BE%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.h…...

Python编码系列—Python数据可视化:Matplotlib与Seaborn的实战应用

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…...

putty中修改默认窗口大小和字体、字号

在WinSCP中调用putty&#xff0c;发现默认窗口太小&#xff0c;字号也很小&#xff0c;非常不友好。现在显示器都是1080p起步&#xff0c;所以很有必要修改之。 以中文版v0.70为例&#xff0c;方法&#xff1a; 1. 点击左上角图标 &#xff0c;选择下拉菜单中的“修改设置”&…...

Windows下网络编与ESP8266-WiFi通信(win32-API)

一、前言 络编程是指编写程序使不同计算机之间能够通过网络进行通信和数据交换。网络编程涉及使用网络协议和编程接口来建立、管理和终止网络上的数据通信。在这一领域中&#xff0c;TCP/IP协议族是核心组成部分&#xff0c;尤其TCP&#xff08;传输控制协议&#xff09;是面向…...

【Golang】golang安装一些依赖包时总是失败

Golang安装一些依赖包失败&#xff1a; 比如安装gin包&#xff1a;go get -u github.com/gin-gonic/gin 可能会报错&#xff1a;连接网络失败、超时等 这时可能需要修改go的环境配置&#xff0c;修改代理即可&#xff1a; go env -w GO111MO…...

ubuntu如何监控Xvfb虚拟显示器

在Ubuntu中监控Xvfb显示器主要涉及到使用VNC服务器来远程访问这个环境。以下是一些基本步骤&#xff1a; 安装Xvfb和相关工具: 使用apt安装Xvfb和x11vnc&#xff0c;x11vnc是一个VNC服务器&#xff0c;可以远程访问Xvfb创建的虚拟桌面环境。 sudo apt-get install xvfb sudo ap…...

小型需求管理软件盘点:8款功能强大的工具

本文介绍了以下8款工具&#xff1a;PingCode、Worktile、易得云、Ping、燃草、Gitee、Monday.com、Slack。 在现代企业管理中&#xff0c;需求管理一直是个让人头疼的问题&#xff0c;特别是对于小型企业来说&#xff0c;选择一款合适的需求管理软件往往比想象中更复杂。如果选…...

Labelme的安装与使用教程

文章目录 一、Labelme是什么&#xff1f;二、安装步骤1.新建虚拟环境2.安装Labelme3.Labelme的使用 三、json2yolo 一、Labelme是什么&#xff1f; Labelme是一个用于图像标注的开源工具&#xff0c;可以实现图像标注、语义分割、实例分割等。 本文记录一下labelme的安装与使…...

C#基础:数据库中使用Linq作分组处理(反射/直接分组)

目录 一、使用反射分组 二、不使用反射分组 三、调用示例 四、代码demo 一、使用反射分组 private static List<GroupList<T>> GetGroupList<T>(List<T> entities, string groupByProperty) {// 获取分组字段的类型var propertyInfo typeof(T).…...

Revite二次开发_使用WPF和WebView2制作一个访问网站的窗口

如果想在revit里打开网页&#xff0c;可以使用WebView2来实现&#xff0c;下面是一个代码示例。 也尝试过使用CefSharp&#xff0c;但由于Revit本身也使用了CefSharp&#xff0c;所以需要根据不同的Revit版本选择适合的CefSharp版本&#xff0c;比较麻烦&#xff0c;所以最好还…...

Java Spring Boot 连接数据库

要在Java Spring Boot应用程序中连接数据库&#xff0c;您需要遵循以下步骤&#xff1a; 1. 添加数据库依赖项&#xff1a;在您的Spring Boot项目中的pom.xml文件中添加数据库依赖项&#xff0c;例如MySQL或PostgreSQL等。例如&#xff0c;如果您要连接MySQL数据库&#xff0c;…...

Java面试八股之消息队列中推模式和拉模式分别有哪些使用场景

消息队列中推模式和拉模式分别有哪些使用场景 消息队列的推模式&#xff08;Push&#xff09;和拉模式&#xff08;Pull&#xff09;各有不同的使用场景和优缺点。下面我会详细介绍这两种模式及其适用场景&#xff1a; 推模式&#xff08;Push&#xff09; 特点&#xff1a;…...

springboot jar是如何启动的

我们先来看一个项目的打完包后的MANIFEST.MF文件&#xff1a; Manifest‐Version: 1.0 Implementation‐Title: spring‐learn Implementation‐Version: 0.0.1‐SNAPSHOT Start‐Class: com.tulingxueyuan.Application Spring‐Boot‐Classes: BOOT‐INF/classes/ Spring‐Bo…...

Android 12系统源码_屏幕设备(二)DisplayAdapter和DisplayDevice的创建

前言 在Android 12系统源码_屏幕设备&#xff08;一&#xff09;DisplayManagerService的启动这篇文章中我们具体分析了DisplayManagerService 的启动流程&#xff0c;本篇文章我们将在这个的基础上具体来分析下设备屏幕适配器的创建过程。 一、注册屏幕适配器 系统是在Disp…...

常用Mysql命令

前言 本文列举了一些常见的mysql操作 正文 一、连接和登录 MySQL 1. 使用命令行登录 MySQL 注意&#xff1a;需要将mysql的bin目录导入到环境变量中 mysql -u 用户名 -p示例&#xff1a; mysql -u root -p执行上述命令后&#xff0c;系统会提示输入密码&#xff0c;输入…...

IDEA Debug工具

一、Debug工具栏 自定义debug工具栏&#xff1a;先把debug程序运行起来->右击->配置 常用的工具&#xff1a; 二、DeBug常用图标详解 三、DeBug实践操作 常规Debug&#xff1a;略。 Stream Chain&#xff1a;处理流式语句 Reset Frame&#xff1a;重置方法入栈 …...

ARM64的汇编资源

最近在写一本ARM64的教材&#xff0c;所以在晚上查找了一下相关资源&#xff0c;都是免费开源的&#xff0c;不包括盗版书籍。 Exploring AArch64 assembler Roger Ferrer Ibez的博客文章&#xff0c;写在2016-2017年&#xff0c;内容简单充实&#xff0c;适合入门。 《ARM6…...

实验室安全分级分类管理系统在高校中的具体应用

盛元广通高校实验室安全分级分类管理系统的构建&#xff0c;旨在通过科学合理的管理手段&#xff0c;提高实验室的安全水平&#xff0c;保障师生的人身安全&#xff0c;防止实验事故的发生。这一系统通常包括实验室安全等级评估、分类管理、风险控制、安全教育与培训、应急响应…...

使用 prerenderRoutes 进行预渲染路由

title: 使用 prerenderRoutes 进行预渲染路由 date: 2024/8/20 updated: 2024/8/20 author: cmdragon excerpt: prerenderRoutes 函数是 Nuxt 3 中一个强大的工具,它能够帮助开发者优化页面加载速度和改善用户体验。通过使用 prerenderRoutes,你能够灵活地指定需要预渲染的…...

【深度解析】WRF-LES与PALM微尺度气象大涡模拟

查看原文>>>【深度解析】WRF-LES与PALM微尺度气象大涡模拟 针对微尺度气象的复杂性&#xff0c;大涡模拟&#xff08;LES&#xff09;提供了一种无可比拟的解决方案。微尺度气象学涉及对小范围内的大气过程进行精确模拟&#xff0c;这些过程往往与天气模式、地形影响和…...

redis事件机制

redis服务器是一个由事件驱动(死循环)的程序&#xff0c;它总共就干两件事&#xff1a; 文件事件&#xff1a;利用I/O复用机制&#xff0c;监听Socket等文件描述符发生的事件&#xff0c;如网络请求时间事件&#xff1a;定时触发的事件&#xff0c;负责完成redis内部定时任务&…...

【C++】模拟实现vector

可以把vector看作升级版的数组&#xff0c;可采用下标进行访问&#xff0c;非常高效&#xff0c;大小可动态改变&#xff0c;会自动扩容&#xff0c;数据存储在堆空间上。 VECROR 成员变量、函数及模板总览构造函数和析构函数无参构造函数构造n个元素大小的空间并初始化通过某个…...

【CAN-IDPS】汽车网关信息安全要求以及实验方法

《汽车网关信息安全技术要求及试验方法》是中国的一项国家标准,编号为GB/T 40857-2021,于2021年10月11日发布,并从2022年5月1日起开始实施 。这项标准由全国汽车标准化技术委员会(TC114)归口,智能网联汽车分会(TC114SC34)执行,主管部门为工业和信息化部。 该标准主要…...

EASE-Grid是啥东西?

EASE-Grid&#xff08;Equal-Area Scalable Earth Grid&#xff0c;等面积可扩展地球网格&#xff09;是NASA设计的网格系统&#xff0c;主要用于存储和处理全球范围内的地球科学数据。可以被理解为一种特殊的投影方式&#xff0c;使得在全球范围内进行数据分析和可视化时&…...

前端用户管理模块方法及api分析

用户管理 方法及对应api 搜索 searchSysUser / GetSysUserListByPage 重置 resetData 添加用户 addShow &#xff1a;点击按钮后出现对话框&#xff0c;含有提交 submit / SaveSysUser、取消按钮 修改 editSysUser / UpdateSysUser 删除 deleteById / DeleteSysUser 分配角色…...