Vue.js是一款流行的JavaScript框架,它是基于組件的,使用了MVVM(Model-View-ViewModel)架構,具有雙向綁定和響應式機制等特點。其中,最重要的一部分就是Vue實例的掛載,也就是將Vue實例與DOM元素關聯起來。
new Vue({ el: '#app', data: { message: 'Hello, Vue!' } })
在上面的代碼中,需要將Vue實例掛載到id為“app”的DOM元素上,這就要用到Vue的$mount()方法。
const vm = new Vue({ data: { message: 'Hello, Vue!' } }) vm.$mount('#app')
如果沒有使用$mount()方法,Vue實例將無法與DOM元素建立關聯。在$mount()方法中,Vue會調用compile函數將模板編譯成渲染函數,并在render函數中將組件的VNode渲染出來,最后將VNode轉換成真實DOM插入到頁面中。
function simpleCompileToFunctions(template) { const ast = parseHTML(template) const code = generate(ast) return new Function(`with(this){ return ${code} }`) } function compileToFunctions(template) { if (!template) { return } const compiledFunc = cache.get(template) if (compiledFunc) { return compiledFunc } const render = simpleCompileToFunctions(template) cache.put(template, render) return render } function mountComponent(vm, el) { const options = vm.$options const updateComponent = () =>{ vm._update(vm._render()) } vm._update = function (vnode) { const prevVnode = vm._vnode vm._vnode = vnode if (!prevVnode) { vm.$el = vm.__patch__(vm.$el, vnode) } else { vm.$el = vm.__patch__(prevVnode, vnode) } } vm._render = function () { let render = options.render if (!render) { render = compileToFunctions(options.template) options.render = render } return render.call(vm) } vm.__patch__ = patch updateComponent() } Vue.prototype.$mount = function (el) { const vm = this el = vm.$el = query(el) const options = vm.$options if (!options.render) { const template = options.template if (template) { options.render = compileToFunctions(template) } else { console.error('Vue instance should have either a template or an el') } } if (!options.render) { options.render = noop } mountComponent(vm, el) }
可以看到,Vue的$mount()方法非常重要,它實現了Vue實例與DOM元素的綁定,以及渲染函數和組件的生成。掌握Vue的掛載原理,對于我們深入理解Vue.js框架的自身機制和源碼分析都有幫助。