Vue源码解析

Vue中的key的作用和工作原理?

源码位置: src/core/vdom/patch.js  -updateChildren()

作用: Key的主要作用是高效的更新虚拟dom,源码中在patch的过程中,会执行patchVnode,patchVode过程中会执行updateChildren方法,会更新两个新旧的子元素,通过key可以准确的判断这两个节点是不是同一个,从而避免了频繁更新不同元素,使得整个patch过程中更加高效,减少dom操作。
如果没有设置key,默认key值就是undefined,并且会判断key值是否相等,因为undefined==undefined 返回true,因此会判断两个节点的标签是否相同,所以没有key值,会循环更新dom,消耗性能

Vue中v-for和v-if谁的优先级高?

源码位置:/src/complier/codegen/index.js

<body>
    <div id="app">
        <p>源码位置:/src/complier/codegen/index.js</p>
        <h1>v-for和v-if谁的优先级高?如何正确使用避免性能问题?</h1>
        <!-- 第一种同级情况 -->
        <p v-for="item in children" v-if="isFolder">{{item.title}}</p>

        <!-- 不同级的情况 -->
        <!-- <template v-if="isFolder">
            <p v-for="item in children">{{item.title}}</p>
        </template> -->
    </div>
</body>
<script src="node_modules/vue/dist/vue.js"></script>
<script>
    const app = new Vue({
        el: "#app",
        data: {
            children: [
                { title: 'foo' },
                { title: 'bar' }
            ]
        },
        computed: {
            isFolder() {
                return this.children && this.children.length > 0
            }
        },
    })
    console.log(app.$options.render)
</script>

结论:
1、v-for优先于v-if被解析,源码中的执行顺序 v-for是优先执行
2、如果同级,同时出现,每次渲染都会先执行循环,再判断条件,不管条件是否成立都会执行一次循环,浪费性能
3、避免这种情况出现,则需要在外面嵌套一层template 进行条件判断,内部进行v-for循环

Vue中的data为什么必须是个函数,而根实例没有这个限制?

源码中,数据初始化的时候会校验data的类型
结论: Vue组件可能存在多个实例,如果data使用对象形式定义,会导致共用一个data对象,那么状态变更会影响所有组件实例,
采用函数式定义,在initData时会将其作为工厂函数返回全新的对象,有效规避多个实例之间状态污染的问题。
而vue根实例在全局中只能有一个,不需要使用函数定义

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue.js源码全方位深入解析最新下载地址.rar Vue.js源码全方位深入,帮你更深入了解vue 第1章 准备工作 介绍了 Flow、Vue.js源码目录设计、Vue.js源码构建方式,以及从入口开始分析了 Vue.js 的初始化过程。 第2章 数据驱动 详细讲解了模板数据到 DOM 渲染的过程,从 new Vue 开始,分析了 mount、render、update、patch 等流程。 第3章 组件化 分析了组件化的实现原理,并且分析了组件周边的原理实现,包括合并配置、生命周期、组件注册、异步组件。 第4章 深入响应式原理(上) 详细讲解了数据的变化如何驱动视图的变化,分析了响应式对象的创建,依赖收 集、派发更新的实现过程,一些特殊情况的处理,并对比了计算属性和侦听属性的实现,最后分析了组件更新的过程。 第5章 深入响应式原理(下) 详细讲解了数据的变化如何驱动视图的变化,分析了响应式对象的创建,依赖收集、派发更新的实现过程,一些特殊情况的处理,并对比了计算属性和侦听属性的实现,最后分析了组件更新的过程。 第6章 -编译(上) 从编译的入口函数开始,分析了编译的三个核心流程的实现:parse -> optimize -> codegen。 第7章 -编译(下) 从编译的入口函数开始,分析了编译的三个核心流程的实现:parse -> optimize -> codegen。 第8章 -扩展(上) 详细讲解了 event、v-model、slot、keep-alive、transition、transition-group 等常用功能的原理实现,该章节作为一个可扩展章节,未来会分析更多 Vue 提供的特性。 第9章 -扩展(中) 详细讲解了 event、v-model、slot、keep-alive、transition、transition-group 等常用功能的原理实现,该章节作为一个可扩展章节,未来会分析更多 Vue 提供的特性。 第10章 -扩展(下) 详细讲解了 event、v-model、slot、keep-alive、transition、transition-group 等常用功能的原理实现,该章节作为一个可扩展章节,未来会分析更多 Vue 提供的特性。 第11章 Vue-Router 分析了 Vue-Router 的实现原理,从路由注册开始,分析了路由对象、matcher,并深入分析了整个路径切换的实现过程和细节。 第12章 Vuex 分析了 Vuex 的实现原理,深入分析了它的初始化过程,常用 API 以及插件部分的实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值