弹框是移动端上比较常用的一类组件了,用于提示消息、与用户交互等
效果展示
弹框种类
常见的弹框可以分为三种吧:
- 一种就是单纯的提示框,用于传递消息,比如提示请求出错等;
- 另一种是确认框,在进行一些不可撤销的操作时,提示用户是否继续,可以避免误操作;
- 最后一种就是带有输入框的提示框,功能就不必再说了吧
组件设计
考虑到弹框组件与一般的组件的调用方式不一致,所以没有使用Vue.component
的方式注入组件,而是使用将组件的调用设置成一个全局方法,期望调用的方式就是:
this.$Message({
type: '',
message: '消息',
duration: 3000
})
这样的方式就要考虑到组件的插件创建方式,通过使用Vue.extend
创建一个组件构造器,调用的时候才会创建一个具体的组件实例
核心代码
组件模板
message.vue文件
<template>
<div class="eve-message">
<overlay v-model="visible"></overlay>
<transition name="eve-scale-in">
<component
:is="dialogType"
:content="content"
v-show="visible"
@dialog-click="dialogClick"
></component>
</transition>
</div>
</template>
<script>
import Overlay from '../overlay/overlay'
import maskMixin from '../../mixins/mask'
import Alert from './alert'
import Confirm from './confirm'
export default {
mixins: [maskMixin],
data () {
return {
content: '',
dialogType: 'Alert'
}
},
components: { Overlay, Alert, Confirm },
methods: {
dialogClick (type) {
this.visible = false
}
}
}
</script>
在message的组件中,使用了一个component
实现动态组件功能,这样就能将不同的组件类型分离开来,而且拓展也比较方便
JavaScript
import Message from './message.vue'
import { type } from '../../common/helpers/utils.js' // 判断类型
import { singleton } from '../../common/helpers/mode.js' // 创建单例
Message.install = function (Vue) {
// 创建一个Message组件的构造器
const MessageConstructor = Vue.extend(Message)
// 使用单例模式,创建一个返回单一实例的方法
const getInstance = singleton(MessageConstructor)
Vue.prototype.$Message = function (options) {
if (type(options) === 'string') {
options = { message: options, type: 'alert' }
}
// 获取同一个组件实例
const instance = getInstance()
// 组件实例未挂载
if (!instance.$el) {
instance.$mount(document.createElement('div'))
document.body.appendChild(instance.$el)
}
instance.content = options.message
instance.dialogType = options.type
instance.visible = true
if (options.duration) {
setTimeout(() => {
instance.visible = false
}, options.duration)
}
}
}
export default Message
考虑到这种插件式的调用,组件实例挂载后不会清除,所以就使用单例模式,获取同一个实例
在组件挂载之后就不会再创建一个同样的组件实例,每次调用就会根据传递的参数动态都更新弹框的类型
感觉需要注意的就是JavaScript文件内的内容,对于组件实例的创建与复用,单例模式如何使用,如何判断组件已挂载
TODO
基本的弹框组件结构已经完成,不过尚有一些不足之处,后续会更新在该文章中
- 确认框还没有完全实现,缺少交互
- 带有输入框的弹框
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。