el-select-v2 滚动选中选项之后会自动回滚到顶部

el-select-v2 组件使用问题

直接给 props 赋值会导致滚动后选中选项之后会回滚到顶部问题分析

在 Vue 和 Element Plus 的虚拟化选择器中,直接将对象字面量赋值给 :props 属性(如 :props="{ label: "name", value: "id" }")会导致每次选中选项后回滚到顶部,而使用预定义的对象(如 props)则不会出现这个问题。以下是详细分析:


1. 对象字面量的重新创建

当使用 :props="{ label: "name", value: "id" }" 时,每次组件重新渲染时,Vue 会重新创建一个新的对象。这会导致以下问题:

  • 对象引用变化 :虚拟化选择器会检测到 props 的变化(因为对象引用发生了变化),认为 props 是一个新的值。
  • 重新渲染选项列表:虚拟化选择器会重新渲染选项列表,导致滚动位置被重置到顶部。

2. 预定义对象的稳定性

当使用预定义的对象(如 config)时:

ts 复制代码
const props = {
    label: "name",
    value: "id",
};
  • 对象引用不变props 的引用在整个组件生命周期内保持稳定,Vue 不会认为 props 发生了变化。
  • 避免不必要的重新渲染:虚拟化选择器不会重新渲染选项列表,从而保留滚动位置。

3. 虚拟化组件的优化机制

虚拟化组件(如 el-select-v2)通常会根据 props 的变化来决定是否重新渲染选项列表:

  • 如果 props 的引用发生变化,组件会重新计算和渲染选项列表。
  • 如果 props 的引用保持不变,组件会复用现有的选项列表,避免滚动位置重置。

解决方案总结

  • 避免使用对象字面量 :直接使用对象字面量赋值给 :props 会导致每次渲染时创建新的对象,触发虚拟化组件的重新渲染。
  • 使用预定义对象 :通过定义一个稳定的对象(如 config),可以避免对象引用变化,从而避免滚动位置重置。

示例对比

有问题的代码:
vue 复制代码
<el-select-v2 :props="{ label: "name", value: "id" }" />
  • 每次渲染都会创建新的对象,导致滚动位置重置。
正确的代码:
vue 复制代码
<el-select-v2 :props="props" />
  • 使用稳定的对象引用,避免滚动位置重置。

根本原因

这种问题的根本原因是 Vue 的响应式机制和虚拟化组件的渲染逻辑共同作用导致的。通过优化 props 的赋值方式,可以有效解决问题。

相关推荐
韩曙亮5 天前
【Flutter】Flutter 组件 ④ ( 组件渲染 的 三棵树理论 | Widget 树 → Element 树 → RenderObject 树 )
flutter·element·widget·renderobject
风吹夏回13 天前
Vue3 + Element Plus 完整使用指南
前端·javascript·vue.js·element
zhedream16 天前
十万级列表的跨页多选方案:el-table 踩坑与治理实践
vue.js·element
前端尤雨西2 个月前
ElementPlus 源码之 packages 目录
前端·element
梓言2 个月前
解决 Element Plus 中 Tooltip 样式影响全局菜单(Menu)及宽度控制失效的完美方案
前端·css·element
忆琳2 个月前
Vue3 优雅解决单引号注入问题:自定义指令 + 全局插件双方案
vue.js·element
忆琳2 个月前
Vue3 全局自动大写转换:一个配置,全站生效
javascript·element
猪八宅百炼成仙3 个月前
解决 el-date-picker type:daterange 在 layout 布局中的宽度问题
前端·element
lemon_yyds3 个月前
vue 2 升级vue3 : element ui 校验红色高亮失去效果
前端·element
爱分享的鱼鱼6 个月前
前端密码验证详解:Vue3+Element Plus 方案/纯血Vue 3 方案:从语法解析到实战实现
vue.js·element