繼上次的vue3 Alert組件,這次來試試看用vue2來做。
知識點
- install ( 使用Vue.use會自動調用物件裡面的這個屬性名稱的function)。
- Vue.extend ( 創建Vue組件構造函式並且可以new出實例,傳遞propsData當作組件接收的props )。
- Vue.prototype ( 在原形上面加上方法 )。
- vm.$el ( 組件實例的真實DOM存檔的地方 )。
組件
- 與普通的組件一樣
# MyAlert.vue
<template>
<div>
{{ message }}
</div>
</template>
<script>
export default {
props:{
message:{
type:String,
default:'message'
}
}
}
</script>
插件
- 這個部分主要是要製作動態引入與動態移除組件
# # MyAlert/index.js
// 組件引入
import MyAlert from './MyAlert.vue'
// 定義引入
const alertPlugin = {}
// Vue.use會自動調用插件的install方法
alertPlugin.install = function (Vue) {
// 建構函式
const instance = Vue.extend(MyAlert)
// 原形賦予方法
Vue.prototype.$show = function (message, time = 1000) {
// 創建根元素
let dom = document.createElement('div')
// 掛載根元素
document.querySelector('body').appendChild(dom)
// 實例化組件並且掛載到剛剛創建的根元素上
let vm = new instance({
// 這個會變成組件的props傳進去
propsData: {
message: message
}
}).$mount(dom)
// 因為是Alert讓他自動移除
setTimeout(() => {
// vm裡面的$el就是整個根元素可以用來移除
vm.$el.parentNode.removeChild(vm.$el)
}, time)
}
}
export default alertPlugin
引入
- 安裝外掛
# main.js
import Vue from 'vue'
import App from './App.vue'
import alertPlugin from '@/components/MyAlert/index.js'
// 使用插件
Vue.use(alertPlugin)
Vue.config.productionTip = false
new Vue({
router,
store,
render: h => h(App)
}).$mount('#app')
使用
<script>
export default {
mounted(){
this.$show('dd',2000)
}
}
</script>