在开发项目过程当中,一般会用到不少功能和设计相相似的组件,为了不重复造轮子,咱们常常会用到一些第三方组件,好比 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并调用的方法就接受完了。
后续的继续封装其余组件,敬请关注