Vue.component 点击 div盒子 外面区域控制隐藏

9 篇文章 0 订阅
4 篇文章 0 订阅

需求:选择审批意见(类似下拉框展示),可以删除单条数据

1.html页面

<select-audit-content v-model="auditContent" :act-id="actId"></select-audit-content>

2.js

/*
*   选择审批意见
*   actId 流程节点id
* */
Vue.component('selectAuditContent', {
    template: ''+
        '<div class="selectContent-box" :value="defaultValue" @click="handleBodyClick($event)">'+
            '<input class="selectContent-ipt" placeholder="常用语选择" v-model="defaultValue" @focus="focus" readonly="readonly" autocomplete="off" :style="showList ? s_ipt_focus : \'\'">'+
            '<div class="selectContent" v-show="showList">'+
                '<ul>'+
                    '<li v-for="item in contentList" @click="selectContent(item.auditOpinion)">' +
                        '<span class="selectContent-text">{{ item.auditOpinion }}</span>' +
                        '<a href="javascript:;" @click="removeContent(item.id)" class="selectContent-remove">删除</a>' +
                    '</li>'+

                    '<li v-if="contentList.length == 0" style="cursor:default;color:#626675; background-color: initial;">' +
                        '<span class="selectContent-text">--没有查到相关选项--</span>' +
                    '</li>'+
                '</ul>'+
            '</div>'+
            '<div style="clear: both;"></div>'+
        '</div>'+
      '',
    data:function() {
        return {
            defaultValue: null,
            showList: false,
            contentList: [],
            s_ipt_focus: {
                'border-radius': '10px 10px 0 0',
                'border-bottom': '0',
                'padding-bottom': '12px',
            }
        }
    },
    props:{
        actId:[String],
    },
    methods:{
        initContentList: function(){
        },
        //选择
        selectContent: function(auditOpinion){
            this.defaultValue = auditOpinion;
            this.showList = false; //隐藏列表
        },
        //移除
        removeContent: function(id){
        },
        focus: function (event) {
            //获取焦点时
            this.showList = true; //显示列表
        },
        handleBodyClick: function (event){
            // 点击div区域外的地方,隐藏列表
            //console.log(this.$refs.selectAuditContent.contains(event.target));
            if (!this.$el.contains(event.target)) {
                this.showList = false; //隐藏列表
            }
        },
    },
    mounted: function(){
        this.initContentList();

        //增加监听事件
        this.$nextTick(() => {
            //document.querySelector('body').addEventListener('click', this.handleBodyClick);
            document.addEventListener('click', this.handleBodyClick, true);

            //存在顶级
            if (top) {
                top.document.addEventListener('click', this.handleBodyClick, true);
            }
        })
    },
    beforeDestroy: function(){
        //销毁监听事件
        //document.querySelector('body').removeEventListener('click', this.handleBodyClick);
        document.removeEventListener('click', this.handleBodyClick, true);

        //存在顶级
        if (top) {
            top.document.removeEventListener('click', this.handleBodyClick, true);
        }
    },
    watch:{
        defaultValue: function (val) {
            // vue 原生的方法 return 出去
            this.$emit('input', val);
        },
        actId: function (val) {
            this.initContentList();
        }
    },
});

3.css样式


/* 选择审批意见 开始 */
.selectContent-box {
    width: 590px;
    overflow: auto !important;
}
.selectContent-box .selectContent-ipt {
    height: 38px;
    padding: 10px 0 10px 14px;
    width: 590px;
    background: transparent;
    outline: 0;
    -webkit-appearance: none;
    border: 2px solid #2bb7b4;
    border-radius: 10px;
}
.selectContent {
    height: auto;
    width: 590px;
    top: 38px;
    border-radius: 0 0 10px 10px;
    border: 2px solid #2bb7b4 !important;
    border-top: 0!important;
    box-shadow: none;
    z-index: 1;
    background: #ffffff;
    position: absolute;
}
.selectContent ul {
    margin: 0 14px 0;
    padding: 8px 0 7px;
    background: 0 0;
    border-top: 2px solid #f5f5f6;
}
.selectContent ul li {
    width: auto;
    padding: 0 8px 0 14px;
    position: relative;
    cursor: default;
    overflow: hidden;
    margin-left: -14px;
    margin-right: -14px;
    color: #626675;
    line-height: 28px;
    background: 0 0;
}
.selectContent ul li:hover{cursor:pointer;color:#315efb;text-decoration:none;background:#F1F3FD;}
.selectContent ul li a:hover{text-decoration: underline}
.selectContent .selectContent-text{
    width: 450px;
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 1;
    overflow: hidden;
    float: left;
}
.selectContent .selectContent-remove {
    right: 10px;
    position: absolute;
    color: #ff0000 !important;
    float: right;
}

/* 选择审批意见 结束 */

4.效果

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值