Vue3+Element Plus,用el-table实现滚动并高亮特定行

在vue3中,当我们使用Element Plus中的el-table表格组件进行开发,想要实现点击或者某个操作后,表格中特定行的数据高亮并自动滚动到当前高亮行。

实现效果:

在这里插入图片描述

template代码

<template>
  <el-button type="primary" style="margin-bottom: 20px;" @click="scrollTo">滚动到Tom9并高亮</el-button>

  <el-table ref="tableEl" 
    :data="tableData" 
    border  
    style="width: 100%" 
    height="300px" 
    highlight-current-row
    :row-style="{ height: '40px' }">
    <el-table-column prop="date" label="Date" width="180" align="center" />
    <el-table-column prop="name" label="Name" width="180" align="center" />
    <el-table-column prop="address" label="Address" align="center" />
  </el-table>
</template>

关键代码:highlight-current-row
开启是否要高亮当前行,默认是关闭

关键代码:height=“300px”
给表格设置高度,让它带有滚动条

关键代码::row-style=“{ height: ‘40px’ }”
给每一行的表格设置高度,默认40px,经过我测试继续减小不会发生变化,最小就是40px。这里给了每一行高度是后续为了移动更好的定位。

script代码

<script setup lang="ts">
import { ref, nextTick } from 'vue'
const tableData = ref([
  {
    date: '2016-05-03',
    name: 'Tom1',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    date: '2016-05-02',
    name: 'Tom2',
    address: 'No. 189, Grove St, Los Angeles',
  },
  // 此处省略Tom3 ~ Tom14代码,自行补充即可......
  {
    date: '2016-05-01',
    name: 'Tom15',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    date: '2016-05-01',
    name: 'Tom16',
    address: 'No. 189, Grove St, Los Angeles',
  },
])
const tableEl = ref()

/** 设置高亮并滚动至当前行 */
const scrollTo = () => {
  const row = tableData.value.find(item => item.name === 'Tom9')
  const index = tableData.value.findIndex(item => item.name === 'Tom9')
  // 设置高亮
  tableEl.value.setCurrentRow(row)
  // 滚动至当前行
  nextTick(() => {
    tableEl.value.setScrollTop(40 * index)
  })
}
</script>

关键地方:
setCurrentRow:用于单选表格,设定某一行为选中行, 如果调用时不加参数,则会取消目前高亮行的选中状态。方法接受的是需要高亮行的数据对象
setScrollTop:设置垂直滚动位置。方法接受的是一个数字,即需要移动的高度。

这里使用了Element表格组件自带的API,利用上诉给表格每一行设定了40px高度,这里就只需查找到需要滚动到特定行的数组下标,两者相乘就可以得到想要移动的高度。

注意:setScrollTop方法必须在nextTick里面调用,否则可能会不生效

完整代码

<script setup lang="ts">
import { ref, nextTick } from 'vue'
const tableData = ref([
  {
    date: '2016-05-03',
    name: 'Tom1',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    date: '2016-05-02',
    name: 'Tom2',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    date: '2016-05-04',
    name: 'Tom3',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    date: '2016-05-01',
    name: 'Tom4',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    date: '2016-05-01',
    name: 'Tom5',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    date: '2016-05-01',
    name: 'Tom6',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    date: '2016-05-01',
    name: 'Tom7',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    date: '2016-05-01',
    name: 'Tom8',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    date: '2016-05-01',
    name: 'Tom9',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    date: '2016-05-01',
    name: 'Tom10',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    date: '2016-05-01',
    name: 'Tom11',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    date: '2016-05-01',
    name: 'Tom12',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    date: '2016-05-01',
    name: 'Tom13',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    date: '2016-05-01',
    name: 'Tom14',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    date: '2016-05-01',
    name: 'Tom15',
    address: 'No. 189, Grove St, Los Angeles',
  },
  {
    date: '2016-05-01',
    name: 'Tom16',
    address: 'No. 189, Grove St, Los Angeles',
  },
])
const tableEl = ref()

/** 设置高亮并滚动至当前行 */
const scrollTo = () => {
  const row = tableData.value.find(item => item.name === 'Tom9')
  const index = tableData.value.findIndex(item => item.name === 'Tom9')
  // 设置高亮
  tableEl.value.setCurrentRow(row)
  // 滚动至当前行
  nextTick(() => {
    tableEl.value.setScrollTop(40 * index)
  })
}
</script>

<template>
  <el-button type="primary" style="margin-bottom: 20px;" @click="scrollTo">滚动到Tom9并高亮</el-button>

  <el-table ref="tableEl" 
    :data="tableData" 
    border  
    style="width: 100%" 
    height="300px" 
    highlight-current-row
    :row-style="{ height: '40px' }">
    <el-table-column prop="date" label="Date" width="180" align="center" />
    <el-table-column prop="name" label="Name" width="180" align="center" />
    <el-table-column prop="address" label="Address" align="center" />
  </el-table>
</template>
### 实现 Element Plus 表格组件中的无限滚动 为了实现Element Plus 的 `el-table` 组件中实现无限滚动动态加载数据,可以采用监听滚动事件的方法来触发新数据的加载。具体来说,在表格底部接近视口时自动请求更多数据。 #### HTML 结构设置 确保在 Vue 组件模板部分定义好基础结构: ```html <template> <div style="height: 400px; overflow-y: scroll;"> <el-table :data="tableData" @scroll="handleScroll"> <!-- 定义表格列 --> <el-table-column prop="date" label="日期"></el-table-column> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="address" label="地址"></el-table-column> </el-table> </div> </template> ``` #### JavaScript 部分逻辑处理 接下来是在脚本部分编写相应的业务逻辑,包括初始化数据、滚动事件处理器以及模拟异步获取数据的过程。 ```javascript <script setup> import { ref, onMounted } from &#39;vue&#39;; let tableData = ref([]); // 存储显示的数据数组 const loading = ref(false); const hasMore = ref(true); // 模拟初始加载一部分数据 function fetchData(page) { return new Promise((resolve) => { setTimeout(() => { resolve(Array.from({ length: page * 10 }).map((_, index) => ({ date: `${page}-${index}`, name: `Tom ${page}-${index}`, address: `No.${page} Lake Park` }) )); }, 500); }); } async function loadData() { if (loading.value || !hasMore.value) return; loading.value = true; try { const newData = await fetchData(tableData.value.length / 10 + 1); if(newData.length === 0){ hasMore.value = false; } tableData.value.push(...newData); } catch(error) { console.error(&#39;Failed to fetch more data&#39;, error); } loading.value = false; } onMounted(async () => { await loadData(); }); function handleScroll(event) { const target = event.target; if ((target.scrollTop + target.clientHeight >= target.scrollHeight - 10) && !loading.value) { loadData(); // 当滚动到底部附近时调用loadData函数继续加载下一页的内容 } } </script> ``` 此代码片段展示了如何创建一个具有无限滚动特性的表格[^1]。每当用户向下滚动到接近表格末端时就会触发新的 API 请求以追加额外的数据条目至现有列表之中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值