React.js 简介以及一些基本概念

news/2025/2/22 20:10:03/

React 是什么

React 跟angular.js 和Vue.js 一样是构建用户界面的js库
2011 年 由Facebook 工程师Jordan Walke创建
在 2013 开源





React 的优势



原生js的痛点

  1. 原生的Javascript 操作DOM繁琐,效率低(DOM-API 操作UI)
  2. 使用Javascript 直接操作DOM, 样式数据改变时, 浏览器会进行大量重绘重排
  3. 原生Javascript 没有组件化编码方案, 代码复用率低。



React的优点

  1. 采用组件化模式, 声明式编码, 提高开发效率以及组件复用率。
    命令式编码: 必须告诉程序做一件事情的每个步骤.
    声明式编码: 告诉程序做1个件事, 不需要关心步骤, 如何实现.

  2. 在React Native 中可以使用React语法进行移动端(android / ios)开发.

  3. 使用虚拟DOM 和 优秀的 diffing(比较出不同的地方)算法, 尽量减少于真实DOM 的交互.
    这个是React的核心优势





什么是虚拟DOM 和其优势

先看下面原生html ES6 js 的例子

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div id="graphics_card"></div><script>let cardList = [{card: 'RTX4090', comment: '旗舰,烧接口'},{card: 'RTX4080', comment: '加价,智商检测卡'},{card: '7900XTX', comment: '铺货弱,AMD YES!'}]let cardHtml = "";cardList.forEach(card=>{cardHtml += `<li>${card.card} - ${card.comment}</li>`  // ` but not ''});document.getElementById('graphics_card').innerHTML = cardHtml</script></body>
</html>

逻辑很简单, 无非就是展示三行关于显卡的数据.
但是如果当数据发生变化时, 基于下面这行代码, 浏览起就会对这个DOM重绘

document.getElementById('graphics_card').innerHTML = cardHtml

而这种DOM重绘时是不会重用旧有DOM的,当数据量大时, 例如在页面中展示1000条数据, 当增加1条数据到1001时, 旧有的1000数据的dom还是会被重绘, 效率就不高了。
在这里插入图片描述




而React 会引入一种虚拟DOM(VDOM)的东西, 在代码和 页面真实 DOM中构建了1个中间层
当数据首次被页面展示, 因为中间VDOM层的存在, 效率肯定时比原生更低的
但是当网页数据发生变化时, React会生成新的VDOM 然后与 内存中的旧VDOM比较, 然后只会更新被更改or新增的真实DOM。 这就是差异了
在这里插入图片描述





React怎样构建VDOM, Hello word 例子

react的依赖

npm list
reactprj1@1.0.0 /home/gateman/Projects/jsproject/reactprj1
├── babel-standalone@6.26.0
├── react-dom@15.7.0
└── react@15.7.0

例子:

<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head><body><div id="test"></div>  <!-- define a container --><script src="../node_modules/react/dist/react.min.js"></script><script src="../node_modules/react-dom/dist/react-dom.min.js"></script><script src="../node_modules/babel-standalone/babel.min.js"></script><script type="text/babel">//create virtual dom , single quotes is not needconst VDOM = <h1> Hello, React</h1>  //appy virtual dom to pageReactDOM.render(VDOM, document.getElementById("test"))  //first parameter is virtual dom, second parameter is container (div)</script>
</body>
</html>

很简单, 无非构建1个VDOM对象, 然后利用ReactDOM.reader()方法去渲染这VDOM对象。映射成真实DOM对象

在例子中,
我们引用了babel 这个依赖, 注意script的类型时text/babel 而不再是默认的text/javascript
这就是所谓的jsx

例如下面这句, 在js中肯定是有语法错误的, 因为我们没有使用双引号。

 const VDOM = <h1> Hello, React1 </h1>  

所以我们在React中更多的是在写jsx 而 不是原生js, 当然浏览器是不认识js的, 所以我们需要babel和依赖去翻译jsx
当运行时
我们会在浏览器见到这warning
在这里插入图片描述
意思babel是在运行时翻译jsx的, 并不建议在生产环境中使用这种翻译模式, 因为更耗性能, 在生产环境中应该像用webpack那样先把jsx 翻译好再部署





为什么要使用jsx 而不是js

Jsx 就是用于构造VDOM的语法.
其实React 本身已经提供了创造VDOM的方法,

const VDOM = React.createElement('h1', {id: "title"}, "Hello, React")

第一参数时VDOM的类型, 第二个参数是 标签属性(组), 第三个是内容
等效于jsx的

 const VDOM = <h1 id="title"> Hello, React1 </h1>  

貌似差不多,

但是当我们构建1个复杂的嵌套VDOM是时

jsx可以很简单地实现

 const VDOM = (<h1 id="title"><span id="subtitle"> Hello, React</span></h1>)  

而原生js要写成函数嵌套,

const VDOM = React.createElement('h1', {id: "title"}, React.createElement('span', {id:"subtitle"}, "Hello, React"))

明显jsx方式更优雅, 可读性更好,在构建VDOM更像在写html

当然babel实际上会把jsx的方式翻译成原生js的方式, 所以预翻译就很重要了.





VDOM 在内存里究竟是个什么东西

很简单, 我们只需要再代码中print一下

 ReactDOM.render(VDOM, document.getElementById("test")) ;console.log('VDOM is:'. VDOM);console.log(typeof VDOM);console.log(VDOM instanceof Object);debugger; //add a breakpoint stop here

在这里插入图片描述
可见它无非就是js的一般对象


http://www.ppmy.cn/news/3315.html

相关文章

10.9.1-Dataway+Echarts动态图表方案

文章目录1. 技术选型2. 实现方案2.1. 方案介绍2.2. 方案实现&#xff08;demo&#xff09;2.2.1. 使用echarts绘制html静态页2.2.1.1. 选择合适的图表2.2.1.2. 下载html demo2.2.2. 使用Dataway准备数据接口2.2.2.1. 部署dataway2.2.2.2. 创建数据接口2.2.3. 调试html demo da…

LeetCode刷题日记之链表II

1.四数相加II 题目描述 解题思路 1.定义一个哈希Map,其中key存放两数之和&#xff0c;value存放两数和出现的次数。 2.遍历统计出nums1和nums元数相加和出现的次数(ab)。 3.遍历nums3和nums4&#xff0c;并求和(cd),统计出(0-(cd))在Map中出现的次数。 4.返回&#xff08;0-(…

Opencv项目实战:17 贪吃蛇游戏

目录 0、项目介绍 1、效果展示 2、项目搭建 3、项目代码展示与讲解 4、项目资源 5、项目总结 0、项目介绍 这次是一个有意思的计算机视觉游戏——贪吃蛇&#xff0c;我们以食指为蛇头&#xff0c;不断的移动我们的手指&#xff0c;当吃到甜甜圈的时候&#xff0c;蛇身增…

Mongodb数据库的安装部署及基本使用

Mongodb数据库的安装部署及基本使用一、Mongodb数据库介绍1.Mongodb简介2.Mongodb适用场景3.MongoDB特性二、检查本地系统环境1.检查系统版本2.检查yum仓库三、Mongodb的安装1.配置Mongodb的yum源2.安装Mongodb3.修改绑定IP4.启动Mongodb服务四、检查Mongodb状态1.查看Mongodb服…

Python中ArcPy基于矢量范围批量裁剪大量栅格遥感影像

本文介绍基于Python中ArcPy模块&#xff0c;基于矢量数据范围&#xff0c;对大量栅格遥感影像加以批量裁剪掩膜的方法。 本文所需要的代码如下所示。 # -*- coding: utf-8 -*- """ Created on Tue Dec 13 20:07:48 2022author: fkxxgis """impo…

IT Resilience vs. Disaster Recovery 谈谈对弹性与灾备的理解

背景 在大型企业中&#xff0c;可能会花很多时间考虑灾难恢复以及如何避免灾难恢复。毕竟&#xff0c;这是一场噩梦——一场自然灾难或人为破坏的灾难&#xff0c;会摧毁你的IT基础设施&#xff0c;让企业团队陷入困境。 灾难恢复&#xff08;DR&#xff09;和IT Resilience …

Spring Boot使用EasyExcel导入导出Excel

一、导入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.6</version></dependency> 二、实现导出excel操作 1、对我们需要导出的实体类上加上注解&#xff0c;如下&#…

一个关于React数据不可变的无聊问题

对于一个React的开发者来说不知道你有没有想过为什么React追求数据不可变这个范式&#xff1b; 一个月前我想过一个问题如果我在使用useState这个hooks的时候传入的是一个改变后的引用类型对象会发生什么&#xff1f; 例如&#xff1a; import {useState} from "react&…