教你如何以Vue.js插件的形式實現消息提示框

2020-12-16 IT技術專家孫鑫

在Vue-CLI 3腳手架項目中的src目錄下新建plugin文件夾,在該文件夾下新建MessageBox.vue,代碼如例1-1所示。

例1-1 MessageBox.vue

<template>

<div>

<h2>{{title}}</h2>

<div>

<div @click="handleOk">{{ok}}</div>

<div @click="handleCancel" v-if="cancel">{{cancel}}</div>

</div>

</div>

</template>

<script>

export default {

name: "MessageBox",

props: [""],

data() {

return {

title: '',

ok: '',

cancel: ''

};

}

}

</script>

可以看到,該組件內的數據屬性都沒有值,我們稍後會給該組件的數據屬性設置默認值。在組件內,對數據屬性cancel進行判斷,如果計算為假,則不渲染「取消」按鈕。

我們知道Vue.extend()方法可以創建一個組件的「子類」,我們可以利用這個「子類」來構造一個提示框組件對象,並設置組件的數據屬性的默認值。如下所示:

let MessageBoxImpl = Vue.extend(MessageBox);

// 調用showMessageBox函數時需要提供一個選項對象,

// 用於初始化組件內的各個選項

function showMessageBox(opts)

{

let vm = new MessageBoxImpl({

el: document.createElement("div"), //創建一個組件掛載的根元素

data() {

return {

title: opts.title ? opts.title : '',

ok: opts.ok ? opts.ok : '確定',

cancel: opts.cancel ? opts.cancel : ''

}

},

methods: {

handleOk(){

if(opts.handleOk)

// 如果外部指定了「確定」按鈕的點擊事件處理函數,

// 則調用它,使用組件的this進行綁定

opts.handleOk.call(this);

// 點擊「確定」按鈕時,從DOM中刪除提示框組件

document.body.removeChild(vm.$el);

},

handleCancel(){

if(opts.handleCancel)

// 如果外部指定了「取消」按鈕的點擊事件處理函數,

// 則調用它,使用組件的this進行綁定

opts.handleCancel.call(this);

// 點擊「取消」按鈕時,從DOM中刪除提示框組件

document.body.removeChild(vm.$el);

}

}

});

// 將組件綁定的根元素添加到HTML body元素內

document.body.appendChild(vm.$el)

}

對上述代碼進一步改良,使用閉包函數調用返回一個對外的接口。如下所示:

(function(){

// 組件數據屬性和事件響應函數的默認值

let defaults = {

title: '',

ok: '確定',

cancel: '',

handleOk: function(){},

handleCancel: function(){}

}

let MessageBoxImpl = Vue.extend(MessageBox);

return function(opts){ //配置參數

for(let attr in opts){

defaults[attr] = opts[attr];

}

let vm = new MessageBoxImpl({

el: document.createElement("div"), // 創建一個組件掛載的根元素

data() {

return {

title: defaults.title,

ok: defaults.ok,

cancel: defaults.cancel,

}

},

methods: {

handleOk(){

defaults.handleOk.call(this);

document.body.removeChild(vm.$el);

},

handleCancel(){

defaults.handleCancel.call(this);

document.body.removeChild(vm.$el);

}

}

});

document.body.appendChild(vm.$el)

}

})();

接下來將上述代碼封裝為Vue的插件,Vue的插件開發很簡單,只需要按照如下形式編寫代碼即可。

MyPlugin.install = function (Vue, options) {

// 1. 添加全局方法或屬性

Vue.myGlobalMethod = function () {

// 邏輯...

}

// 2. 添加全局資源

Vue.directive('my-directive', {

bind (el, binding, vnode, oldVnode) {

// 邏輯...

}

...

})

// 3. 注入組件選項

Vue.mixin({

created: function () {

// 邏輯...

}

...

})

// 4. 添加實例方法

Vue.prototype.$myMethod = function (methodOptions) {

// 邏輯...

}

}

按照上述插件開發形式編寫消息提示框插件,在plugin目錄下新建vue-msgbox.js,完整的代碼如例1-2所示。

例1-2 vue-msgbox.js

import MessageBox from './MessageBox'

const msgBox = {};

msgBox.install = function(Vue){

Vue.prototype.$msgBox = msgBox;

msgBox.show = (function(){

// 組件數據屬性和事件響應函數的默認值

let defaults = {

title: '',

ok: '確定',

cancel: '',

handleOk: function(){},

handleCancel: function(){}

}

let MessageBoxImpl = Vue.extend(MessageBox);

// 調用msgBox.show函數時需要提供一個選項對象,

// 用於初始化組件內的各個選項

return function(opts){ //配置參數

for(let attr in opts){

defaults[attr] = opts[attr];

}

let vm = new MessageBoxImpl({

el: document.createElement("div"), // 創建一個組件掛載的根元素

data() {

return {

title: defaults.title,

ok: defaults.ok,

cancel: defaults.cancel,

}

},

methods: {

handleOk(){

defaults.handleOk.call(this);

// 點擊「確定」按鈕時,從DOM中刪除提示框組件

document.body.removeChild(vm.$el);

},

handleCancel(){

defaults.handleCancel.call(this);

// 點擊「取消」按鈕時,從DOM中刪除提示框組件

document.body.removeChild(vm.$el);

}

}

});

// 將組件綁定的根元素添加到HTML body元素內

document.body.appendChild(vm.$el)

}

})();

}

export default msgBox;

接下來引入和安裝vue-msgbox插件,編輯main.js文件,添加如下的代碼:

import msgBox from './plugin/vue-msgbox'

Vue.use(msgBox)

使用插件彈出消息提示框如圖1-2所示。

圖1-1 消息提示框

相關焦點

  • Vue.js 第三方常用插件
    Vue.js devtools用於開發調試Vue.js的一個必備插件。可以在Chrome中的擴展程序中直接安裝,也可以本地文件的方式安裝。2. vue-lazyload 圖片懶加載插件地址:https://github.com/hilongjw/vue-lazyloaddemo:http://hilongjw.github.io/vue-lazyload/2.1 安裝 和 使用插件cnpm install vue-lazyload --save1
  • 前端技術:開發一個vue中央事件總線插件vue-bus
    大家都知道,一個中央事件總線bus,可以作為一個簡單的組件傳遞數據,用於解決跨級和兄弟組件通信問題,那麼,這篇文字,我將使用這種思想,將bus封裝為一個Vue的插件,可以在所有的組件間任意使用,而不需要導入bus。
  • 史上最全:Vue 相關開源項目庫匯總
    mavonEditor ★179 - 基於Vue的markdown編輯器vue-carousel-3d ★173 - VueJS的3D輪播組件vue-baidu-map ★170 - 基於 Vue 2的百度地圖組件庫sweet-modal-vue ★170 - 精美的點擊提示對話框vue-particles ★168 - 粒子背景的
  • 【Vue.js 入門到實戰教程】01-Vue.js 數據綁定的基本實現和代碼分析
    Vue + 後端 API 接口構建單頁面應用,希望通過這個系列的學習,可以幫助你快速上手 Vue.js 開發。這也是 Vue.js 相較於傳統 JavaScript DOM 編程的優勢,通過這種數據雙向綁定,我們可以輕鬆實現視圖與數據的解耦:接下來,我們就從數據綁定開始,探索 Vue.js 框架的使用。
  • 【項目推薦】Vue.js
    </div> </div> </div></body></html>當然你也可以在 github 上 clone 最新的版本並作為單文件引入,或者使用 CDN:http://cdn.jsdelivr.net/vue/1.0.7/vue.min.js
  • 精通React/Vue系列之帶你實現一個功能強大的通知提醒框
    我們看到的組件效果可能是這樣的:那麼我們如何實現這樣的調用方式呢?不用急,接下來筆者會一步步教你實現。先來鞏固以下組件的分類法:通用型組件: 比如Button, Icon等.布局型組件: 比如Grid, Layout布局等.
  • 【分享】Vue.js新手入門指南
    下面我就以問答的形式來分享吧。這裡假設你僅僅只掌握了HTML+CSS+JavaScript,如果你對JQuery這個前端庫,以及各種後端模版語言比如說PHP,JSP還有所了解並且使用過的話那就太好了。1.Vue.js是什麼?
  • Vue.js以業務為中心的常見面試題
    v-model是vue.js的一條指令,實現數據的雙向綁定雙向數據綁定的原理:vue.js使用es5提供的屬性特性功能,結合發布者-訂閱者模式,通過Object.defineProperty()為各個屬性定義get,set特性方法,在數據發送改變時給訂閱者發布消息,觸發相應的監聽回調
  • Vue.js 框架作者公布 Vue 3 最新進展
    Vue.js 作者尤雨溪近日介紹了 Vue 3 的最新進展。Vue CLIVue CLI 中的 Vue 3 支持目前通過 vue-cli-plugin-vue-next 插件提供。可以先通過腳手架構建一個新項目,然後運行 vue add vue-next 來切換到 Vue 3。Vue 3 進入 RC 階段後會成為項目創建過程中的一個選項。
  • 一張圖教你快速玩轉vue-cli3
    你將會了解如下知識點:如何安裝項目插件添加瀏覽器支持如何配置scss/stylus共享全局變量如何整合eleemntUI等第三方框架並實現按需引入配置單/多頁面如何配置自定義環境變量如何在vue.config.js定製自己的webpackvue項目部署思維導圖接下來,我們根據思維導圖,一步步來解釋和實現我們的目標。
  • 揭密vue.js的神秘之處,小程序跟vue有什麼關係
    微容用的微信小程序平臺採用開發思路是前後端分離,前端採用vue.js+h5+jq開發,後端採用MVE的思路,用php開發,用vue.js構建來微信小程序可視化前端之後,微容給大家介紹下vue的來源和特徵。
  • vue輪播圖實現
    其中數據為定義的模擬數據,接下來是代碼的實現過程:1、使用swiper插件:vue-awesome-swiper(Github上搜索相對應插件)2、下載插件到項目內:npm install vue-awesome-swiper@2.6.7 --save //(@x.x.x表示插件版本)3、全局下(main.js)引入:import VueAwesomeSwiper from 'vue-awesome-swiper'import
  • 「Web全棧教程」手把手教你用 Vue.js + Django 搭建在線教育平臺
    那麼, 實驗樓」這樣的在線編程教育網站是如何搭建的呢?今天給大家分享一個 Web 全棧項目: 以「實驗樓」為例,用 Vue.js 和 Django 搭建一個在線教育網站!課程選擇用 Django + Vue.js 來構建前後端分離項目,不僅簡潔清晰,而且十分地便捷,重點講述了運用 Django + Vue.js 來構建前後端分離項目的過程,並直觀地展示了兩者在運用上的技術細節。
  • vue-router 實現分析
    是 Vue.js 官方的路由庫,本著學習的目的,我對 vue-router 的源碼進行了閱讀和分析,分享出來給其他感興趣的同學做個參考吧。深入如何實現對地址變更的監聽?})源碼(https://github.com/vuejs/vue-router/blob/v2.2.1/src/history/hash.js#L21)這個動作是什麼時候執行的呢?是在 router.init()(源碼)中調用的,而 router.init() 則是在根組件創建時(源碼)調用的。
  • Vue.js最佳實踐(五招讓你成為Vue.js大師)
    如果有人需要Vue.js入門系列的文章可以在評論區告訴我,有空就給你們寫。對大部分人來說,掌握Vue.js基本的幾個API後就已經能夠正常地開發前端網站。但如果你想更加高效地使用Vue來開發,成為Vue.js大師,那下面我要傳授的這五招你一定得認真學習一下了。
  • 10 個實用的 Vue.js 工具和庫
    Vuex( https://vuex.vuejs.org/ )5、NuxtNuxt 是常用的服務端渲染(SSR)方法。這個框架簡潔而直觀,可用來構建各種應用程式。它也是模塊化的,因此你可以只使用應用程式所需的那些模塊。
  • 【Vue.js入門到實戰教程】11-Vue Loader(下)| 編寫一個單文件 Vue 組件
    然後在 src/main.js 中引入 Bootstrap 的腳本和樣式文件:import Vue from 'vue'import App from '.編寫 ModalExample 組件我們將 vue_learning/component/slot.html 中的 modal-example 組件拆分出來,在 vue_learning/demo-project/src/components 目錄下新建一個單文件組件 ModalExample.vue,將 modal-example 組件代碼按照 Vue Loader 指定的格式填充到對應位置
  • Vue CLI 3.0 正式發布,Vue.js 開發標準化工具
    無需 Eject 即可配置上面列出的所有功能都可以零配置:當通過 Vue CLI 3 構建項目時,它會安裝 Vue CLI 運行時服務(@ vue / cli-service),選擇功能插件,並生成必要的配置文件。在多數情況下,你只需要專注於編寫代碼。
  • 「Vue.js開發連載一」Vue.js簡介
    一、簡介Vue.js(讀音 /vju/,類似於view)是一個構建數據驅動的web界面的漸進式框架。Vue。js的目標是通過儘可能簡單的API實現響應的數據綁定和組合的視圖組件。它不僅易於上手,還便於與第三方庫或既有項目整合。
  • 手把手教你用JS/Vue/React實現幸運水果機(80後情懷之作)
    項目體驗地址免費視頻教程分別使用原生JS,Vue和React,手把手教你開發一個H5小遊戲,快速上手Vue和React框架的使用。快速入門vue框架的應用快速入門react框架的應用對比原生js,vue框架和react框架開發的優缺點。