在动态表格中使用el-popver实现类似与el-select

碰见的问题:

1.使用el-popover的trigger="manual"手动激活导致弹框卡顿;最终使用trigger="click"激活;但页面设置disable时点击之后弹框依旧会弹出,可使用css进行隐藏,修改el-popover的样式不能写在scoped里面;解决方法如下

<style>
.disable_popover[x-placement^='bottom']{
  display: none;
}
</style>

2.我的页面是dialog弹框,滚动时,el-popover会固定住不跟随页面滚动,解决方法如下:

注:因为是在table表格中进行使用,所以在绑定ref时要加上下标让其唯一

 (1).进入页面监听页面的滚动事件

   document.addEventListener('scroll', this.handleScroll, true)

   // 解决popover组件可以跟随滚动条进行滚动
    handleScroll () {
      if (this.$refs['popover' + this.currentPopoverIndex]) {
        this.$refs['popover' + this.currentPopoverIndex].updatePopper()
      }
    },

(2).关闭弹框页面销毁监听

 document.removeEventListener('scroll', this.handleScroll, true)

3.表格如果有被固定列,el-popover会弹出多个,查找了很多解决方法,目前暂未解决,我这里将固定列取消了


(1)布局

 <el-form
      :model="dataForm"
      size="mini"
      ref="dataForm"
      v-loading="loading"
      :label-width="$i18n.locale === 'en-US' ? '120px' : '80px'"
      style="padding:0 30px"
    >
 <el-table
          :data="dataForm.teamSkxqDTOList"
          border
          style="width: 850px;margin-left:25px;margin-bottom:20px;border-radius:3px"
          height="350px"
          size="mini"
        >
  <el-table-column
            prop
            label="本校社团教师"
            align="center"
            :min-width="500"
          >
            <template slot-scope="scope">
             //使用el-select
              <el-form-item v-if="loginType !== '2'">
                <el-select
                  v-model="scope.row.skjsArr"
                  placeholder="请选择教师"
                  style="width:450px; max-width: initial;text-align:left"
                  filterable
                  multiple
                  size="mini"
                  @change="changeSKLS(scope.$index)"
                >
                  <el-option
                    size="mini"
                    v-for="item in sklsList"
                    :key="item.id+scope.$index"
                    :label="
                      item.realName +
                        (item.mobile && item.mobile !== ''
                          ? '(' + item.mobile + ')'
                          : '')
                    "
                    :value="{ value: item.id, label: item.realName }"
                  >
                  </el-option>
                </el-select>
              </el-form-item>
             //使用el-popover(原因:解决企业微信通讯录姓名展示)
              <el-form-item v-if="loginType === '2'">
                <!-- 下拉框 -->
                <div class="div_popover_style">
                  <el-popover
                    placement="bottom"
                    width="400"
                    trigger="click"
                    :popper-class="disabled?'disable_popover':''"
                     :ref="'popover'+scope.$index"
                  >
                    <div class="el-popper_style">
                      <div
                        v-for="(ele, index) in moreObj.data"
                        :key="index + 'list'"
                        @click.stop="selectItem(ele, scope.$index)"
                        :class="ele.state ? 'select_skls_ok' : 'select_skls_no'"
                      >
                        <ww-open-data type="userName" :openid="ele.realName"></ww-open-data>
                        {{
                          ele.mobile && ele.mobile !== ""
                            ? "(" + ele.mobile + ")"
                            : ""
                        }}
                      </div>
                    </div>
                    <!-- 显示框 -->
                    <div
                      @click="!disabled? openPopover(scope.row, scope.$index):''"
                      :class="[
                        'div_input_style',
                        disabled ? 'disabled_div_input_style' : '',
                      ]"
                      slot="reference"
                    >
                      <div
                        v-for="(item, index) in scope.row.skjsArr"
                        :key="index + 'js'"
                        @click.stop
                      >
                        <ww-open-data type="userName" :openid="item.realName"></ww-open-data>
                        {{
                          item.mobile && item.mobile !== ""
                            ? "(" + item.mobile + ")"
                            : ""
                        }}
                        <span
                          class="el-icon-error"
                          v-if="!disabled"
                          @click.stop="deleteItem(item, scope.row, index)"
                        ></span>
                      </div>
                    </div>
                  </el-popover>
                </div>
              </el-form-item>
            </template>
          </el-table-column>
<el-table>
</el-form>

(2)js

methods:{
init(){
   document.addEventListener('scroll', this.handleScroll, true)
},
 openPopover (item, index) {
      this.currentPopoverIndex = index
      this.moreObj.data = []
      this.moreObj.data = JSON.parse(JSON.stringify(this.sklsList))
      if (item.skjsArr.length > 0) {
        this.moreObj.data.forEach((ele) => {
          item.skjsArr.forEach((v) => {
            if (ele.id === v.id) {
              ele.state = true
            }
          })
        })
      }
},
   selectItem (item, index) {
      item.state = !item.state
      let arr = this.moreObj.data.filter((ele) => ele.state)
      this.dataForm.teamSkxqDTOList[index].skjsArr = arr
    },
 deleteItem (item, row, index) {
      item.state = false
      row.skjsArr = row.skjsArr.filter((ele) => ele.state)
    },
 closeDialog () {
      this.visible = false
      document.removeEventListener('scroll', this.handleScroll, true)
    },
    // 解决popover组件可以跟随滚动条进行滚动
    handleScroll () {
      if (this.$refs['popover' + this.currentPopoverIndex]) {
        this.$refs['popover' + this.currentPopoverIndex].updatePopper()
      }
    },
}

(2)css样式

<style lang="scss" scoped>
/deep/ .el-select__tags {
  max-width: initial;
}
.div_input_style {
  min-height: 30px;
  width: 400px;
  border-radius: 4px;
  border: 1px solid #dcdfe6;
  background: #ffffff;
  display: flex;
  flex-wrap: wrap;
  > div {
    box-sizing: border-box;
    border-color: transparent;
    margin: 2px 0 2px 6px;
    background-color: #f0f2f5;
    height: 20px;
    line-height: 19px;
    padding: 0 5px;
    border-radius: 4px;
    color: #909399;
    font-size: 12px;
    flex-shrink: 0;
  }

  .el-icon-error {
    color: #c0c4cc;
    margin-left: 5px;
      cursor: pointer;
  }
}
.disabled_div_input_style {
  background-color: #f5f7fa;
  border-color: #e4e7ed;
  color: #c0c4cc;
  cursor: not-allowed;
}
.select_skls_ok,
.select_skls_no {
  height: 34px;
  line-height: 34px;
  cursor: pointer;
}
.select_skls_ok {
  color: #16ab9c;
  position: relative;
}
.el-popper_style {
  overflow: auto;
  max-height: 200px;
}
.select_skls_ok:hover,
.select_skls_no:hover {
  background-color: #f5f7fa;
}
.select_skls_ok::after {
  position: absolute;
  right: 20px;
  font-family: element-icons;
  content: "\E611";
  font-size: 12px;
  font-weight: 700;
  -webkit-font-smoothing: antialiased;
}

</style>

(4)效果:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
el-popover是element-plus组件库的一个弹出框组件。通过设置不同的触发方式(trigger)和位置(placements),我们可以实现在用户交互时弹出相应的内容。在引用的代码示例,el-popover组件被用于创建一个类似气泡提示的效果。当鼠标悬停在"小李"这个span元素上时,会弹出一个包含一些项目的列表的弹出框。点击列表项时,会调用handleClick方法,并执行this.$refs.gzwPopver.doClose()来关闭弹出框。另外,在引用的代码示例,el-popover组件被用于创建一个表格列的弹出框。当鼠标悬停在"详细信息"按钮上时,会弹出一个包含详细信息的弹出框。根据不同的需求,我们可以通过设置el-popover的属性和使用插槽来定制弹出框的样式和内容。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [关于Vue3的el-table嵌套el-popver弹出框](https://blog.csdn.net/m0_47814717/article/details/132359382)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [[element-ui] el-popver hover doClose 失效](https://blog.csdn.net/qq_14993591/article/details/126499248)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值