- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Vuejs源码的背后
下面的代码会在页面上输出Hello World,但是在这个?new Vue()?到页面渲染之间,到底发生了什么。这篇文章希望通过最简单的例子,去了解Vue源码过程。这里分析的源码版本是?Vue.version = 1.0.20div id=mountNode{{message}}/divvar vm = new Vue({ el: #mountNode, data: function () { return { message: Hello World }; }});这篇文章将要解决几个问题:new Vue()的过程中,内部到底有哪些步骤如何收集依赖如何计算表达式如何表达式的值如何反应在DOM上的简单来说过程是这样的:observe: 把{message: Hello World}变成是reactive的compile: compileTextNode {{message}},解析出指令(directive = v-text)和表达式(expression = message),创建fragment(new TextNode)准备替换link:实例化directive,将创建的fragment和directive链接起来,将fragment替换在DOM上bind: 通过directive对应的watcher获取依赖(message)的值(Hello World),v-text去update值到fragment上详细过程,接着往下看。构造函数文件路径:src/instance/vue.jsfunction Vue (options) { this._init(options)}初始化这里只拿对例子理解最关键的步骤分析。文件路径:src/instance/internal/init.jsVtotype._init = function (options) { ... // merge options. options = this.$options = mergeOptions( this.constructor.options, options, this ) ... // initialize data observation and scope inheritance. this._initState() ... // if `el` option is passed, start compilation. if (options.el) { this.$mount(options.el) }}merge optionsmergeOptions()?定义在src/util/options.js文件中,这里主要定义options中各种属性的合并(merge),例如:props, methods, computed, watch等。另外,这里还定义了每种属性merge的默认算法(strategy),这些strategy都可以配置的,参考?Custom Option Merge Strategy在本文的例子中,主要是data选项的merge,在merge之后,放到?$options.data?中,基本相当于下面这样:vm.$options.data = function mergedInstanceDataFn () { var parentVal = undefined // 这里就是在我们定义的options中的data var childVal = function () { return { message: Hello World } } // data function绑定vm实例后执行,执行结果: {message: Hello World} var instanceData = childVal.call(vm) // 对象之间的merge,类似$.extend,结果肯定就是:{message: Hello World} return mergeData(instanceData, parentVal)}init data_initData()?发生在?_initState()?中,主要做了两件事:代理data中的属性observe data文件路径:src/instance/internal/state.jsVtotype._initState = function () { this._initProps() this._initMeta() this._initMethods() this._initData() // 这里 this._initComputed() }属性代理(proxy)把data的结果赋值给内部属性:文件路径:src/instance/internal/state.jsvar da
文档评论(0)