Vue 3中使用Ref或Key强制组件重渲染的方案对比咨询
Vue 3中两种组件重渲染方案的对比与最优选择
方案1:通过Ref调用子组件内置刷新方法
- 实现逻辑:父组件通过
ref获取子网格组件实例,调用其内部的refreshGrid方法,最终触发DevExtreme网格的原生数据重载逻辑(仅执行API请求+网格局部DOM更新) - 优势:性能开销极低,仅针对网格数据进行更新,不会触发组件的销毁与重建,完全符合DevExtreme组件的设计预期,还能保留网格内部的用户状态(如筛选、排序、分页位置)
- 劣势:父子组件存在一定耦合性,父组件需要知晓子组件的内部方法名,代码的可维护性略有下降
方案2:通过修改Key强制组件重建
- 实现逻辑:给子组件绑定动态
:key,触发事件时更新key值,利用Vue的diff算法特性,销毁旧组件实例并创建全新实例,重新执行所有生命周期(包括API请求) - 问题:性能开销远大于方案1,组件销毁重建过程会涉及DOM清理、事件解绑、实例销毁、重新初始化、DOM挂载等一系列操作,尤其是子组件包含复杂嵌套或状态时,浪费非常明显;此外还会丢失网格的用户操作状态,影响体验
- 适用场景:仅适合组件状态完全不可复用、必须彻底重置的极端场景,绝非常规数据刷新的最优解
优化建议(针对方案1的耦合问题)
如果觉得直接调用子组件方法的耦合度太高,可以通过以下方式优化:
- 给子组件添加一个
refresh-triggerprops,父组件通过切换该props的状态(比如布尔值取反)触发子组件内部的刷新逻辑,避免直接操作子组件实例 - 使用Vue的
provide/inject机制,父组件提供刷新指令,子组件注入后监听执行刷新,进一步降低组件间的耦合
内容的提问来源于stack exchange,提问作者Nick Davies
相关产品推荐
相关产品推荐

