vue码源学习记录

  1. 数据驱动视图 UI=render(state)
  2. object通过js的object.defineProperty方法侦测数据变化
    • object类型把每一个属性转换成getter/setter的形式侦测数据变化(getter收集依赖,setter通知依赖更新);
    • 只能观测到object数据的取值与设置值,再往object添加或删除值时无法更新视图;
    • 可通过Vue.setVue.delete达到更新视图的目的;
  3. Array数组变化侦测是通过拦截器实现(push,pop,shift,unshift,splice,sort,reverse
  4. 虚拟DOM:用一个js对象来描述一个 DOM节点。用js的计算性能换取操作dom所消耗的性能,用js模拟出一个虚拟dom节点,通过DOM-Diff算法计算出需要更新的地方,然后去更新需要更新的视图。
<div class="a" id="b">我是内容</div>

{
  tag:'div',        // 元素标签
  attrs:{           // 属性
    class:'a',
    id:'b'
  },
  text:'我是内容',  // 文本内容
  children:[]       // 子元素
}
  1. VNode类在虚拟DOM的作用:渲染视图前,把写好的template模板先编译成VNode并缓存下来,当有页面数据发生变化需要重新渲染时,则对比数据发生变化前后的VNode进行对比。找出差异(DOM-Diff算法),有差异的VNode对应真实DOM节点就是需要重新渲染的节点,最后根据有差异的VNode创建出真实的DOM节点再插回视图中,完成一次视图更新。
    从而达到尽可能少的操作真实DOM的目的,以节省性能。

  2. DOM-Diff的过程称为patch(补丁)过程。过程所做的事:

  • 创建节点:新的VNode中有而旧的oldVNode中没有,就在旧的oldVNode中创建。
  • 删除节点:新的VNode中没有而旧的oldVNode中有,就从旧的oldVNode中删除。
  • 更新节点:新的VNode和旧的oldVNode中都有,就以新的VNode为准,更新旧的oldVNode
  1. 与数据相关的实例方法
  • vm.$watch(expOrFn, callback, [options]):观察vue实例变化的一个表达式或计算属性性函数。
  • vm.$set():向响应式对象中添加一个属性。
  • vm.$delete():删除对象的属性。
  1. 全局api
  • Vue.extend( options ):使用基础Vue构造器,创建一个‘子类’,接收对象参数。
  • Vue.nextTick( [callback, context] ):在DOM更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后DOM。在created()钩子操作DOM需在vue.nextTick中使用。
  • Vue.set(target, property/index, value):向响应式对象中添加一个属性,并确保这个新属性是响应式的,且触发视图更新。
  • Vue.delete(target, propertyName/index):删除对象属性。
  • Vue.directive(id, [definition]):注册或获取全局指令。
  • Vue.filter(id, [definition]):注册或获取全局过滤器。
  • Vue.component(id, [definition]):注册或获取全局组件。
  • Vue.use(plugin):安装插件。在new Vue()之前使用。
  • Vue.mixnin(mixin):注册一个混入,影响注册之后所有创建的每个Vue实例。
  • Vue.compile(compile):在render函数中编译模板字符串。只在独立构建时有效。
  • Vue.observable(object):让一个对象可响应。Vue内部会用它来处理data函数返回对象(小型vuex)。
  • Vue.version:版本号
  1. 过滤器filters(vue3已废弃):本质是js函数。用法可串联、可传参{{ text | filterA | filterB(val1, val2) }}

  2. 自定义指令:合适的时机执行定义指令时所设置的钩子函数。

  3. 内置组件<keep-alive>:抽象组件,不会渲染元素,包裹组件时会缓存不活动的组件实例,而不是销毁。可以保留组件的状态或避免多次重新渲染,以提高页面性能。
    <keep-alive>缓存后,再次渲染时不会执行createdmounted等钩子函数,会调用activateddeactivated
    可接收三个属性:

  • include:字符串或正则表达式。只缓存名称匹配上的组件;
  • exclude :字符串或正则表达式。名称匹配上的组件都不缓存;
  • max :数字。最多可以缓存多少组件实例。
// 逗号分隔字符串
<keep-alive include="a,b">
    <component is="view"></component>
</keep-alive>

// 正则表达式 用v-bind
<keep-alive :include="/a|b/">
    <component is="view"></component>
</keep-alive>

// 数组 用v-bind
<keep-alive :include="['a', 'b']">
    <component is="view"></component>
</keep-alive>

缓存淘汰策略LRU:算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容