场景是这样的有一个公共列表组件他是通过hook来实现的接口数据啥的,但是我在某个地方需要用到了某个列表去详情页展示,需要动态变换id来切换数据,但是公共的组件不能实现
<xxxx-table
:columns="tableColumns"
:data="tableData"
:loading="tableLoading"
:pagination="false"
@page-change="pageChange"
@page-size-change="pageSizeChange"
/>
import commonTable from "@/hooks/commonTable";
const {
getTableData,
tableData,
tableLoading,
pageChange,
pageSizeChange,
handleSave,
handleDel
} = commonTable(`/api/xxxx/table`);
代码是这样的通过写死路径来用hook实现表格的一系列常见操作
但是某些场景需要传递一个id来获取数据也就是
commonTable(`/api/xxxx/数据ID/table`);
这个组件这么写就没考虑这个动态的事情,但是又只有一个地方用到了 所以在想怎么让他支持根据id变化来动态支持数据刷新,第一时间想到的是改组件写watch 去监听id,但是这样就需要去改组件改接口不能再用hook了,所以我去搜罗了怎么能让组件重新渲染
直接面向🤖gpt编程
🤖:【使用 key 强制重新渲染,通过更改组件的 key 属性来强制 Vue 重新渲染组件。当 key 变化时,Vue 会销毁并重新创建该组件实例】
其中我采取了变化key这一方案(简单迅速🤏) 因为我的组件仅限于展示数据而且只有一个所以我觉得key 问题不大;
<children :dataId=id :key=id/>
🤖:缺点 =>性能问题:
-
每次更改 key 时,Vue 会销毁并重新创建整个组件实例。这可能会引发性能问题,尤其是在组件内部有复杂逻辑或大量子组件时。
组件状态丢失: -
重新创建组件会导致组件的内部状态丢失。如果组件中有未保存的数据、表单输入或者其他临时状态,这些数据会在组件重新创建时丢失。
副作用和生命周期钩子: -
重新创建组件会重新触发组件的生命周期钩子(如 created、mounted 等)。如果这些钩子中有副作用(如发起网络请求),会导致这些操作重复执行,可能会引发不必要的负载。
🤖还提供了一些别的解决方案 例如:
- 使用 forceUpdate(不推荐)
虽然 Vue 3 没有直接暴露 forceUpdate 方法,但你可以通过使用组件的实例来强制更新组件。这通常不推荐,除非你有非常特定的需求。 - 使用 watchEffect/watch 重新获取数据
如果你只需要重新获取数据而不是完全重新渲染组件,可以使用 watchEffect 或 watch 来监听 customerId 的变化,并重新获取数据。 - 使用v-if
- 重新加载整个页面