最近项目中屡次用到了Popover弹出框,在使用时,也遇到了一些坑,好比如何控制显示和隐藏,及在表格数据中如何针对当条数据进行显示和隐藏,因此对Popover相关知识作了一个总结。javascript
Popover 有四种激活方式,主要支持四种触发方式:hover,click,focus 和 manual,经过trigger属性用于设置什么时候触发 Popover。触发方式主要分为两种:使用 slot="reference" 的具名插槽,或使用自定义指令v-popover指向 Popover 的索引ref。vue
<el-popover
placement="top-start"
title="标题"
width="200"
trigger="hover"
content="这是hover 激活。"
>
<el-button slot="reference">hover 激活</el-button>
</el-popover>
<el-popover
placement="bottom"
title="标题"
width="200"
trigger="click"
content="这是click 激活。"
>
<el-button slot="reference">click 激活</el-button>
</el-popover>
<el-popover
placement="right"
title="标题"
width="200"
trigger="focus"
content="这是focus 激活"
>
<el-button slot="reference">focus 激活</el-button>
</el-popover>
<el-popover
placement="bottom"
title="标题"
width="200"
trigger="manual"
content="这是一段内容,这是一段内容,这是一段内容,这是一段内容。"
v-model="visible"
>
<el-button
slot="reference"
@click="visible = !visible"
>手动激活</el-button>
</el-popover>
复制代码
<el-popover
ref="popover-hover"
placement="top-start"
title="标题"
width="200"
trigger="hover"
content="这是hover 激活。"
>
</el-popover>
<el-button v-popover:popover-hover>hover 激活</el-button>
<el-popover
ref="popover-click"
placement="bottom"
title="标题"
width="200"
trigger="click"
content="这是click 激活。"
>
</el-popover>
<el-button v-popover:popover-click>click 激活</el-button>
<el-popover
ref="popover-focus"
placement="right"
title="标题"
width="200"
trigger="focus"
content="focus 激活"
>
</el-popover>
<el-button v-popover:popover-focus>focus 激活</el-button>
<el-popover
ref="popover"
placement="bottom"
title="标题"
width="200"
trigger="manual"
content="这是一段内容,这是一段内容,这是一段内容,这是一段内容。"
v-model="visible"
>
</el-popover>
<el-button
v-popover:popover
@click="visible = !visible"
>手动激活</el-button>
复制代码
能够在 Popover 中嵌套多种类型信息,如下为嵌套表格的例子。java
<el-popover
placement="right"
width="400"
trigger="click"
v-model="visible"
>
<el-table :data="gridData">
<el-table-column
width="150"
property="date"
label="日期"
></el-table-column>
<el-table-column
width="100"
property="name"
label="姓名"
></el-table-column>
</el-table>
<div style="text-align: right; margin: 0">
<el-button
size="mini"
type="text"
@click="visible = false"
>取消</el-button>
<el-button
type="primary"
size="mini"
@click="visible = false"
>肯定</el-button>
</div>
<el-button slot="reference">click 激活</el-button>
</el-popover>
复制代码
在实际项目中,Popover弹出框不单单是显示一下,在Popover弹出框弹出框中还会有许多其余的操做,操做完后,点击保存或取消,弹出框就应该随之隐藏。咱们先从简单的来看。ide
其实上面代码中,已经实现了一种较简单的弹出与隐藏。下面咱们看实例:测试
<el-popover
placement="right"
width="400"
trigger="manual"
v-model="visible"
>
<el-form
ref="form"
label-position="top"
class="page-form"
style="margin-bottom: 80px;"
:model="form"
:rules="rules"
>
<el-form-item
label="车位名称"
prop="name"
>
<el-input
v-model.trim="form.name"
tips-placement="top-start"
>
</el-input>
</el-form-item>
<el-form-item
label="车位名称"
prop="name"
>
<el-input
v-model.trim="form.sex"
tips-placement="top-start"
>
</el-input>
</el-form-item>
</el-form>
<div style="text-align: right; margin: 0">
<el-button
size="mini"
type="text"
@click="visible = false"
>取消</el-button>
<el-button
type="primary"
size="mini"
@click="visible = false"
>肯定</el-button>
</div>
<el-button slot="reference">click 激活</el-button>
</el-popover>
复制代码
经过自定义显示与隐藏,能够解决单个按钮的显示与隐藏问题,下面咱们试试是否能够解决表格下的多条数据的后按钮的显示与隐藏功能。动画
<el-table :data="gridData">
<el-table-column
width="150"
property="date"
label="日期"
></el-table-column>
<el-table-column
width="100"
property="name"
label="姓名"
></el-table-column>
<el-table-column
label="操做"
width="120"
fixed="right"
>
<template slot-scope="scope">
<!-- 当资源为2~1000,不能显示操做按钮,且勾选禁用 -->
<el-popover
placement="right"
width="400"
trigger="manual"
v-model="visible"
>
<el-form
ref="form"
label-position="top"
class="page-form"
style="margin-bottom: 80px;"
:model="form"
>
<el-form-item
label="车位名称"
prop="name"
>
<el-input
v-model.trim="form.name"
tips-placement="top-start"
>
</el-input>
</el-form-item>
<el-form-item
label="车位名称"
prop="name"
>
<el-input
v-model.trim="form.sex"
tips-placement="top-start"
>
</el-input>
</el-form-item>
</el-form>
<div style="text-align: right; margin: 0">
<el-button
size="mini"
type="text"
@click="visible = false"
>取消</el-button>
<el-button
type="primary"
size="mini"
@click="visible = false"
>肯定</el-button>
</div>
<el-button
slot="reference"
@click="visible =!visible"
>click 激活</el-button>
</el-popover>
</template>
</el-table-column>
</el-table>
复制代码
<el-table :data="gridData">
<el-table-column
width="150"
property="date"
label="日期"
></el-table-column>
<el-table-column
width="100"
property="name"
label="姓名"
></el-table-column>
<el-table-column
label="操做"
width="120"
fixed="right"
>
<template slot-scope="scope">
<!-- 当资源为2~1000,不能显示操做按钮,且勾选禁用 -->
<el-popover
placement="top"
width="400"
trigger="manual"
:ref="refNamePopover + scope.row.id"
>
<el-form
ref="form"
label-position="top"
class="page-form"
style="margin-bottom: 80px;"
:model="form"
>
<el-form-item
label="车位名称"
prop="name"
>
<el-input
v-model.trim="form.name"
tips-placement="top-start"
>
</el-input>
</el-form-item>
<el-form-item
label="车位名称"
prop="name"
>
<el-input
v-model.trim="form.sex"
tips-placement="top-start"
>
</el-input>
</el-form-item>
</el-form>
<div style="text-align: center; margin: 0">
<el-button
size="mini"
type="text"
@click="cancleAction(scope.row.id)"
>取消</el-button>
</div>
<el-button
type="primary"
slot="reference"
size="mini"
@click="openAction(scope.row.id)"
>测试
</el-button>
</el-popover>
</template>
</el-table-column>
</el-table>
<script>
export default {
name: 'BasicTable',
data () {
return {
refNamePopover: 'popover-', // popover ref名称前缀
form: {
name: '',
sex: '',
data: ''
},
gridData: [{
date: '2016-05-02',
name: '哈哈',
id: '1'
}, {
date: '2016-05-04',
name: '哈哈',
id: '2'
}, {
date: '2016-05-01',
name: '哈哈',
id: '3'
}, {
date: '2016-05-03',
name: '哈哈',
id: '4'
}]
}
},
methods: {
cancleAction (id) {
let refName = this.refNamePopover + id
this.$refs[refName].doClose()
},
openAction (id) {
let refName = this.refNamePopover + id
this.$refs[refName].doShow()
}
}
}
</script>
复制代码
有博主提出,上测实例会出现多个弹框的状况,我试了下,的确是个问题。下面是这个问题的解决办法:ui
<el-table :data="gridData">
<el-table-column
label="操做"
width="120"
>
<template slot-scope="scope">
<!-- 当资源为2~1000,不能显示操做按钮,且勾选禁用 -->
<el-popover
:ref="refNamePopover + scope.row.id"
placement="left"
width="400"
trigger="click"
>
<el-form
ref="form"
label-position="top"
class="page-form"
style="margin-bottom: 80px;"
:model="form"
>
<el-form-item
label="车位名称"
prop="name"
>
<el-input
v-model.trim="form.name"
tips-placement="top-start"
>
</el-input>
</el-form-item>
<el-form-item
label="车位名称"
prop="name"
>
<el-input
v-model.trim="form.sex"
tips-placement="top-start"
>
</el-input>
</el-form-item>
</el-form>
<el-button
type="primary"
@click="cancleAction(scope.row.id)"
>取消</el-button>
<el-button
type="iconButton"
slot="reference"
:title="$t('vms.ui.device.edit')"
>
<i class="h-icon-edit"></i>
</el-button>
</el-popover>
</template>
</el-table-column>
</el-table>
复制代码
script里的内容不变,经过trigger="click",这样当点击下个按钮时,这个popover弹框就会被隐藏。这样就不会出现多个弹框的状况。一样点击取消时,也能够关闭弹框。注:当el-table-column中加入fixed="right"属性时,固定按钮在右侧,点击取消时就不能关闭弹框了,我也试了好久,解决办法还在研究中,但愿大牛知指导this