在開發項目過程當中,一般會用到不少功能和設計相相似的組件,爲了不重複造輪子,咱們常常會用到一些第三方組件,好比 vux,vant。可是這樣會引入太多沒用到的組件,形成打包體積過大。因此咱們有必要封裝一些基礎的組件用於開發。javascript
下面我爲你們介紹如何封裝vue的toast和dialog組件並上傳到npm。css
GitHub: github.com/Michael-lzg…html
掃碼如下二維碼能夠先睹爲快哦前端
toast 和 dialog 組件基本是每個移動端項目都會用到的,下面我將介紹如何封裝這兩個組件,併發布到 npm 供下載使用。vue
最終咱們要達到這樣的效果,從 npm 下載依賴包,直接調用java
this.$toast({ msg: '手機號碼不能爲空' })
this.$toast({
msg: '成功提示',
type: 'success'
})
this.$dialog({
title: '刪除提示',
text: '是否肯定刪除此標籤?',
showCancelBtn: true,
confirmText: '確認',
confirm(content) {
alert('刪除成功')
}
})
複製代碼
效果圖以下 node
<template>
<div>
<transition name="fade">
<div class="little-tip" v-show="showTip">
<img src="assets/img/success.png" alt="" width="36" v-if="type=='success'" />
<img src="assets/img/fail.png" alt="" width="36" v-if="type=='fail'" />
<img src="assets/img/warning.png" alt="" width="36" v-if="type=='warning'" />
<img src="assets/img/loading.png" alt="" width="36" v-if="type=='loading'" class="loading" />
<span>{{msg}}</span>
</div>
</transition>
</div>
</template>
<script> export default { data() { return { showTip: true, msg: '', type: '' } }, mounted() { setTimeout(() => { this.showTip = false }, 1500) } } </script>
<style lang="less" scoped> /* 樣式略 */ </style>
複製代碼
3.一、利用 Vue.extend 構造器把 toast 組件掛載到 vue 實例下webpack
import Vue from 'vue'
import Main from './main.vue'
let Toast = Vue.extend(Main)
let instance
const toast = function(options) {
options = options || {}
instance = new Toast({
data: options
})
instance.vm = instance.$mount()
document.body.appendChild(instance.vm.$el)
return instance.vm
}
export default toast
複製代碼
3.2 在 main.js 引入 toast 組價並掛載在 vue 原型上git
import Vue from 'vue'
import toast from './components/toast'
Vue.prototype.$toast = toast
複製代碼
至此就能夠在項目中直接調用組件了。dialog 組件的封裝也是一樣的方法。
下面介紹如何把組件發佈到 npm 上。github
這裏主要用到 vue 兩種註冊組件和插件的方法
import toast from './components/toast'
import dialog from './components/dialog'
const YMUI = {
// 這裏是後續補充的組件
}
const install = function(Vue, opts = {}) {
if (install.installed) return
Object.keys(YMUI).forEach(key => {
Vue.component(key, YMUI[key])
})
Vue.prototype.$toast = toast
Vue.prototype.$dialog = dialog
}
// auto install
if (typeof window !== 'undefined' && window.Vue) {
install(window.Vue) // 經過use方式所有引入
}
const API = {
install,
...YMUI
}
export default API // 經過插件單獨引入
複製代碼
module.exports = {
context: path.resolve(__dirname, '../'),
entry: {
app: './src/index.js'
},
output: {
path: config.build.assetsRoot,
filename: 'vue-mobile-ymui.js',
libraryTarget: 'umd',
umdNamedDefine: true,
publicPath: process.env.NODE_ENV === 'production' ? config.build.assetsPublicPath : config.dev.assetsPublicPath
}
}
複製代碼
{
"name": "vue-mobile-ymui",
"version": "1.0.3",
"description": "a mobile compoment",
"author": "lzg",
"private": false,
"main": "./dist/vue-mobile-ymui.js",
"scripts": {
"dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
"start": "npm run dev",
"lint": "eslint --ext .js,.vue src",
"build": "node build/build.js",
"build-js": "webpack --config build/webpack.dist.prod.conf.js"
},
}
複製代碼
注意點:
npm install vue-mobile-ymui
複製代碼
import UI from 'vue-mobile-ymui'
Vue.use(UI)
複製代碼
this.$toast({
msg: '成功提示',
type: 'success'
})
複製代碼
至此,封裝vue組件併發布到npm並調用的方法就接受完了。
後續的繼續封裝其餘組件,敬請關注