2021-05-31-element中table表hover显示隐藏表单的实现

本文介绍了如何使用Element UI在表格中,通过鼠标悬停事件控制列中显示或隐藏修改按钮。当内容长度超过16字节时,按钮位置调整并提供相应的修改功能。实现过程中涉及事件处理、内容长度判断及CSS定位技巧。
摘要由CSDN通过智能技术生成

需求: 实现鼠标悬停table中的某一列显示修改按钮,修改按钮跟随内容后间距8px,内容超过16字节显示…加上修改按钮,效果如下图

在这里插入图片描述

在这里插入图片描述
#思路:
1、 需要解决鼠标进入列的和离开列的事件控制修改按钮的显示和隐藏, 问题点=>怎样优雅地处理table表中的事件,不用直接操作dom去控制
2、 判断内容的字节数判断跟随的修改按钮的位置,问题点=>如果修改是放在内容中会占据行内元素的位置和长度,影响最终的位置,所以采取定位脱离文档流解决
html

<el-table
        :data="tableData"
        fixed
        v-loading="loading"
        @cell-mouse-enter="mouseEnterTable"   // element单元格hover进入触发,参数row, column, cell, event见官网
        @cell-mouse-leave="mouseLeaveTable"
        class="tableBox"
      >
        <el-table-column prop="shareName" :label="'备注名称'" width="179">
          <template slot-scope="scope">
            <div class="nameRow textover">
              <span :class="judgeLen(scope.row.shareName) < 16 ? 'rel': ''"
                >{{ scope.row.shareName}}
                <span
                  class="commedit"
                  v-if="scope.row.dis && judgeLen(scope.row.shareName) < 16"
                  @click="openObserverName(scope.row)"
                >
                  修改</span
                >
              </span>
              <span
                v-show="scope.row.dis && judgeLen(scope.row.shareName) >= 16"
                class="edit"
                @click="openObserverName(scope.row)"
                >修改</span
              >
            </div>
          </template>
        </el-table-column>
</el-table>

js

  // 对tableData数据进行处理每一条增加下面两个属性,行标识和控制显示隐藏的属性
     //item.rowIndex = index;
     //item.dis = false;   
 // 进入table,找到定位
    mouseEnterTable(row, column) {
      // 显示修改
      if (column.property === 'shareName') {
        this.tableData[row.rowIndex].dis = true;
      }
    },
   // 鼠标离开隐藏修改按钮
    mouseLeaveTable(row, column) {
      // 隐藏修改
      if (column.property === 'shareName') {
        this.tableData[row.rowIndex].dis = false;
      }
    },
      // 修改按钮的点击事件
    openObserverName(row) {
      this.observerRow = { ...row };
      this.dialogName = true;
    },
   // 计算内容的长度
    judgeLen(str) {
      let strlen = 0;
      for (let i = 0; i < str.length; i++) {
        if (str.charCodeAt(i) > 255) {
          strlen += 2; //如果是汉字,则字符串长度加2
        } else {
          strlen++;
        }
      }
      return strlen;
    },

scss

.nameRow {
  position: relative;
  padding-right: 25px;
  .edit {
    position: absolute;
    right: 0;
    top: 1px;
    cursor: pointer;
    font-size: 12px;
    color: #308af4;
    // vertical-align: bottom;
  }
  .commedit {
    position: absolute;
    top: 2px;
    right: -32px;
    font-size: 12px;
    line-height: 14px;
    color: #308af4;
    padding-left: 4px;
    cursor: pointer;
  }
}
.rel {
position: relative;
}

如有问题请请留言,欢迎交流

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
el-cascader-panel是一个基于Element UI的级联选择器组件,它可以让用户通过多个层级的面板来选择数据。在引用提到,el-cascader-panel增加了全选按钮,并覆写了级联面板宽度。在引用提到,可以通过initSelectedCodes方法来初始化勾选的资源。以下是一个el-cascader-panel的例子: ```html <template> <el-cascader-panel :options="options" :props="props" v-model="selectedValues" @change="handleChange" :show-all-levels="false" :check-strictly="true" :expand-trigger="expandTrigger" :clearable="clearable" :disabled="disabled" :filterable="filterable" :loading="loading" :placeholder="placeholder" :popper-class="popperClass" :render-format="renderFormat" :separator="separator" :size="size" :trigger="trigger" :value-format="valueFormat" :width="width" /> </template> <script> export default { data() { return { selectedValues: [], options: [ { value: 'zhinan', label: '指南', children: [ { value: 'shejiyuanze', label: '设计原则', children: [ { value: 'yizhi', label: '一致' }, { value: 'fankui', label: '反馈' }, { value: 'xiaolv', label: '效率' }, { value: 'kekong', label: '可控' } ] }, { value: 'daohang', label: '导航', children: [ { value: 'cexiangdaohang', label: '侧向导航' }, { value: 'dingbudaohang', label: '顶部导航' } ] } ] }, { value: 'zujian', label: '组件', children: [ { value: 'basic', label: 'Basic', children: [ { value: 'layout', label: 'Layout 布局' }, { value: 'color', label: 'Color 色彩' }, { value: 'typography', label: 'Typography 字体' }, { value: 'icon', label: 'Icon 图标' }, { value: 'button', label: 'Button 按钮' } ] }, { value: 'form', label: 'Form', children: [ { value: 'radio', label: 'Radio 单选框' }, { value: 'checkbox', label: 'Checkbox 多选框' }, { value: 'input', label: 'Input 输入框' }, { value: 'input-number', label: 'InputNumber 计数器' }, { value: 'select', label: 'Select 选择器' }, { value: 'cascader', label: 'Cascader 级联选择器' }, { value: 'switch', label: 'Switch 开关' }, { value: 'slider', label: 'Slider 滑块' }, { value: 'time-picker', label: 'TimePicker 时间选择器' }, { value: 'date-picker', label: 'DatePicker 日期选择器' }, { value: 'datetime-picker', label: 'DateTimePicker 日期时间选择器' }, { value: 'upload', label: 'Upload 上传' }, { value: 'rate', label: 'Rate 评分' }, { value: 'form', label: 'Form 表单' } ] }, { value: 'data', label: 'Data', children: [ { value: 'table', label: 'Table 格' }, { value: 'tag', label: 'Tag 标签' }, { value: 'progress', label: 'Progress 进度条' }, { value: 'tree', label: 'Tree 树形控件' }, { value: 'pagination', label: 'Pagination 分页' }, { value: 'badge', label: 'Badge 标记' } ] }, { value: 'notice', label: 'Notice', children: [ { value: 'alert', label: 'Alert 警告' }, { value: 'loading', label: 'Loading 加载' }, { value: 'message', label: 'Message 消息提示' }, { value: 'message-box', label: 'MessageBox 弹框' }, { value: 'notification', label: 'Notification 通知' } ] }, { value: 'navigation', label: 'Navigation', children: [ { value: 'menu', label: 'NavMenu 导航菜单' }, { value: 'tabs', label: 'Tabs 标签页' }, { value: 'breadcrumb', label: 'Breadcrumb 面包屑' }, { value: 'dropdown', label: 'Dropdown 下拉菜单' }, { value: 'steps', label: 'Steps 步骤条' } ] }, { value: 'others', label: 'Others', children: [ { value: 'dialog', label: 'Dialog 对话框' }, { value: 'tooltip', label: 'Tooltip 文字提示' }, { value: 'popover', label: 'Popover 弹出框' }, { value: 'card', label: 'Card 卡片' }, { value: 'carousel', label: 'Carousel 走马灯' }, { value: 'collapse', label: 'Collapse 折叠面板' } ] } ] } ], props: { value: 'value', label: 'label', children: 'children' }, expandTrigger: 'hover', clearable: true, disabled: false, filterable: false, loading: false, placeholder: '请选择', popperClass: '', renderFormat: labels => labels.join(' / '), separator: ' / ', size: '', trigger: 'click', valueFormat: 'value', width: '' } }, methods: { handleChange(value) { console.log(value) } } } </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值