01-React入门

news2024/10/4 16:34:45

React概述

react是什么?

React用于构建用户界面的JS库。是一个将数据渲染为HTML视图的开源JS库。

为什么学?

1.原生JS操作DOM繁琐,效率低

2.使用JS直接操作DOM,浏览器会进行大量的重绘重排

3.原生JS没有组件化编码方案,代码复用低

在学习之前最好看一下关于npm的知识:下面是我在网上看见的一个写的还不错的npm的文章

npm

React的特点

1.组件化开发,声明式编码,提高效率

  • 组件化开发:把复杂的代码,拆成一块一块组件,模块化开发
  • 声明式编码:比如我写了一个页面,页面上有一个蓝色的图形,我想改这个图形的颜色,我只需要通过改某个命令或者传入的某个参数就可以实现颜色的修改,不需要去修改这个页面代码,这便是声明式编码

2.在React Native中,使用React进行移动端开发

3.使用虚拟DOM+Diffing算法,减少真实DOM操作,大大提升效率

  • 虚拟DOM,是一种空间换时间的做法,数据先到虚拟DOM上,再通过虚拟DOM映射到真实DOM上,这种做法只有第一次页面加载时会稍慢一些(因为加了一层虚拟DOM到真实DOM的映射)。但是在后续数据变更,DOM修改的时候,就会明显体现优势。以前DOM更新操作只会去更新全体数据区域,消耗极大,而虚拟DOM在更新前会进行比对(Diffing算法),只更新需要更新的内容,减少新建开销,从而优化性能

以H5+JS引入的原生方式开始React

依赖导入

在这里插入图片描述
既然是原生H5,那么就要用script标签引入React的js依赖
介绍一下需要的js依赖,这三个是非常基础的库,而且一定要按图上固定的顺序导入
在这里插入图片描述

最后引入babel标签,告诉编译器,这里需要去从JSX转换成JS
在这里插入图片描述
注意:<script type="text/babel">如果类型写错了,会发生错误,导致浏览器不认识标签,因为JS中根本没有标签这一说
在这里插入图片描述

控制台信息

正常运行控制台会提示的信息
在这里插入图片描述

代码

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>Hello React!</title>
        <meta charset="UTF-8">
        <!-- 动态适配 -->
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link href="css/style.css" rel="stylesheet">
    </head>
    <body>
        <div id="test"></div><!--真实DOM-->

        <script type="text/javascript" src="../js/react.development.js"></script> <!--React核心的库-->
        <script type="text/javascript" src="../js/react-dom.development.js"></script><!--React操作Dom相关库-->
        <script type="text/javascript" src="../js/babel.min.js"></script><!--JSX转换成JS用的依赖,因为浏览器不认识JSX,只认识JS-->
        <!-- 最后引入babel标签,这里是告诉编译器这里是JSX,需要用babel转换成JS文件
            如果不小心写成其他的类型,那么浏览器就无法编译通过 -->
        <script type="text/babel">
            // 虚拟DOM创建
            const virDom=<h1>hello React</h1>
            // 将虚拟DOM渲染到某个指定的真实DOM上面
            ReactDOM.render(virDom,document.getElementById("test"))
        </script>
    </body>
</html>

用JS和JSX分别创建虚拟DOM

前置条件依旧是引入上面的三个依赖

用JS创建虚拟DOM

其实JS也可以做成类似于JSX的写法
首先回顾一下
传统创建真实DOM元素,可以通过操作document对象来进行创建

document.createElement("div")

而我们创建虚拟DOM,因为我们引入了React依赖,所以就可以通过React对象创建虚拟DOM。注意,即使是JS创建,也不可以想当然的用双引号把元素括起来,因为React不认识这种写法

React.createElement("标签名","标签属性","标签内容")
例子:
const virDom=React.createElement("h1",{id:'title'},'这是内容')

这样我们就通过JS创建了一个虚拟DOM元素,但是这种创建方式创建单层元素还好,一旦创建很多元素就会非常麻烦

比如我要在DIV里面套一个span(span没属性)就得这样:

const virDom=React.createElement("h1",{id:'title'}, React.createElement("span",{},'这是span内容'))
如果元素过多就得层层套娃,非常痛苦

最后渲染指定真实DOM即可,注意这里就有意思了,因为是JS创建的,所以标签类型指定了JS,而不是Babel

<script type="text/javascript">
    const virDom=React.createElement("h1",{id:'title'}, React.createElement("span",{},'这是span内容'))
    // 虚拟DOM创建
    // 将虚拟DOM渲染到某个指定的真实DOM上面
    ReactDOM.render(virDom,document.getElementById("test"))
</script>

测试肯定好用,就不演示了

但这样非常麻烦,一个元素就快累疯了,所以引入了JSX

用JSX创建虚拟DOM

此时用JSX就非常容易标签套娃了
const定义的时候套一层括号代表是一个整体,写完标签,渲染到真实DOM上就可以了

 <script type="text/babel">
     // 虚拟DOM创建,JSX开始套娃
     const virDom=(
         <h1>
             <h2>
                 <div>123</div>
             </h2>
         </h1>
     )
     // 将虚拟DOM渲染到某个指定的真实DOM上面
     ReactDOM.render(virDom,document.getElementById("test"))
 </script>

这里需要注意,因为JSX是JS+XML,所以如果不是单纯的标签语言,混入了一些JS,那么一定要用{}把JS代码括起来

const virDom=(
            <div>
                <h1>前端js框架列表</h1>
                <ul>
                    {
                        data.map((item,index)=>{
                            return <li key={index}>{item}</li>
                        })
                    }
                </ul>               
            </div>           
        )

JSX—>JS原理

所以到这里,大概就可以才出来babel的原理了
通过babel把写好的JSX,一层一层标签去挨个套娃转换,最终转换成这种React.createElement的JS创建形式。

    const virDom=React.createElement("h1",{id:'title'}, React.createElement("span",{},React.createElement(...n层标签)))

这也就是为什么前面控制台说,不建议用生产环境用Babel转换,这种转换的方式标签少的话还好,如果大量去现场从JSX转换成JS,那么会非常耗时,用户一进来看见一个白画面(等待从JSX转换成JS),这是很不友好的。后面开发时会替代这种写法。

虚拟DOM和真实DOM比较

关于虚拟DOM,本质就是Object,即为一般对象,所以相对于一个真实的DOM来说,更轻。
虚拟DOM是React内部在处理,无需真实DOM上的那么多属性。
但最后虚拟DOM还是会被转化为真实DOM,最后呈现在画面上。

在这里插入图片描述真实DOM具有很多的属性
在这里插入图片描述

JSX语法

定义JSX的时候不要写引号

JSX在创建虚拟DOM的时候,不可以用字符串引号创建,会导致无法识别
在这里插入图片描述

标签中混入JS表达式的时候要用{}

在JSX中,想用JS必须要用{}套一下,套完代码就会被认为是JS代码

比如给一个div标签设置id,利用{}进行读取

在这里插入图片描述
运行代码,则可以发现读取成功
在这里插入图片描述

样式类名

注意,React标签中,没有class属性,因为如果写了class就与ES6的语法相冲突,所以这里的class属性改名为className

如果React代码里写了class,就会被控制台提示是否是写错了

注意,class属性的话,是不需要去用{}进行插值的,这属于原生的代码

例子

在title属性中,定义一个css样式,准备在后面标签引用
在这里插入图片描述
在标签中直接以字符串的形式进行样式引用
在这里插入图片描述
样式生效
在这里插入图片描述
但是此时会被报错,也就是要改为className标记样式
在这里插入图片描述
改为className就没有报错了
在这里插入图片描述
在这里插入图片描述

内联样式

所谓内联样式就是在标签上面直接标出css、
例子: <span className = "sss" style = {{fontSize:'50px'; color:'origin'}}>

React中如果使用内联样式,则需要去用{{样式属性}}标记,注意是两层花括号

  • 外层花括号代表在JSX中引用JS
  • 内层花括号代表一个JS对象(对象里描述了样式)

则语法为:style={{key1:'value1' , key2:'value2'}}
在这里插入图片描述
在这里插入图片描述

只有一个根标签

这个不用多赘述,定义的那个虚拟DOM只保持一个根标签,图上多个就报错了
在这里插入图片描述

标签必须闭合

无论是单个或者多个标签,JSX中必须保持闭合
单个标签不闭合报错
在这里插入图片描述
闭合了即正确(2选1均可)
单标签闭合
在这里插入图片描述
双标签闭合
在这里插入图片描述

标签首字母

小写字母开头

就将标签转化为html同名元素,如果html中无该标签对应的元素,就报错;
随便定义一个标签

在这里插入图片描述
在这里插入图片描述

大写字母开头

react就去渲染对应的组件,如果没有就报错
在这里插入图片描述
直接认为是React标签,在React组件中找不到定义,则直接报错
在这里插入图片描述

JSX小练习

JS表达式和JS语句的区别

关于JS表达式和JS语句分别是什么:

JS表达式:返回一个值,可以放在任何一个需要值的地方 a a+b demo(a) arr.map() function text(){}

JS语句:if(){} for(){} while(){} swith(){} 不会返回一个值

这二者如何区分呢?
就是用 一个变量去接这个代码,看看有没有返回值

  • 有返回值的就是JS表达式
  • 没有返回值的就是语句(条件判断语句, 转向语句,循环执行语句…)

为什么要说这个?
是因为,标签中混入JS表达式的时候要用{}
换句话说:
就是,{}中只能放入JS表达式

举例

放入JS表达式,可能有返回值,可以放入
在这里插入图片描述

放入JS语句,没有返回值,报错
在这里插入图片描述

用JSX循环显示数组

在这里插入图片描述
渲染出来的效果
在这里插入图片描述
但是控制台会有报错
意思这种循环出来的标签,需要有自己的unique key,因为diffing算法需要用这个key,所以这里报错
在这里插入图片描述

稍加修改,用遍历时自动生成的index作为unique key,但是这种做法会有问题,但是这里先不用处理,后续学习中会说明
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

【GA-LSSVM预测】基于遗传算法优化最小二乘支持向量机的回归预测(MATLAB代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

数字化转型如何影响企业全要素生产率(2007-2022年)

参照赵宸宇等&#xff08;2021&#xff09;的做法&#xff0c;本团队对来自财贸经济《数字化转型如何影响企业全要素生产率》一文中的基准回归部分进行复刻 一、数据介绍 数据名称&#xff1a;数字化转型如何影响企业全要素生产率 数据范围&#xff1a;上市公司 数据年份&am…

NSSCTF第8页(2)

[LitCTF 2023]就当无事发生 没有环境 [MoeCTF 2022]ezhtml 在js代码找到了flag [HNCTF 2022 WEEK2]ez_ssrf 题目描述说让我们访问index.php,看到了代码 传入的data会base64解码&#xff0c;传参port和host&#xff0c;还有一个没见过的函数fsockopen 查了一下 fsockopen函…

驱动开发LED灯绑定设备文件

头文件 #ifndef __HEAD_H__ #define __HEAD_H__typedef struct {unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;unsigned int ODR; }gpio_t;#define PHY_LED1_ADDR 0x50006000 #define PHY_LED2_ADDR 0x50007000 #defin…

计算机算法分析与设计(18)---回溯法(介绍、子集和问题C++代码)

文章目录 一、回溯法介绍二、子集和问题2.1 知识概述2.2 代码编写 一、回溯法介绍 1. 回溯法&#xff08;back tracking&#xff09;是一种选优搜索法&#xff0c;又称为试探法&#xff0c;有“通用的解题法”之称&#xff0c;按选优条件向前搜索&#xff0c;以达到目标。但当探…

vue3 v-model的使用

&#x1f642;博主&#xff1a;锅盖哒 &#x1f642;文章核心&#xff1a;vue3 v-model的使用 目录 前言 什么是v-model&#xff1f; 基本的v-model用法 自定义组件中的v-model 前言 当涉及到Vue.js 3的前端开发时&#xff0c;v-model是一个不可或缺的工具&#xff0c;它…

从REST到GraphQL:升级你的Apollo体验

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

CPU寄存器与寻址方式

CPU寄存器与寻址方式 1 CPU寄存器2 表达数据位置3 寻址方式3.1 直接寻址3.2 寄存器间接寻址3.3 寄存器相对寻址3.4 基址变址寻址3.5 相对基址变址寻址3.6 按比例变址寻址&#xff08;SIB&#xff09; 本文属于《 X86指令基础系列教程》之一&#xff0c;欢迎查看其它文章。 1 C…

CDN+Nginx反向代理来隐藏c2地址

思路&#xff1a;通过借助CDN和Nginx反向代理和HTTPS来隐藏真实c2服务器Nginx反向代理&#xff1a;通过Nginx对外部流量转发到本地&#xff0c;再设置防火墙只允许localhost访问cs端口达到IP白名单的效果 准备 在这个实验环境中&#xff0c;我们需要准备服务器两台(一台服务端…

1978-2021年全国各省有效灌溉面积数据

1978-2021年全国各省有效灌溉面积数据 1、时间&#xff1a;1978-2021年 2、来源&#xff1a;农业统计NJ、各省NJ、国家统计J 3、指标&#xff1a;有效灌溉面积 4、范围&#xff1a;31省市 5、指标解释&#xff1a; 有效灌溉面积指具有一定的水源&#xff0c;地块比较平整…

爽,我终于实现了selenium图片滑块验证码!【附代码】

因为种种原因没能实现愿景的目标&#xff0c;在这里记录一下中间结果&#xff0c;也算是一个收场吧。这篇文章主要是用selenium解决滑块验证码的个别案列。 思路&#xff1a; 用selenium打开浏览器指定网站 将残缺块图片和背景图片下载到本地 对比两张图片的相似地方&#x…

驱动day4作业

通过字符设备驱动的分步实现编写LED驱动&#xff0c;另外实现特备文件和设备的绑定 head.h #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct{unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;unsigned int ODR; }…

2007-2022 年上市公司国内外专利授权情况数据

2007-2022 年上市公司国内外专利授权情况 1、来源&#xff1a;国家知识产权局 2、时间&#xff1a;2007-2022 年 3、范围&#xff1a;上市公司 4、指标&#xff1a; 证券代码、年份、省份、城市、行业代码、授权地区、申请类型、专利、发明专利、实用新型、外观设计 5、…

SpringBoot读取Resource下文件的几种方式读取jar里的excel,文件损坏

在项目中涉及到Excle的导入功能&#xff0c;通常是我们定义完模板供用户下载&#xff0c;用户按照模板填写完后上传&#xff1b; 这里待下载模板位置为resource/template/员工基础信息导入模板.xlsx&#xff0c; 分别尝试了四种读取方式&#xff0c;并且测试了四种读取方式分别…

Multi-task Classification Model Based On Multi-modal Glioma Data

框架 体会 为什么不对三个任务用一个CNN呢&#xff1f; 作者未公布代码

解决VMware虚拟机更新17.5.0版本后,启动虚拟机导致电脑重启的问题。(建议收藏)

今天VMware虚拟机又迎来了新的一次更新&#xff0c;这次更新重点在于安全性提高了不少。 更新也是花了不少时间&#xff0c;更新完成后&#xff0c;我满怀着激动欣喜的心情打开了我的Kali&#xff0c;。。。哎&#xff0c;不是&#xff0c;怎么黑屏了&#xff0c;然后看到了物…

报错:The supplied javaHome seems to be invalid. I cannot find the java executable

AS 升级遇到的问题 问题 升级 Android Studio&#xff0c;碰到无法检测到 java The supplied javaHome seems to be invalid. I cannot find the java executable. Tried location: D:\Program Files\Android\Android Studio\jre\bin\java.exe 然后去网上找解决思路。 终于…

【Java集合类面试六】、 HashMap有什么特点?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;HashMap有什么特点&…

订水商城H5实战教程-02系统登录

目录 1 创建数据源2 创建自定义应用3 创建全局变量4 实现登录功能5 控制弹窗是否显示6 最终的效果 上一篇我们分析了订水商城的功能&#xff0c;功能分析好了之后&#xff0c;就需要开发功能。用户登录商城的第一步就是进行登录&#xff0c;登录的时候需要同意用户协议&#xf…