使用vue-cli編寫vue插件的方法
利用vue組件創(chuàng)建模板,使用webpack打包生成插件再全局使用
1、vue init webpack-simple 生成項目目錄
2、調(diào)整目錄結(jié)構(gòu)

3、修改webpack.config.js
var path = require('path')
var webpack = require('webpack')
module.exports = {
entry: './src/index.js',
output: {
path: path.resolve(__dirname, './dist'),
publicPath: '/dist/',
filename: 'vue-toast.js',
// 打包后的格式(三種規(guī)范amd,cmd,common.js)通過umd規(guī)范可以適應(yīng)各種規(guī)范,以及全局window屬性
libraryTarget:'umd',
},
module: {
rules: [
{
test: /\.vue$/,
loader: 'vue-loader',
},
{
test: /\.js$/,
loader: 'babel-loader',
exclude: /node_modules/
},
]
},
plugins:[]
}
開發(fā)一個toast插件,可以借助npm平臺發(fā)布,在這里就不做過多的說明了
toast.vue
<template>
<transition name="toast-fade">
<div class="toast"
:class="objClass"
v-show="isActive"
@mouseenter="onMouseenter"
@mouseleave="onMouseleave"
>
<button class="toast-close-button" @click="hide">×</button>
<div class="toast-container">
<div class="toast-title">{{title}}</div>
<div class="toast-content">{{content}}</div>
</div>
</div>
</transition>
</template>
<script>
export default {
data: () => ({
list: [],
title: null,
content: null,
type: null,
isActive: false,
timer: null,
onShow: () => {},
onHide: () => {}
}),
computed: {
objClass () {
// 樣式'success, error, warning, default'
return this.type ? 'toast-' + this.type : null
}
},
methods: {
// 顯示
show (params) {
let {content, title, onShow, onHide, type} = params
this.type = type
this.content = content
this.title = title
this.onShow = onShow
this.onHide = onHide
this.isActive = true
this.setTimer()
},
// 隱藏
hide () {
this.isActive = false
},
// 計時器
setTimer () {
clearTimeout(this.timer)
this.timer = setTimeout(() => {
this.isActive = false
}, 4000)
},
// 鼠標(biāo)移至組件時保持顯示狀態(tài)
onMouseenter () {
clearTimeout(this.timer)
},
// 鼠標(biāo)移開組件時重新定時
onMouseleave () {
if (this.isActive) this.setTimer()
}
},
watch: {
isActive (val) {
if (val && typeof this.onShow === 'function') {
this.onShow()
} else if (!val && typeof this.onHide === 'function') {
this.onHide()
}
}
}
}
</script>
<style>
.toast {
position: fixed;
top: 10px;
right: 10px ;
display: block;
width: 300px;
overflow: hidden;
box-shadow: 0 0 6px #999;
opacity: .8;
border-radius: 3px 3px;
padding: 15px 15px 15px 15px;
background-position: 15px center;
background-repeat: no-repeat;
color: #333;
background-color: #f0f3f4;
}
.toast-success {
color: #fff;
background-color: #51a351;
padding: 15px 15px 15px 50px;
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADsSURBVEhLY2AYBfQMgf///3P8+/evAIgvA/FsIF+BavYDDWMBGroaSMMBiE8VC7AZDrIFaMFnii3AZTjUgsUUWUDA8OdAH6iQbQEhw4HyGsPEcKBXBIC4ARhex4G4BsjmweU1soIFaGg/WtoFZRIZdEvIMhxkCCjXIVsATV6gFGACs4Rsw0EGgIIH3QJYJgHSARQZDrWAB+jawzgs+Q2UO49D7jnRSRGoEFRILcdmEMWGI0cm0JJ2QpYA1RDvcmzJEWhABhD/pqrL0S0CWuABKgnRki9lLseS7g2AlqwHWQSKH4oKLrILpRGhEQCw2LiRUIa4lwAAAABJRU5ErkJggg==") !important;
}
.toast-error {
color: #fff;
background-color: #bd362f;
padding: 15px 15px 15px 50px;
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHOSURBVEhLrZa/SgNBEMZzh0WKCClSCKaIYOED+AAKeQQLG8HWztLCImBrYadgIdY+gIKNYkBFSwu7CAoqCgkkoGBI/E28PdbLZmeDLgzZzcx83/zZ2SSXC1j9fr+I1Hq93g2yxH4iwM1vkoBWAdxCmpzTxfkN2RcyZNaHFIkSo10+8kgxkXIURV5HGxTmFuc75B2RfQkpxHG8aAgaAFa0tAHqYFfQ7Iwe2yhODk8+J4C7yAoRTWI3w/4klGRgR4lO7Rpn9+gvMyWp+uxFh8+H+ARlgN1nJuJuQAYvNkEnwGFck18Er4q3egEc/oO+mhLdKgRyhdNFiacC0rlOCbhNVz4H9FnAYgDBvU3QIioZlJFLJtsoHYRDfiZoUyIxqCtRpVlANq0EU4dApjrtgezPFad5S19Wgjkc0hNVnuF4HjVA6C7QrSIbylB+oZe3aHgBsqlNqKYH48jXyJKMuAbiyVJ8KzaB3eRc0pg9VwQ4niFryI68qiOi3AbjwdsfnAtk0bCjTLJKr6mrD9g8iq/S/B81hguOMlQTnVyG40wAcjnmgsCNESDrjme7wfftP4P7SP4N3CJZdvzoNyGq2c/HWOXJGsvVg+RA/k2MC/wN6I2YA2Pt8GkAAAAASUVORK5CYII=") !important;
}
.toast-warning {
color: #fff;
background-color: #f89406;
padding: 15px 15px 15px 50px;
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAGYSURBVEhL5ZSvTsNQFMbXZGICMYGYmJhAQIJAICYQPAACiSDB8AiICQQJT4CqQEwgJvYASAQCiZiYmJhAIBATCARJy+9rTsldd8sKu1M0+dLb057v6/lbq/2rK0mS/TRNj9cWNAKPYIJII7gIxCcQ51cvqID+GIEX8ASG4B1bK5gIZFeQfoJdEXOfgX4QAQg7kH2A65yQ87lyxb27sggkAzAuFhbbg1K2kgCkB1bVwyIR9m2L7PRPIhDUIXgGtyKw575yz3lTNs6X4JXnjV+LKM/m3MydnTbtOKIjtz6VhCBq4vSm3ncdrD2lk0VgUXSVKjVDJXJzijW1RQdsU7F77He8u68koNZTz8Oz5yGa6J3H3lZ0xYgXBK2QymlWWA+RWnYhskLBv2vmE+hBMCtbA7KX5drWyRT/2JsqZ2IvfB9Y4bWDNMFbJRFmC9E74SoS0CqulwjkC0+5bpcV1CZ8NMej4pjy0U+doDQsGyo1hzVJttIjhQ7GnBtRFN1UarUlH8F3xict+HY07rEzoUGPlWcjRFRr4/gChZgc3ZL2d8oAAAAASUVORK5CYII=") !important;
}
.toast:hover {
opacity: 1;
box-shadow: 0 0 18px #888;
transition: all 200ms ease;
}
.toast-container {
vertical-align: middle;
}
.toast-fade-enter, .toast-fade-leave-active {
opacity: 0;
transform: translateX(100%);
}
.toast-fade-leave-active,
.toast-fade-enter-active {
transition: all 400ms cubic-bezier(.36,.66,.04,1);
}
.toast-title {
font-size: 14px;
font-weight: bold;
}
.toast-close-button {
padding: 2px 2px;
border: none;
background: transparent;
position: relative;
right: -10px;
top: -15px;
float: right;
font-size: 20px;
font-weight: bold;
color: #ffffff;
-webkit-text-shadow: 0 1px 0 #ffffff;
text-shadow: 0 1px 0 #ffffff;
-ms-filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=80);
filter: alpha(opacity=80);
}
</style>
index.js
import ToastComponent from './toast.vue'
let Toast = {};
Toast.install = function(Vue, options = {}) {
// extend組件構(gòu)造器
const VueToast = Vue.extend(ToastComponent)
let toast = null
function $toast(params) {
return new Promise( resolve => {
if(!toast) {
toast = new VueToast()
toast.$mount()
document.querySelector(options.container || 'body').appendChild(toast.$el)
}
toast.show(params)
resolve()
})
}
Vue.prototype.$toast = $toast
}
if(window.Vue){
Vue.use(Toast)
}
export default Toast
npm run build 之后就會在根目錄下生成dist文件

接下來就可以使用了
demo.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no">
<!--引入-->
<script src="node_modules/vue/dist/vue.js"></script>
<script src="dist/vue-toast.js"></script>
</head>
<body>
<div id="app">
<h1>vue-toast,{{msg}}</h1>
<div class="demo-box">
<button @click="test">默認(rèn)效果</button>
</div>
</div>
<script>
var vm = new Vue({
el: "#app",
data: {
msg: '你好'
},
methods: {
test() {
this.$toast({
title:'消息提示',
content: '您有一條新消息',
type: 'warning',
onShow: ()=>{
console.log('on toast show')
},
onHide: ()=>{
console.log('on toast hide')
}
})
}
}
})
</script>
</body>
</html>
總結(jié):
1、使用Vue構(gòu)造器,通過vue組件來創(chuàng)建一個子類:Vue.extend(component)
2、webpack配置output的path必須為絕對路徑
3、webpack基礎(chǔ)配置:entry,output,module,plugins
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue cli3.0結(jié)合echarts3.0與地圖的使用方法示例
這篇文章主要給大家介紹了關(guān)于vue cli3.0結(jié)合echarts3.0與地圖的使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用vue具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
解決vue2.0動態(tài)綁定圖片src屬性值初始化時報錯的問題
下面小編就為大家分享一篇解決vue2.0動態(tài)綁定圖片src屬性值初始化時報錯的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-03-03
vue項目中字符串換行顯示方式(返回的數(shù)據(jù)包含‘\r\n’字符)
這篇文章主要介紹了vue項目中字符串換行顯示方式(返回的數(shù)據(jù)包含‘\r\n’字符),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04
Vue系列:通過vue-router如何傳遞參數(shù)示例
本篇文章主要介紹了Vue系列:通過vue-router如何傳遞參數(shù)示例,具有一定的參考價值,有興趣的可以了解一下。2017-01-01
element上傳組件循環(huán)引用及簡單時間倒計時的實現(xiàn)
這篇文章主要介紹了element上傳組件循環(huán)引用及簡單時間倒計時的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-10-10

