React 和 Vue 应该是国内当下最⽕热的前端框架,当然 Angular 也是⼀个不错的框架,但是这个产品国内使⽤的⼈很少再加上对Angular 也不怎么熟悉,所以框架的章节中不会涉及到 Angular 的 将会来学习以下⼏个内容
MVVM 接下来先说下 View 和 Model:
基本上,我们写的产品就是通过接⼝从数据库中读取数据,然后将数据经过处理展现到⽤户看到的视图上。当然我们还可以从视图上读取⽤户的输⼊,然后⼜将⽤户的输⼊通过接⼝写⼊到数据库中。但是,如何将数据展示到视图上,然后⼜如何将⽤户的输⼊写⼊到数据中,不同的⼈就产⽣了不同的看法,从此出现了很多种架构设计。 在 MVVM 架构中,引⼊了 ViewModel 的概念。ViewModel 只关⼼数据和业务的处理,不关⼼ View 如何处理数据,在这种情况下,View 和 Model 都可以独⽴出来,任何⼀⽅改变了也不⼀定需要改变另⼀⽅,并且可以将⼀些可复⽤的逻辑放在⼀个 ViewModel 中,让多个 View 复⽤这个 ViewModel。 同样以 Vue 框架来举例,这个隐式的 Binder 层就是 Vue 通过解析模板中的插值和指令从⽽实现 View 与 ViewModel 的绑定。 对于 MVVM 来说,其实最重要的并不是通过双向绑定或者其他的⽅式将 View 与 ViewModel 绑定起来,⽽是通过 ViewModel 将视图中的状态和⽤户的⾏为分离出⼀个抽象,这才是 MVVM 的精髓。 Virtual DOM涉及⾯试题:什么是 Virtual DOM?为什么 Virtual DOM ⽐原⽣ DOM 快? 那么既然 DOM 可以通过 JS 对象来模拟,反之也可以通过 JS 对象来渲染出对应的 DOM。当然了,通过 JS 来模拟 DOM 并且渲染对应的 DOM 只是第⼀步,难点在于如何判断新旧两个 JS 对象的最⼩差异并且实现局部更新 DOM。 ⾸先 DOM 是⼀个多叉树的结构,如果需要完整的对⽐两颗树的差异,那么需要的时间复杂度会是 O(n ^ 3),这个复杂度肯定是不能接受的。于是 React 团队优化了算法,实现了 O(n) 的复杂度来对⽐差异。实现 O(n) 复杂度的关键就是只对⽐同层的节点,⽽不是跨层对⽐,这也是考虑到在实际业务中很少会去跨层的移动 DOM 元素。 所以判断差异的算法就分为了两步 ⾸先从上⾄下,从左往右遍历对象,也就是树的深度遍历,这⼀步中会给每个节点添加索引,便于最后渲染差异⼀旦节点有⼦元素,就去判断⼦元素是否有不同在第⼀步算法中我们需要判断新旧节点的 tagName 是否相同,如果不相同的话就代表节点被替换了。如果没有更改 tagName 的话,就需要判断是否有⼦元素,有的话就进⾏第⼆步算法。在第⼆步算法中,我们需要判断原本的列表中是否有节点被移除,在新的列表中需要判断是否有新的节点加⼊,还需要判断节点是否有移动。 从上述例⼦中,我们⼀眼就可以看出先前的 ul 中的第三个 li 被移除了,四五替换了位置。 那么在实际的算法中,我们如何去识别改动的是哪个节点呢?这就引⼊了 key 这个属性,想必⼤家在 Vue 或者 React 的列表中都⽤过这个属性。这个属性是⽤来给每⼀个节点打标志的,⽤于判断是否是同⼀个节点。当然在判断以上差异的过程中,我们还需要判断节点的属性是否有变化等等。 当我们判断出以上的差异后,就可以把这些差异记录下来。当对⽐完两棵树以后,就可以通过差异去局部更新 DOM,实现性能的最优化。 当然了 Virtual DOM 提⾼性能是其中⼀个优势,其实最⼤的优势还是在于: 路由原理 路由就只有两种实现⽅式
www.test.com/#/ 就是 Hash URL,当 # 后⾯的哈希值发⽣变化 History 模式 两种模式对⽐ History 模式可以通过 API 添加任意类型的数据到历史记录中,Hash 模式只能更改哈希值,也就是字符串Hash 模式⽆需后端配置,并且兼容性好。History 模式在⽤户⼿动输⼊地址或者刷新⻚⾯的时候会发起 URL 请求,后端需要配置 index.html ⻚⾯⽤于匹配不到静态资源的时候 Vue 和 React 之间的区别 改变数据⽅式不同,Vue 修改状态相⽐来说要简单许多,React 需要使⽤ setState 来改变状态,并且使⽤这个 API 也有⼀些坑点。并且 Vue 的底层使⽤了依赖追踪,⻚⾯更新渲染已经是最优的了,但是 React 还是需要⽤户⼿动去优化这⽅⾯的问题。 React 16以后,有些钩⼦函数会执⾏多次,这是因为引⼊ Fiber 的原因,这在后续的章节中会讲到。 React 需要使⽤ JSX,有⼀定的上⼿成本,并且需要⼀整套的⼯具链⽀持,但是完全可以通过 JS 来控制⻚⾯,更加的灵活。Vue 使⽤了模板语法,相⽐于 JSX 来说没有那么灵活,但是完全可以脱离⼯具链,通过直接编写 render 函数就能在浏览器中运⾏。 在⽣态上来说,两者其实没多⼤的差距,当然 React 的⽤户是远远⾼于 Vue 的。 在上⼿成本上来说,Vue ⼀开始的定位就是尽可能的降低前端开发的⻔槛,然⽽ React 更多的是去改变⽤户去接受它的概念和思想,相较于 Vue 来说上⼿成本略⾼。 ⼩结 |
|
来自: 昵称36969213 > 《待分类》