<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
src -> components -> Toast -> toast.vue
<template> <transition name="fades"> <div class="Errormes" v-if="show">{{txt}}</div> </transition> </template> <script> export default { name: 'Toast', data () { return { txt: '', show: false } } } </script> <style lang="less" scoped> .fades-enter-active, .fades-leave-active { transition: opacity 0.5s; } .fades-enter, .fades-leave-active { opacity: 0; } /* 提示彈框 */ .Errormes { position: fixed; top: 40%; left: 50%; -webkit-transform: translate(-50%, -50%); transform: translate(-50%, -50%); padding: 20px 30px; background: rgba(0, 0, 0, 0.8); border-radius: 16px; color: #fff; font-size: 28px; z-index: 999999; max-width: 80%; height: auto; line-height: 60px; text-align: center; } </style>
src -> components -> Toast -> index.js
import Toast from './toast.vue' const toast = {} toast.install = (vue) => { const ToastClass = vue.extend(Toast) const instance = new ToastClass() instance.$mount(document.createElement('div')) document.body.appendChild(instance.$el) let t = null const ToastMain = { show (msg, seconds = 2000) { if (t) clearTimeout(t) instance.txt = msg instance.show = true t = setTimeout(() => { instance.show = false }, seconds) } } vue.prototype.$toast = ToastMain } export default toast
main.js
import Vue from 'vue' import App from './App.vue' import toast from '@/components/Toast/index' Vue.use(toast)
使用
$toast.show(message)
Vue.extend( options )
使用基礎 Vue 構造器,建立一個“子類”。引數是一個包含元件選項的物件。
一般,我們會用 Vue.extend 接收一個元件物件來建立一個構造器,再利用建立的構造器 new 一個範例,並將這個範例掛載到一個元素上。
<div id="mount-point"></div> // 建立構造器 var Profile = Vue.extend({ template: '<p>{{firstName}} {{lastName}} aka {{alias}}</p>', data: function () { return { firstName: 'Walter', lastName: 'White', alias: 'Heisenberg' } } }) // 建立 Profile 範例,並掛載到一個元素上。 new Profile().$mount('#mount-point')
data 選項是特例,需要注意 - 在 Vue.extend() 中它必須是函數
結果如下:
<p>Walter White aka Heisenberg</p>
Vue.extend 屬於 Vue 的全域性 API,在實際業務開發中我們很少使用,因為相比常用的 Vue.component 寫法使用 extend 步驟要更加繁瑣一些。
但是在一些獨立元件開發場景中,例如要實現一個類似於 window.alert() 提示元件,要求像呼叫 JS 函數一樣呼叫它,這時候 Vue.extend + $mount 這對組合就是我們需要去關注的。
1、vue $mount 和 el的區別說明
在應用之前我們先了解一下2個東西 —— $mount 和 el,兩者在使用效果上沒有任何區別,都是為了將範例化後的vue掛載到指定的dom元素中。
如果在範例化vue的時候指定el,則該vue將會渲染在此el對應的dom中,反之,若沒有指定el,則vue範例會處於一種“未掛載”的狀態,此時可以通過$mount來手動執行掛載。
注:如果$mount沒有提供引數,模板將被渲染為檔案之外的的元素,並且你必須使用原生DOM API把它插入檔案中。
var MyComponent = Vue.extend({ template: '<div>Hello!</div>' }) // 建立並掛載到 #app (會替換 #app) new MyComponent().$mount('#app') // 同上 new MyComponent({ el: '#app' }) // 或者,在檔案之外渲染並且隨後掛載 var component = new MyComponent().$mount() document.getElementById('app').appendChild(component.$el)
2、Vue.extend實現Loading外掛($mount)
<div id="root"> <button @click="showLoading">顯示Loading</button> </div> function Loading(msg) { // 建立構造器 const Loading = Vue.extend({ template: '<div id="loading-msg">{{ msg }}</div>', props: { msg: { type: String, default: '載入中' } }, name: 'Loading' }) // 建立掛載div const div = document.createElement('div') div.setAttribute('id', 'loading-div') document.body.append(div) // 建立範例並掛載到一個元素上 new Loading().$mount('#loading-div') // 返回一個移除元素的function return () => { document.body.removeChild(document.getElementById('loading-div')) } } // 掛載到vue範例上 Vue.prototype.$loading = Loading new Vue({ el: '#root', methods: { showLoading() { const hide = this.$loading('正在載入,請稍等...') setTimeout(() => { hide() }, 1500) } } })
3、Vue.extend實現資訊彈窗外掛(el)
新建一個popBox.vue
<template> <div id="confirm" v-if='flag'> <div class="contents" > <div class="content-top">{{ text.title }}</div> <div class="content-center">{{ text.msg }}</div> <div class="content-bottom"> <button @click='show' class="left">{{ text.btn.ok }}</button> <button @click='hide' class="right">{{ text.btn.no }}</button> </div> </div> </div> </template> <script> export default { data () { return { flag: true, text: { title:'標題', msg: '這是一個資訊彈出框元件', btn: { ok: '確定', no: '取消' } } } }, methods: { show (){ this.flag = false; }, hide() { this.flag = false; } } } </script>
新建一個popBox.js
import Vue from 'vue' import PopBox from './popBox.vue' // Vue.extend返回一個範例建立的構造器,但範例構造器需要進行掛載到頁面中 let popBox = Vue.extend(PopBox) popBox.install = (vue, text) => { // 在body中動態建立一個div元素,之後此div將會替換成整個vue檔案的內容 // 此時的popBoxDom通俗講就是相當於是整個元件物件,通過物件呼叫屬性的方法來進行元件中資料的使用 let popBoxDom = new popBox({ el: document.createElement('div') }) // 可以通過$el屬性來存取建立的元件範例 document.body.appendChild(popBoxDom.$el) // 將需要傳入的文字內容傳給元件範例 popBoxDom.text = text; // 返回一個promise,進行非同步操作,成功時返回,失敗時返回 return new Promise((res, rej) => { popBoxDom.show = () => { res() //正確時返回的操作 popBoxDom.flag = false; } popBoxDom.hide = ()=>{ rej() //失敗時返回的操作 popBoxDom.flag = false; } } vue.prototype.$popBox = popBox }) } // 將邏輯函數進行匯出和暴露 export default popBox
頁面使用
import PopBox from './popBox.js' Vue.use(popBOx); this.$popBox({ title:'標題', msg:'內容', btn:{ ok:'確定', no:'取消'} }).then(()=>{ console.log('ok') }).catch(()=>{ console.log('no') })
其他
import toastCom from "./Toast"; const toast = {}; toast.install = vue => { const ToastCon = vue.extend(toastCom); const ins = new ToastCon(); ins.$mount(document.createElement("div")); document.body.appendChild(ins.$el); console.log(ins.toast) vue.prototype.$toast = ins.toast; }; const globalComponent = { install: function(Vue) { Vue.use(toast); } }; export default globalComponent;
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45