基于Vue+element表格删除最后一页的最后一条数据后回显数据为空解决

博客主要讲述在Vue项目中,删除最后一页的最后一条数据时遇到的问题,即删除后页面为空且页码未更新。提出解决办法是判断当前删除的是否为最后一页的最后一条数据,若是则将当前页码减1再查询。还附上分页相关公式及索引计算的解释。

当我们在删除最后一页的最后一条数据时,我们想要的效果是回到上一页,查询处上一页的数据显示出来,当前页码变成上一页,而真正删除的时候显示出来是个空的,而且页码也还在当前页

这时我们就需要去判断当前删除的是否为最后一页的最后一条数据,如果是,我们删除后要将当前页码-1再查询,这样页码回到了上一页,查询出来的也是上一页的数据了,话不多说下面爷直接上代码:

// template模板
<el-table-column label="操作">
    <template slot-scope="scope">
    <el-button type="danger" @click="del(scope.row.id)">
        删除
    </el-button>
    </template>
</el-table-column>

// 删除方法:
async del(id) {
        // 调用接口根据id删除
        await deleteLexiconClassification({ id });
        // 判断当前删除的是否为最后一页的最后一个记录
        // 遍历词库列表
        this.repositoryCategoryList.forEach((item, index) => {
        // 如果当前id是要删除的id
        if (item.id === id) {
            // 判断规则:(当前页码-1)*页容量+要被删除项的索引+1===总条数 && 判断被删项索引是否为0 && 当前不是第一页
            if (
            (this.currentPage - 1) * this.pageSize + index + 1 ===
                this.total &&
            index === 0 &&
            this.currentPage > 1
            ) {
            // 如果是就将页码回到上一页
            this.currentPage--;
            }
        }
        });
        // 回显删除后的列表
        this.fetchRepositoryCategory();
}

这里顺带附上分页相关的公式,怕要用到时忘记怎么写:

1.判断当前是否为最后一页最后一个数据:

// 方法1(推荐):
// (页码-1)*页容量+当前操作的元素的索引+1 === 总条数(也就说明是最后一页中的记录) && 当前操作的元素的索引 === 0(也就说明是第一个记录)
if(this.currentPage - 1) * this.pageSize + index + 1 === this.total && index === 0){
    console.log(index,'是最后一页最后一个记录')
}


// 方法2:
// 先算出总页数 = 向上取整(总记录数/页容量)
const totalPage = Math.ceil(this.total/this.pageSize) 
// 当总页数 === 当前页码(也就是最后一页时) && 要操作的记录索引为0(也就是当前页的第一个的意思) && 当前页数据总条数===1(只有一个时)
if(totalPage === this.currentPage && index === 0 && this.list.length === 1){
    console.log(index,'是最后一页最后一个记录')
}

2.判断当前是否为最后一条数据:

// (页码-1)* 页容量 + 要操作的记录的索引 + 1 === 总条数
if(( this.currentPage - 1) * this.pageSize + index + 1 === this.total){
    console.log(index,'是最后一条记录');
}

相信有些小伙伴就有疑问了,为啥index要+1?因为索引比长度要小1,所以要判断数量是否等于总记录数就要+1来计算长度

<think>嗯,用户的问题是关于在Vue3中使用Element Plus实现表格固定高度并在获取数据后自动滚动。首先,我需要回忆一下Element Plus的表格组件有哪些相关属性可以控制高度。记得el-table有一个height属性,可以设置固定值或者百分比,这样表格就会固定高度并出现滚动条。 接下来,用户提到获取后台数据后自动滚动。这时候可能需要用JavaScript来控制滚动条的位置。比如,在数据加载完成后,使用scrollTo方法将表格内容滚动到指定位置。不过要注意的是,数据加载和DOM更新可能异步进行,所以需要在nextTick之后执行滚动操作,确保DOM已经更新。 另外,用户可能希望滚动到特定位置,比如底部或者某个特定行。如果是自动滚动到底部,可能需要计算表格内容的高度,然后设置scrollTop为那个值。或者用户可能有其他需求,比如保持滚动位置在切换页面时的状态,这时候可能需要结合sessionStorage来存储和恢复滚动位置,类似之前看到的引用中的方法。 还需要考虑组件生命周期的问题。比如,在获取数据的时候,可能是在mounted或者onMounted钩子中发起请求,然后在请求完成后的回调函数里执行滚动操作。如果使用Composition API,可能需要用到onMounted和ref来获取表格实例。 另外,表格固定高度后,如果数据过多,滚动条会自动出现,但有时候可能需要动态调整高度。比如根据窗口大小变化调整表格高度,这时候可能需要监听resize事件,但用户的问题中没有提到这个,可能暂时不需要考虑。 还有,用户可能遇到数据更新后滚动位置重置的问题。比如,当数据变化时,表格重新渲染,滚动条回到顶部。这时候需要保持原来的滚动位置,需要在数据更新前保存位置,更新后再恢复。但用户的问题是在获取数据后自动滚动,可能是指首次加载数据后滚动到某个位置,比如最新添加的数据在底部,需要滚动到底部显示。 总结一下,步骤应该是: 1. 使用el-table的height属性设置固定高度。 2. 在获取后台数据的异步操作完成后,使用nextTick确保DOM更新。 3. 获取表格的DOM元素,调用scrollTo方法滚动到指定位置。 可能遇到的问题包括如何获取表格的DOM元素,正确的时间点执行滚动,以及如何处理异步数据加载和DOM更新的时机。另外,如果表格有虚拟滚动或者分页的情况,可能需要不同的处理方式,但用户的问题中没有提到这些,暂时假设是普通表格。 还需要参考用户提供的引用内容,其中提到了在Vue Router中使用onBeforeRouteLeave和onActivated来保存和恢复滚动位置,这可能与用户的需求相关,比如在切换路由时保持表格的滚动位置。但用户当前的问题可能不需要路由相关的处理,不过可以借鉴sessionStorage的方法来存储滚动位置,在数据加载后恢复。 另外,用户引用的第二个内容是关于el-select下拉表格组件的回显问题,可能与表格数据的动态更新有关,但当前问题主要是固定高度和自动滚动,可能关系不大,但需要注意数据回显时的高度是否正确。 最后,确保代码示例正确使用Vue3的Composition API,比如使用ref获取表格实例,使用onMounted生命周期钩子,以及在获取数据后处理滚动逻辑。同时,样式部分可能需要调整,确保表格外部容器的高度正确,避免布局问题。</think>在Vue3中实现Element Plus表格固定高度与自动滚动,可通过以下步骤实现: ### 一、固定表格高度 1. **设置表格高度** 使用`el-table`的`height`属性直接设置固定像素值或响应式高度: ```vue <template> <el-table :data="tableData" height="400px" ref="tableRef" > <!-- 列定义 --> </el-table> </template> ``` 2. **容器高度控制(可选)** 若需要响应式高度,可用CSS定义外层容器: ```css .table-container { height: 60vh; overflow: hidden; } ``` ### 二、数据加载后自动滚动 1. **获取数据后触发滚动** 在异步请求完成后,通过`nextTick`确保DOM更新后执行滚动: ```ts import { ref, nextTick } from 'vue' const tableData = ref([]) const tableRef = ref() // 获取数据示例 const fetchData = async () => { const res = await api.getData() tableData.value = res.data nextTick(() => { const tableEl = tableRef.value.$el const scrollBody = tableEl.querySelector('.el-table__body-wrapper') if (scrollBody) { // 滚动到底部 scrollBody.scrollTop = scrollBody.scrollHeight // 或滚动到顶部 // scrollBody.scrollTo(0, 0) } }) } ``` ### 三、进阶场景:保持滚动位置 若需在路由跳转后返回时恢复滚动位置,可结合`sessionStorage`: ```ts import { onActivated } from 'vue' onActivated(() => { nextTick(() => { const savedPosition = sessionStorage.getItem('tableScrollPosition') if (savedPosition) { const scrollBody = tableRef.value.$el.querySelector('.el-table__body-wrapper') scrollBody.scrollTop = Number(savedPosition) } }) }) // 离开页面时保存位置 const saveScrollPosition = () => { const scrollBody = tableRef.value?.$el?.querySelector('.el-table__body-wrapper') if (scrollBody) { sessionStorage.setItem('tableScrollPosition', String(scrollBody.scrollTop)) } } ``` ### 四、完整示例 ```vue <script setup lang="ts"> import { ref, onMounted, nextTick } from 'vue' import { ElTable } from 'element-plus' const tableData = ref([]) const tableRef = ref<InstanceType<typeof ElTable>>() const fetchData = async () => { // 模拟异步请求 tableData.value = await new Promise(resolve => { setTimeout(() => resolve(Array.from({length: 50}, (_,i) => ({ id: i+1 }))), 500) }) nextTick(() => { const scrollBody = tableRef.value?.$el.querySelector('.el-table__body-wrapper') if (scrollBody) { scrollBody.scrollTo(0, 200) // 滚动到指定位置 } }) } onMounted(fetchData) </script> <template> <el-table :data="tableData" height="400px" ref="tableRef" border > <el-table-column prop="id" label="ID" /> <!-- 其他列 --> </el-table> </template> ```
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值