vue源码学习——数据驱动

vue的核心思想?

数据驱动

什么是数据驱动?

数据驱动指的是视图是由数据驱动生成,我们对视图的修改不会直接操作DOM,而是修改数据。

模版和数据怎么渲染成DOM的呢?

1. new Vue发生了什么

Vue实际是一个类,只能通过new关键字初始化(在JavaScript中类是通过function实现的)
在这里插入图片描述
可以看到,new Vue会调用_init()方法,并且将参数options传给这个方法。
在这里插入图片描述
合并参数,把参数options赋值给vue实例的$options
在这里插入图片描述
在初始化的最后,检测到如果有el属性,则调用vm.$mount方法挂载vm(vue实例),挂载的目的就是把模版渲染成DOM。

2. new Vue主要执行一些初始化的操作,Vue初始化主要干了几件事?

合并参数、初始化生命周期、初始化事件、初始化渲染、初始化data、props、computed、watcher等
在这里插入图片描述

3. 为什么在data中定义数据message可以直接通过this.message访问到?

在初始化中有initState(vm)初始化状态,找到initState方法
在这里插入图片描述
initState方法主要是实现props,methods,data,watch,computed的初始化
如果data存在,会初始化data,看看初始化data的方法initData(vm)
在这里插入图片描述

初始化data做了哪些事?

  1. 先从vue实例vm的$options中取到data

let data = vm.$options.data

  1. 将data赋值给vm._data,
    判断data是不是一个function,如果是函数就调用getData方法,将data()返回的值赋值给data变量,如果不是function就不处理data

  2. 判断最终的data是不是一个对象,如果不是对象就作出警告——data必须是一个对象

  3. 获取data中的key,和props进行对比(就是说如果我在props中定义了一个id,就不能在data中定义id),不能重复的原因是因为不管是data还是props他们的属性最终都会挂载到vue实例上,通过this.id可以访问到

  4. 最终会执行

在这里插入图片描述
在这里插入图片描述
![
首先理解Object.defineProperty()用法
Object.defineProperty()的作用就是直接在一个对象上定义一个新属性,或者修改一个已经存在的属性
Object.defineProperty(obj, prop, desc)
这个方法接受3个参数:

  1. obj需要定义属性的当前对象(在这里就是传入的vue实例对象vm)
  2. prop需要定义或修改的属性名,(这里就是传入的props或者data的key)
  3. desc 属性描述符 是一个对象更(这里指的是sharePropertyDefinition对象)

在这里定义了描述对象的属性描述符:
enumerable: true(可枚举,就是是否出现在for…in或Object.keys中) configurable:true(是否配置,能否删除)
在这里插入图片描述
sourceKey是传入的参数_data或者_prop字符串
在这里插入图片描述
在这里插入图片描述
上面的target是传入的vue实例对象,通过set和get的方法写入或读取数据,
从上面可以看出访问data上的id通过this.id实际上是访问了this._data.idthis._props.id

4. Vue实例挂载的实现

以下是Runtime+compiler版本的$mount方法实现

$mount方法
这个方法在platform目录下的多个目录下文件中都有定义,因为这个方法的实现是和平台和构建方式都相关的。
在这里插入图片描述
在这里插入图片描述

  1. 首先缓存了Vue原型上的$mount方法,然后再重新定义该方法
    为什么是重新定义呢?
    在这里插入图片描述

因为在runtime/index.js中已经定义了$mount的方法,需要重新定义是因为Runtime Only版本没有$mount方法中的逻辑

  1. Runtime Only版本的$mount方法
    在这里插入图片描述
    这里的query方法就是一个原生JavaScript API获取DOM的方法
  2. Runtime Compiler版本的$mount方法
    在这里插入图片描述
    首先将el转换为DOM对象,然后对el做了限制,Vue不能挂载在body、html这样的根节点上
    在这里插入图片描述
    然后判断开发人员有没有定义render方法,判断有没有写template
    在这里插入图片描述
    如果template存在,再判断template的类型,重新赋值template,判断最后的template,编译生成render函数
    说到底就是看有没有render函数,因为vue最终只认render函数,如果有render函数就直接调用render函数,如果没有就将模版编译生成render函数
    最后
    在这里插入图片描述
    最后调用调用缓存的mount方法(即走到了runtime/index.js里面)
    在这里插入图片描述

最后执行mountComponent方法,这个方法做的事:如果没有写render函数,首先会将vm.$options.render赋值成一个空Node对象

vm.$options.render=createEmptyNode, 然后会尝试错误提示,就是如果你使用的是Runtime Only版本却没有写render函数却写了template警告,或者即没有写render函数又没有写template警告。

5. render方法做了哪些事情

Vue的_render方法是实例的一个私有方法,用来把实例渲染成一个虚拟Node(_render方法定义在src/core/instance/render.js中)

我们平时在开发过程中手写render函数的场景比较少,写得比较多的是template模版,template模版会被编译成render方法。

render函数的第一个参数是createElement(createElement是一个函数vm.$createElement
vm.$createElement
在这里插入图片描述

createElement方法是在src/core/vdom/create-element下定义的
在执行initRender方法时候会调用createElement方法
可以看到除了又一个vm.$createElement方法外还定义了vm._c方法,那这两个方法有什么区别,他们内部都调用了createElement方法,只是最后一个参数传得不同:

  1. vm._c方法是模版被编译成render方法时调用的
  2. vm.$createElement方法是用户手写render函数时候调用的

总的来说:render方法最终是通过执行createElement方法并返回虚拟VNode(虚拟Node)

6. Virtual DOM(虚拟DOM)

技术选型 【后端】:Java 【框架】:springboot 【前端】:vue 【JDK版本】:JDK1.8 【服务器】:tomcat7+ 【数据库】:mysql 5.7+ 项目包含前后台完整源码。 项目都经过严格调试,确保可以运行! 具体项目介绍可查看博主文章或私聊获取 助力学习实践,提升编程技能,快来获取这份宝贵的资源吧! 在当今快速发展的信息技术领域,技术选型是决定一个项目成功与否的重要因素之一。基于以下的技术栈,我们为您带来了一份完善且经过实践验证的项目资源,让您在学习和提升编程技能的道路上事半功倍。以下是该项目的技术选型和其组件的详细介绍。 在后端技术方面,我们选择了Java作为编程语言。Java以其稳健性、跨平台性和丰富的库支持,在企业级应用处于领导地位。项目采用了流行的Spring Boot框架,这个框架以简化Java企业级开发而闻名。Spring Boot提供了简洁的配置方式、内置的嵌入式服务器支持以及强大的生态系统,使开发者能够更高效地构建和部署应用。 前端技术方面,我们使用了Vue.js,这是一个用于构建用户界面的渐进式JavaScript框架。Vue以其易上手、灵活和性能出色而受到开发者的青睐,它的组件化开发思想也有助于提高代码的复用性和可维护性。 项目的编译和运行环境选择了JDK 1.8。尽管Java已经推出了更新的版本,但JDK 1.8依旧是一种成熟且稳定的选择,广泛应用于各类项目,确保了兼容性和稳定性。 在服务器方面,本项目部署在Tomcat 7+之上。Tomcat是Apache软件基金会下的一个开源Servlet容器,也是应用最为广泛的Java Web服务器之一。其稳定性和可靠的性能表现为Java Web应用提供了坚实的支持。 数据库方面,我们采用了MySQL 5.7+。MySQL是一种高效、可靠且使用广泛的关系型数据库管理系统,5.7版本在性能和功能上都有显著的提升。 值得一提的是,该项目包含了前后台的完整源码,并经过严格调试,确保可以顺利运行。通过项目的学习和实践,您将能更好地掌握从后端到前端的完整开发流程,提升自己的编程技能。欢迎参考博主的详细文章或私信获取更多信息,利用这一宝贵资源来推进您的技术成长之路!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值