目錄javascript
一、組件化開發指的是將複雜的業務拆分爲一個有一個的組件
二、組件化開發的組件通常來講要靈活
三、組件化開發涉及到了Vue的js組件封裝,須要掌握Vue基礎、Vue實例方法與屬性、Vue.extend、Vue插件等知識css
vm.$mount(el)
會將當前的組件掛載el元素上,該操做會替換當前的元素
若$mount中接收的el爲空,則會掛載到當前的vue實例之外的地方
當vm對象中存在el時,會掛載到el上vue
vm.$el
返回當前掛載的元素java
一、Vue.Componentnode
定義了一個在Vue的掛載點下的一個全局組件app
二、Vue.extendide
定義了一個未掛載的組件類函數
能夠接收一個組件做爲當前組件類的模板組件化
使用關鍵字new實例組件,能夠接收參數,這個組件須要手動掛載this
三、插件
Vue.use(Plugin, options)
Plugin:若爲對象時,會查找並執行對象下的install方法,若爲函數,會直接執行
options:傳遞到insntall函數中的參數
install函數的第一個參數是Vue,第二個參數爲options
import MyPlugin from "" MyPlugin.install=(Vue, options)=>{ // 添加全局組件 Vue.component(MyPlugin.name, MyPlugin) // 掛載原型方法 var Plugin = Vue.extend(MyPlugin) Vue.prototype.doPlugin = function(){ var plugin = new Plugin({}) document.body.appendChild(plugin.$mount().$el) } // 添加全局方法或屬性 Vue.myGlobalMethod = function () { // code } Vue.myGlobalProperty = 'property' // 添加全局資源 Vue.directive('my-directive', { bind (el, binding, vnode, oldVnode) { // code } // code }) // 注入組件選項 Vue.mixin({ created: function () { // code } ... }) } export default MyPlugin
編寫:
src/components/Popup/Popup.vue
<template> <div class='popup-container' v-if="status"> <div class="popup-content"> <div class="popup-title">{{title}}</div> <div class="popup-msg">{{msg}}</div> <a class="popup-btn" href="javascript: void(0)" @click="hidePopup">x</a> </div> </div> </template> <script> export default { name: 'popup' } </script> <style lang="scss"> div.popup-container{ position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; background: rgba(33, 33, 33, .5); box-sizing: content-box; div.popup-content{ position: absolute; top: 50%; left: 50%; margin: -150px -300px; background: #fff; width: 600px; height: 300px; } div.popup-title{ width: 590px; height: 20px; padding: 5px; line-height: 20px; text-align: center; background: #3498db; } div.popup-msg{ width: 588px; height: 239px; text-align: center; border: 1px solid #999; border-top: none; padding: 15px 5px; } a.popup-btn{ position: absolute; top: 5px; right: 5px; display: block; width: 20px; height: 20px; line-height: 20px; font-size: 16px; text-align: center; text-decoration: none; color: #666; background: #f00; } } </style>
src/components/Popup/index.js
import Popup from './Popup.vue' const defaultData = { status: false, title: 'Popup', msg: 'Message' } Popup.install = (Vue) => { let PopupCom = Vue.extend(Popup) console.log('PopupCom', PopupCom) Vue.prototype.$popup = function(params) { let popup = new PopupCom({ el: document.createElement('div'), data() { for(let item in params){ defaultData[item] = params[item] } return defaultData }, methods: { hidePopup() { this.status = false; }, }, }) console.log('popup', popup); console.log('popup.$mount()', popup.$mount()); document.body.appendChild(popup.$mount().$el) } } export default Popup
使用:
src/main.js
import Vue from 'vue' import App from './App.vue' //引用並使用插件 import Popup from './components/Popup' Vue.use(Popup) new Vue({ render: h => h(App), }).$mount('#app')
src/main.js
<template> <div id="app"> <img alt="Vue logo" src="./assets/logo.png"> <button @click="doit">do</button> </div> </template> <script> export default { name: 'app', methods: { //調用方法進行彈窗 doit() { this.$popup({ status: true }) } }, } </script> <style lang="scss"> #app { text-align: center; } </style>