什么是组件:组件是Vue.js最强大的功能之一。组件可以扩展HTML元素,封装可重用的代码。在较高层面上,组件是自定义的元素,Vue.js的编译器为它添加特殊功能。在有些情况下,组件也可以是原生HTML元素的形式,以is特性扩展。
如何注册组件?
需要使用Vue.extend方法创建一个组件,然后使用Vue.component方法注册组件。Vue.extend方法格式如下:
如果想要其他地方使用这个创建的组件,还得个组件命个名:
命名之后即可在HTML标签中使用这个组件名称,像使用DOM元素一样。
本文章通过实现一个vue-dialog的弹出层组件,然后附加说明如果发布此包到npm,且能被其他项目使用。
功能说明
- 多层弹出时,只有一个背景层。
- 弹出层嵌入内部组件。
- 弹出层按钮支持回调
实现
- 多层弹出时,只有一个背景层
- 利用两个组件实现,一个背景层组件(只提供一个背景层,组件名:background.vue),一个弹出层内容管理组件(实现多个内容层的管理,组件名:master.vue)。
- 弹出层嵌入内部组件
使用vue的component组件实现,他可以完美支持。
弹出层按钮支持回调
在master.vue中实现,详细解析此代码
- comps:内部组件的集合
- realIndex:一个computed属性,读取props的mIndex属性,表示内部层的zIndex层级关系。
- component加载组件
- btns:表示按钮的集合,现还不支持组件独立配置按钮列表。
- style:此方法用于生成内部组件居中的css代码。
js代码:
function getclientPoint () {
return {
width: document.documentElement.clientWidth || document.body.clientWidth,height: document.documentElement.clientHeight || document.body.clientHeight
}
}
export default {
name: 'HDialog',data () {
return {
comps: []
}
},props: {
'btns': {
type: Array,default: function () {
return [{ text: 'ok',value: 'ok'},{ text: 'cancel',value: 'cancel'}]
}
},'mIndex': {
type: Number,default: 19861016
}
},computed: {
realIndex: function () {
return this.mIndex
}
},components: {
hDialogBack
},methods: {
open: function (comp) {
comp.promise = new Promise(function (resolve,reject) {
comp.resolve = resolve
comp.reject = reject
})
comp.width = comp.width || 600
comp.height = comp.height || 400
this.comps.push(comp)
if (!this.$refs.back.show) {
this.$refs.back.open()
}
return comp.promise
},clickHandler: function (type,index) {
let self = this
let close = function () {
self.comps.splice(index,1)
if (self.comps.length === 0 && self.$refs.back.show) {
self.$refs.back.close()
}
}
/* 只提供promise模式 /
comp.resolve({'type': type,'close': close})
},style: function (index,comp) {
let point = getclientPoint()
return {
zIndex: this.realIndex + index,width: comp.width + 'px',height: comp.height + 'px',left: ((point.width - comp.width) / 2) + 'px',top: ((point.height - comp.height) / 2) + 'px'
}
}
}
}
- open方法,用于打开弹出层,且返回一个Promise。
- 嵌入background.vue组件,用于提供背景层。
- clickHandler方法:master.vue组件按钮的事件响应函数,会resolve在open方法中提供的promise。
css代码:
如何实用
- 首先需要在顶层引入master.vue,然后嵌入到与app组件平级,如下代码: