为啥叫全家桶
由于本次学习中并非只学习react
,在学习过程中还会提及到一些在用react
做应用开发过程正还会用到的其他的库。这些内容呢合并在一起被称之为react
全家桶。react
全家桶中包含有以下内容:
react
基础知识react-router
用于做路由的库PubSub
用于做消息管理的库react-redux
用于做集中式状态管理的库Ant-Design
所谓的精美的UI
组件库
至于这些库虽然说我都已经听说了,但是我却并不知道他们具体是啥,干啥的,怎么用。这些在后续学习中慢慢来了解。
react
是什么
当我们刚接触到一个之前从未接触过的东西时,我们的第一反应就是这个玩意儿到底是个啥啊?
根据官网给的解释说react
是一个用于构建用户界面的JavaScript
库。但是这一句话显得有些苍白无力。但是我们也是粗略的知道了这是一个JavaScript
库。但是我们要注意到这句话中的关键词: 界面
。因为react
只关注界面。或者说 视图
。
至于这个东西这么理解呢,举个小例子吧。
比如说在页面上要展示一些学生的信息。用原生的JavaScript
或者jQuery
来处理的话大概分为以下三步:
- 发送请求获取数据
- 把得到的数据做相关的数据清洗
- 使用
JavaScript
或者jQuery
操作DOM
呈现页面
但是如果使用了react
的话,react
不关心前两步操作的,react
的侧重点完全在第三步。也就是说react
会代替JavaScript
或者jQuery
来帮助我们来操作DOM
来操作页面。也就意味着我们用react
就不用亲自操作DOM
了,但是前两步还是依然需要我们自己来做,而react
并没有给我们提供任何有用的帮助。
那么通过上述所说的内容我们回过头再看官网所给的定义,我们来扩展一下,也就是说:react
是一个将我们处理好的数据渲染成HTML
视图的这么样一个开源的JavaScript
库。通俗一点来说呢就是,你提供数据给react
,那么react
就帮你渲染成HTML
视图。
react
的特点
-
组件化模式,声明式编码,提高开发效率及组件复用率
-
介绍一下命令式编码:
- 之前原生
JavaScript
或者jQuery
都是命令式编码
命令式编码是通过一系列命令来执行命令内容从而完成相应操作
例如某人说自己渴了,请另外一个人向左走
5
步,然后右转再走7
步,然后倒水,再往回走7
步,然后左转再走5
步,把水递给口渴的人。这个示例就是所谓的命令式编码
- 之前原生
-
介绍一下声明式编码。
react
是声明式编码
react
的声明式编码是通过声明某个对象的属性,然后react
来完成相应的操作例如某个人声明自己渴了,另外一个人自动去倒水然后递给口渴的人
这个示例就是所谓的声明式编码
-
-
命令式编码
和声明式编码
的区别就好比面向过程
与面向对象
的区别 -
react navtive
中可以使用react
语法进行移动端开发react native
是一项可以使用前端技术来完成跨平台移动端开发的一项技术Android
是使用Java
语言进行开发IOS
是使用Object C
或者Swift
进行开发- 而使用
react native
可以让前端开发人员直接使用react
来进行Android
和IOS
端的开发
-
使用虚拟
DOM
+Diffing
算法,尽量减少与真实DOM
的交互-
什么是虚拟
DOM
呢,就是字面上理解的意思。- 原生
JavaScript
或者jQuery
操作的都是浏览器真实DOM
- 而虚拟
DOM
就是react runtime
在内存中操作的仅供react
来使用的所谓的一种DOM
- 虚拟
DOM
仅存储在内存中,由react
根据具体场景映射成真实DOM
- 原生
-
至于
Diffing
算法,举个例子
-
<!-- 存放人员列表的容器 --> <ul id="list"></ul> <script type="text/javascript"> // 一些数据 let personArr = [ {id: "001", name: "name1", age: 18}, {id: "002", name: "name2", age: 19} ]; // 定义人员列表的 html 字符串 let htmlStr = ""; // 用数据生成人员列表 personArr.forEach((person) => { htmlStr += `<li>{person.name}-{person.age}</li>` }); // 操作 DOM 呈现界面 document.getElementById("list").innerHTML = htmlStr </script>
test1.html
最终展现出来的效果是:
我们从代码中可以看出原生
JavaScript
是直接操作真实DOM
遍历在页面上生成了两个真实DOM
如果我们的数据量很大,而且数据发生了变动。比如原来页面上有
99
条数据,现在数据更新了,新增了1
条数据变成了100
条数据。那么整个页面又要重新遍历数据数组,之前的两条重复的数据完全没有被复用。由此可见这种写法,页面上的真实
DOM
数量与数据量挂钩,数据量越大,真实DOM
数越多
而react
会使用虚拟DOM
不直接操作真实DOM
。
数据还是那些数据,但是
react
每条数据都会对应一个虚拟DOM
。然后react
会根据虚拟DOM
来映射成真实DOM
。乍一看仿佛和原生没有什么区别。但如果还是像刚才一样,数据更新了,
99
条数据要新增1
条数据,变成100
条,其他不变。这样的话react
会在内存中重新生成100
个虚拟DOM
。但是在映射到真实
DOM
之前,react
会拿这100
个虚拟DOM
,和之前生成的虚拟DOM
进行比较,因为之前生成的虚拟DOM
都存储在内存中并没有被丢弃,所以react
会在内存中将前后两次生成的虚拟DOM
进行差异性比对。比对之后,如果两次拥有一部分相同的虚拟
DOM
的话react
会直接复用页面上现存的这些虚拟DOM
对应的真实DOM
,仅将有差异的虚拟DOM
映射成真实DOM
,这样就大幅度提高了复用率。
所以react
的Diffing
算法,就好像是git
一样,仅仅只更新有修改的部分
学react
需要的JavaScript
知识
- 判断
this
的指向 class
类ES6
语法npm
包管理器- 原型、原型链
- 数组常用方法
- 模块化
Copyright statement:The articles of this site are all original if there is no special explanation, indicate the source please when you reprint.
Link of this article:https://work.lynchow.com/article/react_introduce/