关于Vue/React中核心的思想和性能优化以及使用场景

537 阅读5分钟

本文已参与[新人创作礼]活动,一起开启掘金创作之路。

Vue

一、Vue中响应式

1、Vue2.0通过遍历data中所有对象,通过Object.defineProperty添加getter/setter属性实现。此方法不具备监听数组的能力,并且无法检测到对象属性的添加和删除。

2、Vue3.0基于Proxy,自定义set和get实现,解决了2.0不能监听数组以及对象属性的问题,不需要要遍历所有对象,组件实例初始化的速度提高100%,节省vue2.0一半的内存开销

二、Vue模板转换成视图的过程。

Vue将模板编译成虚拟DOM渲染函数。结合Vue自带的响应系统,在状态改变时,Vue能够通过优化后的diff算法计算出重新渲染组件的最小代价并应到DOM操作上

三、Vue中的diff算法

Vue中运用了虚拟DOM来减少DOM操作,但原生的DIFF算法依旧不够效率,因为每个组件在创建时只会new一个wacher来监听,且diff算法本身时间复杂度过高,于是在Vue中对diff算法进行了优化,采用同层比较,深度优先,头头-尾尾-头尾-尾头对比,以及运用key的策略。

四、单向数据流的Vue

Vue中只运行父级向子级传值,子级向父级传值时需通过事件向父级提交,在父级中改变。

另外可通过provide/inject跨层级传值

五、Vuex

当我们遇到多个组件共享数据或方法时,采用Vuex

六、Vue采用MVVM模式

分离了View与model,使得开发人员分工明确,实现了双向数据绑定

七、Vue中的nextTick

当我们获取DOM更新的节点后,时常不能预期的获取结果,这是因为Vue中的DOM更新是异步的。此时该运用同样是异步队列中进行的nextTick,nextTick会优先在微任务队列中执行,当遇到不支持的情况时(不支持ES6的浏览器),会进行降级处理运用setTimeout代替。

Vue中的性能优化

  1. v-for不与v-if同层使用,因为v-for的优先级大于v-if
  2. 使用 keep-alive缓存组件,避免组件反复的创建与销毁
  3. 设置key,提高对比新旧dom树中节点时的效率
  4. 使用v-if时默认不显示
  5. 切换频率高时用,用v-show代替v-if ;切换频率低时,用v-if代替v-show
  6. 无需自动响应的数据不放入data中。因为在data中的数据都会被监听,浪费内存。

使用Vue的场景

1.希望用模板搭建应用。因为Vue.js 使用了基于 HTML 的模板语法

2.希望搭建快速的应用。Vue中是双向数据绑定的,无需手动改值。

3.希望应用运行速度快或是尽快能的小。渲染速度高于React,大小小于React

React

一.React中响应式原理

React框架在接收到用户状态改变通知后,会根据当前渲染树,结合最新的状态改变,通过Diff算法,计算出树中变化的部分,然后只更新变化的部分(DOM操作),从而避免整棵树重构,提高性能。

二.React采用JSX

React中采用JSX生成React元素,并将其传入 ReactDOM.render() 方法

  1. 使用JSX可以提高组件的可读性

  2. 保证了组件中的标签和所有业务逻辑的相互分离

三.React中的diff算法

React中同样对diff算法进行了优化,同样忽略了跨层级的比较,并判断不同类型组件间,不进行比较直接取代;相同类型组件比较可通过ShouldComponent()来判断减少不必要的操作,在多层级多个节点比较中,采取唯一标志key来判断,并在移动节点前判断新旧结点中的下标,避免不必要的操作

四.React中的HOOK

在React中函数组件无法运用state以及其他在类组件能使用的特性,HOOK的出现使得函数组件也能运用这些特性。

五.React中的redux

当组件状态需要多地共享,与服务器大量交互时需应用redux.

能够通过store在任意组件中发放数据,共享方法。

六.单向数据流的React

同样只允许父级向子级传值,子级通过调用父级传过来的方法,将值传到父级,在父级中更改值。

除这种传值方式外,类组件可通过context传值,函数组件中可以通过usecontext

七.采用了MVC模式

将模型和视图之间实现代码分离,并且减少了代码的重复性

React中的性能优化

  1. 定义ShouldComponent()中的条件判断避免重复渲染,因为这个函数本身默认返回true。
  2. 定义非数组下标的key值,因数组下标容易导致key值重复,且会在数组变化时更改。key值将在新旧dom中节点比较时运用。
  3. 能使用时,尽量使用无状态组件。因为无状态组件不需要声明类,不需要显示声明this关键字。
  4. 将函数作用域的绑定放在初始化construct()阶段,避免因渲染时的重复绑定

使用React的场景

  1. 构建大型项目时。因为React有更强的测试性,以及可维护性
  2. 同时构建Web端和App时。因为React Native与React.js大体相同。
  3. 创建一个更受欢迎的项目。React较于Vue在国际上使用更广泛。