Element-UI的el-popover实现同一个popover重复使用多次(类似MessageBox)

Posted okfine

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Element-UI的el-popover实现同一个popover重复使用多次(类似MessageBox)相关的知识,希望对你有一定的参考价值。

由于el-popover与reference元素是一对一的绑定关系,当一个页面内有多处需要弹出类似的popover框时,如使用现有官方方案,就得每个弹出点都做一个<el-popover>。如果有10个弹出点,就要有10个相同的el-popover。虽然能实现,但对于强迫症来说,实在有点难接受。

当然这里说的都是带指向箭头、自动定位的popover,而不是那种固定位置的。

期望是:一个组件内不管有多少地方需要弹出popover,popover组件也只需要有一个,大家都调用同一个就行了。于是研究了源码,找到一个方案如下:

点击预览效果

然后,可以进一步提取为组件,这样用起来就更方便了:
点击预览效果

<html class="full">
<head>
    <!-- 引入样式 -->
    <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
    <!-- 引入组件库 -->
    <script src="https://unpkg.com/vue@2.6.13/dist/vue.js"></script>
    <script src="https://unpkg.com/element-ui/lib/index.js"></script>
</head>
<style>
    .full { height: 100%;width:100% }
</style>
<body class="full">
    <div id="app">
        <div>
            <popover-svc
                ref="pop1"
                placement="bottom-start"
                >
                <div>当前:{{curObj}}</div>
            </popover-svc>
            <a v-for="(obj,index) in objs" :key="obj" style="cursor:pointer"
            @click="e=> showPop(e, obj)">
                <i class="el-icon-aim aim-icon"></i>
                Pop{{obj}} 
            </a>
        </div>
    </div>
    <script>
        var Popover = ELEMENT.Popover

        //组件方式
        var popoverSvc = {
            extends: Popover,
            methods: {
                popBy(el) {
                    //先隐藏并销毁之前显示的
                    this.close()
                    this.doDestroy(true)
                    this.$nextTick(() => {
                        //显示新的
                        this.referenceElm = this.$refs.reference = el
                        this.showPopper = true
                        this.$emit(\'input\', true)
                    })
                },
                close() {
                    this.showPopper = false
                    this.$emit(\'input\', false)
                }
            },
        }


        new Vue({
            el:\'#app\',
            data() {
                return {
                    objs: [1,2,3,4,5],
                    curObj: \'\'
                }
            },
            methods:{
                showPop(e, obj){
                    this.curObj = obj
                    this.$refs.pop1.popBy(e.target)
                }
            },
            components: {
                popoverSvc: popoverSvc
            }
        });
    </script>
</body>
</html>

用下来暂没发现什么副作用,如有问题欢迎指正。

以上是关于Element-UI的el-popover实现同一个popover重复使用多次(类似MessageBox)的主要内容,如果未能解决你的问题,请参考以下文章

element-ui解决el-popover的边界重新计算元素位置的问题

element-ui Popover offset

elementui 里的 el-popover 第一次渲染不显示?

修改elementui的el-popover弹框的样式

element UI .el-popover 样式修改

element ui el-popover 样式修改不生效解决方法