当前位置:首页>正文

Vue和React区别 Vue 和 React 的使用场景和深度有何不同

2023-04-16 17:59:49 互联网 未知

Vue和React区别

Vue 通过 getter/setter 以及一些函数的劫持,能精确知道数据变化,不需要特别的优化就能达到很好的性能。React 默认是通过比较引用的方式进行的,如果不优化,可能导致大量不必要的VDOM的重新渲染。Vue 使用的是可变数据,而React更强调数据的不可变。Vue更加简单,而React构建大型应用的时候更加鲁棒。    

Vue 和 React 的使用场景和深度有何不同

首先,其实 Vue 也完全可以全量赋值的,唯一需要的小优化就是给 v-repeat 列表一个 track-by 属性,提示一下如何判断两个对象是否是同一份数据。如果是没有复杂交互的列表,可以直接 track-by="$index" 原地复用 DOM 元素。
合理使用 track-by 的情况下,Vue 甚至可以比 React 更快(这里渲染的是 100 * 5 的数据表,每一帧都是全量新数据赋值):
dbmon (Vue)
dbmon (react)
在超大量数据的首屏渲染速度上,React 有一定优势,因为 Vue 的渲染机制启动时候要做的工作比较多,而且 React 支持服务端渲染。
需要指出的一点:React 的 Virtual DOM 也不是不需要优化的。复杂的应用里你有两个选择 1. 手动添加 shouldComponentUpdate 来避免不需要的 vdom re-render;2. Components 尽可能都用 pureRenderMixin,然后采用 Flux 结构 Immutable.js。其实也不是那么简单的。相比之下,Vue 由于采用依赖追踪,默认就是优化状态:你动了多少数据,就触发多少更新,不多也不少。
说起 Flux 架构,FB 提供的标准实现非常繁琐,所以社区的各种造轮子版本层出不穷,目前其实还没有找到一个公认的最佳实践,而且大部分新 Flux 实现都引入了很多函数式概念,你如果对函数式编程不熟悉,光搞清楚那些概念就得花很久。
如果你真的理解了 Flux,你又会发现其实 Vue 也是可以应用 Flux 架构的。比如 optimizely/nuclear-js · GitHub 是一个 Flux 变种,他们就是同时把这个东西用在了 React 和 Vue 上面。
再谈谈开发风格的偏好:React 推荐的做法是 JSX inline style,也就是把 HTML 和 CSS 全都整进 JavaScript 了。Vue 的默认 API 是以简单易上手为目标,但是进阶之后推荐的是使用 webpack vue-loader 的单文件组件格式:
依然是熟悉的 HTML 和 CSS,但是可以放在一个文件里。而且你还可以使用你想要的预处理器,比如 LESS, Jade, Coffee, Babel,都可以。
然后扯一扯模板 vs. JSX 的问题。JSX 在逻辑表达能力上虽然完爆模板,但是很容易写出凌乱的 render 函数,不如模板看起来一目了然。当然这里也有个人偏好的问题。
React 的社区/组件生态比 Vue 大很多,这个是很显然的。不过说实话我很少见到现成的第三方组件完全符合我的要求。
最后,使用场景上来说:React 配合严格的 Flux 架构,适合超大规模多人协作的复杂项目。理论上 Vue 配合类似架构也可以胜任这样的用例,但缺少类似 Flux 这样的官方架构。小快灵的项目上,Vue 和 React 的选择更多是开发风格的偏好。对于需要对 DOM 进行很多自定义操作的项目,Vue 的灵活性优于 React。
---
更新:
楼下有些回答说 Vue 的核心是 MVVM 双向绑定,然后就直接跳跃到了『不适合持续工程迭代』的结论。且不说这样的跳跃太草率,这样的看法本身对于双向绑定的理解也是有偏差的。表单的双向绑定,说到底不过是 (value 的单向绑定 onChange 事件侦听)的一个语法糖,你如果不想用 v-model,像 React 那样处理也是完全可以的。另一方面,组件间的数据传递,Vue 默认是单向的,和 React 一样。
React 本身并不存在所谓的『单向数据流』,这完全是 Flux 引入的概念。其核心还是在于避免组件的 local state,强调把 state 抽取出来进行集中的管理。没有 Flux 的情况下 React 一样会有状态难以管理的问题,其根源在于在哪里存放和管理 state,和双向绑定没有本质联系。那难道 Vue 就不能这样管理状态吗?当然是可以的,Vue 现在可以通过 egoist/revue · GitHub 和 Redux 进行配合,也可以用 Vue 专属的状态管理架构 Vuex: vuejs/vuex · GitHub ,『单向数据流』并没有 React 吹的那么神,直接因为这一点就觉得 Vue 不适合工程迭代,完全站不住脚。