一、需求背景
最近在做需求的时候,发现切换列表的时候,页面会默认跳转到网页的中间部分,但是我的列表是在下面的位置,这就需要用户切换列表后,再手动滑下去🤔 用户体验并不友好。具体表现如下:


==虽然不是什么大问题,体验上总怪怪的
二、原因定位
最后原因是代码上el-table加了key,因为产品prd是用el-radio-group模拟了el-tabs的切换功能,所以列表的数据是要动态加载的,又要维持默认的排序,所以给el-table加上了key。让表格重新渲染来恢复默认的排序规则,拿到正确的数据。。。
less
<el-table
:key='riskLevel' //注意这个key
:data="list"
border
:defaultSort="{ order: 'descending', prop: 'alterDeviceTotal' }"
@sort-change="onSortChange"
>
如果去掉key,影响就是切换radio的地区后,排序没能更新。
所以优化上,通过添加ref来操作表格元素,用户切换radio后,清除现有排序、再恢复默认排序规则即可,这样组件不会重新渲染,只是数据上的调整,页面就不会跳到中间去了。
ini
<div class="area-table">
<div class="table-header">
<el-radio-group v-model="areaLevel" @change="handleAreaLevelChange">
<el-radio v-for="item in areaLevelOptions" :key="item.value" :label="item.value">
{{ item.label }}
</el-radio>
</el-radio-group>
</div>
<el-table
ref="tableRef"
:data="list"
border
:defaultSort="{ order: 'descending', prop: 'alterDeviceTotal' }"
@sort-change="onSortChange"
>
<el-table-column
v-for="column in tableColumns"
:key="column.prop"
:prop="column.prop"
:label="column.label"
:width="column.width"
:minWidth="column.minWidth"
:sortable="column.sortable"
>
<template #default="{ row }">
<span v-if="column.prop === 'rate'">{{ row.rate }}%</span>
</template>
</el-table-column>
</el-table>
<Paginations
:totalCount="pages.totalCount"
:pageNumber="pages.pageNumber"
:pageSize="pages.pageSize"
@load-more="onPaginationsChange"
/>
</div>
ref清除排序&添加默认排序
javascript
// 处理区域级别变化-重置表格排序状态并设置默认排序
const handleAreaLevelChange = (value) => {
tableRef.value.clearSort();
tableRef.value.sort('alterDeviceTotal', 'descending'); // 手动设置默认排序状态-会触发onSortChange去重新获取数据
};
也就是一个思路吧,看看滚动异常的时候 是不是因为表格加了key