当前位置:首页 > VUE

vue实现表格拖动列宽

2026-01-07 06:04:29VUE

实现表格列宽拖动的核心思路

通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖动逻辑。在表头列分隔线处添加可拖拽区域,拖动时动态修改列的宽度。

基础HTML结构示例

<template>
  <table>
    <thead>
      <tr>
        <th v-for="(col, index) in columns" :key="index" :style="{ width: col.width + 'px' }">
          {{ col.title }}
          <div class="resize-handle" @mousedown="startResize(index, $event)"></div>
        </th>
      </tr>
    </thead>
    <tbody>
      <tr v-for="(row, rowIndex) in data" :key="rowIndex">
        <td v-for="(col, colIndex) in columns" :key="colIndex" :style="{ width: col.width + 'px' }">
          {{ row[col.key] }}
        </td>
      </tr>
    </tbody>
  </table>
</template>

CSS样式关键部分

.resize-handle {
  width: 5px;
  height: 100%;
  background: transparent;
  position: absolute;
  right: 0;
  top: 0;
  cursor: col-resize;
}

th {
  position: relative;
  user-select: none;
}

Vue组件实现逻辑

export default {
  data() {
    return {
      columns: [
        { title: '姓名', key: 'name', width: 150 },
        { title: '年龄', key: 'age', width: 100 },
        { title: '地址', key: 'address', width: 300 }
      ],
      data: [...],
      activeIndex: null,
      startX: 0,
      startWidth: 0
    }
  },
  methods: {
    startResize(index, e) {
      this.activeIndex = index
      this.startX = e.clientX
      this.startWidth = this.columns[index].width

      document.addEventListener('mousemove', this.handleResize)
      document.addEventListener('mouseup', this.stopResize)
    },
    handleResize(e) {
      if (this.activeIndex === null) return
      const deltaX = e.clientX - this.startX
      this.columns[this.activeIndex].width = Math.max(30, this.startWidth + deltaX)
    },
    stopResize() {
      this.activeIndex = null
      document.removeEventListener('mousemove', this.handleResize)
      document.removeEventListener('mouseup', this.stopResize)
    }
  }
}

性能优化建议

拖动过程中使用requestAnimationFrame优化渲染性能:

handleResize(e) {
  if (this.activeIndex === null) return

  window.requestAnimationFrame(() => {
    const deltaX = e.clientX - this.startX
    this.columns[this.activeIndex].width = Math.max(30, this.startWidth + deltaX)
  })
}

边界情况处理

添加最小宽度限制防止列过窄:

this.columns[this.activeIndex].width = Math.max(30, this.startWidth + deltaX)

完整组件示例

可复用的表格组件应接收columns和data作为props:

props: {
  columns: {
    type: Array,
    required: true
  },
  data: {
    type: Array,
    required: true
  }
}

注意事项

  1. 确保表头单元格设置position: relative
  2. 拖拽手柄需要绝对定位在列右侧
  3. 移除事件监听防止内存泄漏
  4. 考虑添加防抖处理高频resize事件
  5. 移动端需要额外处理touch事件

vue实现表格拖动列宽

标签: 拖动表格
分享给朋友:

相关文章

vue实现动态用户表格

vue实现动态用户表格

Vue 实现动态用户表格 数据准备与响应式绑定 在 Vue 中实现动态用户表格,需先定义响应式数据。通过 data 或 ref(Composition API)存储用户数据数组,确保数据变化能触发视图…

vue表格实现复选框

vue表格实现复选框

vue表格实现复选框 在Vue中实现表格复选框功能,可以通过以下方法完成: 方法一:使用el-table(Element UI) 安装Element UI后,在表格列中直接添加type="se…

vue 实现表格单选

vue 实现表格单选

实现表格单选的方法 在Vue中实现表格单选功能可以通过多种方式完成,以下是几种常见的实现方法: 使用v-model绑定选中项 通过v-model绑定一个变量来记录当前选中的行数据。当用户点击某一行…

css制作表格

css制作表格

使用HTML和CSS创建表格 HTML中的<table>元素用于创建表格,结合CSS可以调整样式。以下是一个基础示例: <table> <tr> &…

vue实现简单表格

vue实现简单表格

Vue 实现简单表格的方法 使用原生 HTML 表格 在 Vue 模板中可以直接使用 HTML 原生表格标签,通过 v-for 动态渲染数据: <template> <tabl…

使用vue实现表格

使用vue实现表格

使用 Vue 实现表格 在 Vue 中实现表格可以通过多种方式完成,以下是一个基于 Vue 3 的示例,展示如何动态渲染表格数据并支持基础功能(如排序、筛选)。 基础表格实现 通过 v-for 循环…