当使用element-plus的el-select的filterable时控制台出现Maximum recursive updates exceeded in component <ElSelect>. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.
的报错,出现此问题的前提是el-select渲染的数据量较大,少量数据是没有此问题
使用filter-method写了自定义筛选方法虽然能解决此问题,但是选中筛选项时,回显较慢,有无其他解决方式
在Element-Plus中,当使用el-select组件并且启用filterable特性时,特别是在处理大量数据时,如果组件内部因为某种原因陷入无限循环更新状态,就可能出现“Maximum recursive updates exceeded”的错误提示。这通常是因为在数据变更过程中,Vue.js检测到了状态的非预期递归更改。
针对这个问题,除了使用filter-method自定义筛选方法之外,还有几个优化和解决方案可以考虑:
避免不必要的计算和状态更新:
在数据加载完成后一次性处理好筛选逻辑,尽量减少每次用户输入时的计算负担。
如果数据量大,可以考虑使用虚拟滚动(virtual-scroll)功能,只渲染可视区域内的选项,从而减轻DOM的压力和响应速度。
节流或防抖处理用户输入:
当用户在输入框中快速输入时,可以使用Vue的debounce或throttle函数包装监听事件,减缓触发筛选的频率。
局部状态管理:
可以考虑在el-select组件的范围内建立一个局部状态来暂存筛选条件,避免直接修改父组件传递过来的大规模数据源。
优化filter-method:
对于自定义筛选方法,确保它在执行时不会引起额外的状态变化,而是直接基于输入和现有数据生成筛选结果。
如果回显较慢是因为在选中后重新检索整个数据集,那么可以尝试缓存已经匹配过的选项,仅在必要时刷新。
懒加载与分页:
如果数据是从远程接口获取,可以考虑在用户输入时进行懒加载或分页请求,只请求当前筛选条件下的数据子集。
使用计算属性或watch配合nextTick:
在某些情况下,可能需要在Vue实例的下一个生命周期钩子内更新状态,可以使用this.$nextTick()来确保在DOM更新后再进行状态变更,避免立即更新引起的无限循环。