热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Vue源码分析(一)

一、初始化源码目录1.newVue()当我们newVue({el:#app,data:{}})时候,这是就要找到Vue的构造函数该文件的路径为src\core\

一、初始化

源码目录

1.new Vue()

当我们new Vue({el:'#app',data:{}}) 时候,这是就要找到Vue的构造函数
该文件的路径为src\core\instance\index.jsVue的构造函数 判断环境并且 立即调用this._init()方法,并把参数传入。
function Vue (options) {判断是否为生产环境并且 检查vue是否在this的prototype的原型上// if (process.env.NODE_ENV !== 'production' &&// !(this instanceof Vue)// ) {// warn('Vue is a constructor and should be called with the `new` keyword')// }this._init(options)
}
合并配置
initMixin(Vue)
定义$data,props,set,delete,watch,并且$data和$props是只读属性。
stateMixin(Vue)
初始化事件中心
eventsMixin(Vue)
初始化生命周期
lifecycleMixin(Vue)
初始化渲染函数
renderMixin(Vue)export default Vue

Vue就是一个Function实现的类,使用必须是new实例,然后调用this._init方法

构造函数下方执行了很多方法(***MIixin(Vue)),这些方法的作用就是给Vue的prototype上面添加一些方法,这些方法是按照功能去定义的,分别在多个模块去实现。

2.this._init()的过程


  • this._init(options) 该方法是在initMixin(Vue)里面实现的。
  • 路径 src\core\instance\init.js

Vue: Class 指定传入参数为class类export function initMixin (Vue: Class) {在Vue的原型上面添加_init()方法 负责vue的初始化过程。Vue.prototype._init = function (options?: Object) {获取vue的实例const vm: Component = this每个vue上面都有一个uid让vueuid自增保证vue的唯一性vm._uid = uid++vue实例不应该是一个响应式的,做个标记vm._isVue = true*****************************************************************************if (options && options._isComponent) {/*** 如果是子组件初始化时走这里,这里只做了一些性能优化* 将组件配置对象上的一些深层次属性放到 vm.$options 选项中,以提高代码的执行效率*/initInternalComponent(vm, options)} else {vm.$options = mergeOptions(resolveConstructorOptions(vm.constructor),options || {},vm)}/* istanbul ignore else */if (process.env.NODE_ENV !== 'production') {initProxy(vm)} else {vm._renderProxy = vm}// expose real selfvm._self = vm组件关系初始化initLifecycle(vm)初始化自定义事件initEvents(vm)初始化插槽initRender(vm)调用 beforeCreate 的生命周期callHook(vm, 'beforeCreate')provide和reject传值initInjections(vm) // resolve injections before data/props数据初始化 响应式原理的核心,处理 props methods computed data watch 等initState(vm)provide和reject传值initProvide(vm) // resolve provide after data/props调用 created 的生命周期callHook(vm, 'created')/* istanbul ignore if */// if (process.env.NODE_ENV !== 'production' && config.performance && mark) {// vm._name = formatComponentName(vm, false)// mark(endTag)// measure(`vue ${vm._name} init`, startTag, endTag)// }判断数据中有没有el,如果有,自动执行$mount没有的话,就要手动去挂载。if (vm.$options.el) {vm.$mount(vm.$options.el)}}
}

3.响应式原理initState(vm)


  • initState在import { initState } from './state'
  • 同级目录下找到state.js

export function initState (vm: Component) {vm._watchers = []const opts = vm.$options处理props对象 为每一个props对象上面设置响应式if (opts.props) initProps(vm, opts.props)处理methodsif (opts.methods) initMethods(vm, opts.methods)初始化data,if (opts.data) {initData(vm)} else {observe(vm._data = {}, true /* asRootData */)}处理conputedif (opts.computed) initComputed(vm, opts.computed)处理watchif (opts.watch && opts.watch !== nativeWatch) {initWatch(vm, opts.watch)}
}


推荐阅读
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文介绍了如何清除Eclipse中SVN用户的设置。首先需要查看使用的SVN接口,然后根据接口类型找到相应的目录并删除相关文件。最后使用SVN更新或提交来应用更改。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • PHP反射API的功能和用途详解
    本文详细介绍了PHP反射API的功能和用途,包括动态获取信息和调用对象方法的功能,以及自动加载插件、生成文档、扩充PHP语言等用途。通过反射API,可以获取类的元数据,创建类的实例,调用方法,传递参数,动态调用类的静态方法等。PHP反射API是一种内建的OOP技术扩展,通过使用Reflection、ReflectionClass和ReflectionMethod等类,可以帮助我们分析其他类、接口、方法、属性和扩展。 ... [详细]
  • Python已成为全球最受欢迎的编程语言之一,然而Python程序的安全运行存在一定的风险。本文介绍了Python程序安全运行需要满足的三个条件,即系统路径上的每个条目都处于安全的位置、"主脚本"所在的目录始终位于系统路径中、若python命令使用-c和-m选项,调用程序的目录也必须是安全的。同时,文章还提出了一些预防措施,如避免将下载文件夹作为当前工作目录、使用pip所在路径而不是直接使用python命令等。对于初学Python的读者来说,这些内容将有所帮助。 ... [详细]
  • 本文介绍了在Go语言中可见性与scope的规则,包括在函数内外声明的可见性、命名规范和命名风格,以及变量声明和短变量声明的语法。同时,还介绍了变量的生命周期,包括包级别变量和局部变量的生命周期,以及变量在堆和栈上分配的规则和逃逸分析的概念。 ... [详细]
  • 本文介绍了在Android Studio中使用命令行build gradle的方法,并解决了一些常见问题,包括手动配置gradle环境变量和解决External Native Build Issues的方法。同时提供了相关参考文章链接。 ... [详细]
  • 前段时间做一个项目,需求是对每个视频添加预览图,这个问题最终选择方案是:用canvas.toDataYRL();来做转换获取视频的一个截图,添加到页面中,达到自动添加预览图的目的。 ... [详细]
author-avatar
hengldkslf
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有