当前位置: 首页 > article >正文

vue原理分析(四)Vue实例挂载到app上面

今天我们来分析Vue实例的挂载

代码如下:

new Vue({

  render: h => h(App),

}).$mount('#app')

new Vue({

  render: h => h(App),

}).$mount('#app')

这串代码可以拆分成2句

第一句是创建一个Vue实例

const app = new Vue({ render: h => h(App) })

在上一篇中,我们已经分析了,创建Vue实例实际上是

const app = new Vue({
    el: '#root',
    template: '<App></App>',
    components: {
        App
    }
})

第二句是将Vue实例挂载在id为app的标签上,这个app标签是在index.html中,大家可以自己找一下

app.$mount('#app')

这里研究下挂载

app.$mount('#app')

app是一个Vue实例,调用了$mount方法,该方法有个入参'#app'

vue.common.dev.js的源码,中文注释是源码解读

Vue.prototype.$mount = function (el, hydrating) {
    // 获取el属性,挂载点
    el = el && query(el);
    /* istanbul ignore if */
    // 实例不允许挂载在body或者html标签上
    if (el === document.body || el === document.documentElement) {
        warn$2(`Do not mount Vue to <html> or <body> - mount to normal elements instead.`);
        return this;
    }
    // options配置项
    const options = this.$options;
    // resolve template/el and convert to render function
     //  如果用户提供了 render 配置项,则直接跳过编译阶段,否则进入编译阶段, 优先级render——> template ——>el
    if (!options.render) {
        let template = options.template;
        // 处理 template 选项
        if (template) {
            if (typeof template === 'string') {
                if (template.charAt(0) === '#') {
                    // { template: '#app' },template 是一个 id 选择器,则获取该元素的 innerHtml 作为模版
                    template = idToTemplate(template);
                    /* istanbul ignore if */
                    if (!template) {
                        warn$2(`Template element not found or is empty: ${options.template}`, this);
                    }
                }
            }
            else if (template.nodeType) {
                // template 是一个正常的元素,获取其 innerHtml 作为模版
                template = template.innerHTML;
            }
            else {
                {
                    warn$2('invalid template option:' + template, this);
                }
                return this;
            }
        }
        else if (el) {
            // 设置了 el 选项,获取 el 选择器的 outerHtml 作为模版
            // @ts-expect-error
            template = getOuterHTML(el);
        }
        if (template) {
            /* istanbul ignore if */
            if (config.performance && mark) {
                mark('compile');
            }
            // 编译模版,得到 动态渲染函数和静态渲染函数
            const { render, staticRenderFns } = compileToFunctions(template, {
                outputSourceRange: true,
                shouldDecodeNewlines,
                shouldDecodeNewlinesForHref,
                // 界定符,默认 {{}}
                delimiters: options.delimiters,
                // 是否保留注释
                comments: options.comments
            }, this);
            // 将两个渲染函数放到 this.$options 上
            options.render = render;
            options.staticRenderFns = staticRenderFns;
            /* istanbul ignore if */
            if (config.performance && mark) {
                mark('compile end');
                measure(`vue ${this._name} compile`, 'compile', 'compile end');
            }
        }
    }
    // 执行挂载,执行的是缓存的$mount
    return mount.call(this, el, hydrating);
};








 


http://www.kler.cn/a/291170.html

相关文章:

  • 强力巨彩租赁屏技术更新,适用多种户外应用场景
  • C++ 指针进阶:动态内存与复杂应用
  • 007-spring-bean的相关配置(重要)
  • Issac ROS navigation测试
  • Docker 设置代理的三种方法(2024年12月19日亲自测试)
  • 注意力机制详解
  • C++系列-STL容器的应用举例
  • AI自动生成PPT哪个软件好?如何自动生成专业级PPT?
  • 浙大数据结构:01-复杂度1 最大子列和问题
  • 解决el-table中使用el-input无法聚焦问题
  • OpenAI transcription API bad request
  • ubuntu20.04 colmap安装
  • 假期学习-- iOS runloop了解和使用
  • 【STM32】寄存器点灯
  • 比特币客户端和API
  • 日程安排组件DHTMLX Scheduler v7.1 - 支持RFC-5545格式
  • VSCode中多行文本的快速前后缩进
  • kitti深度估计数据集介绍
  • Python知识点:Python开发中,如何使用Git进行版本控制
  • WEB渗透Linux提权篇-可写文件提权
  • 集成电路学习:什么是MOSFET(MOS管)
  • 【kubernetes】污点配置、cm、secret练习
  • 数学基础 -- 线性代数之共轭转置矩阵
  • 体会循环---冒泡排序
  • 2024.9.4
  • 在js渲染的dom中的事件中传递对象