You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用get与computed获取值的差异及DataTable页面崩溃问题排查

问题原因及解决方案

问题原因

  1. getter版本的内存泄漏问题:
    每次点击更新数据时,父组件传递给子组件的props.data是新的数组引用,useVueTable配置中的get data()每次返回新数组,导致内部不断重复创建响应式监听和表格状态,旧的状态未被垃圾回收,内存占用随点击次数持续累积,最终引发页面崩溃。

  2. computed版本的视图不更新问题:
    错误地将computed对象直接赋值给useVueTable的data选项,useVueTable无法正确识别并追踪computed的响应式变化,因此即使props.data更新,视图也不会重新渲染。

解决方案

方案一:用ref配合watch管理数据源(解决内存泄漏)

在子组件中将props.data转为本地ref,通过watch监听props变化更新ref,再将ref传给useVueTable:

const props = withDefaults(defineProps<{
  columns: ColumnDef<TData, TValue>[]
  data: TData[],
  itemsPerPage?: number | undefined,
  showPagination?: boolean | undefined,
}>(), {
  showPagination: false
})

// 初始化本地数据ref
const tableData = ref([...props.data])

// 监听props.data变化,更新本地ref
watch(
  () => props.data,
  (newData) => {
    tableData.value = [...newData]
  },
  { deep: true }
)

// 将本地ref传给useVueTable
const table = useVueTable({
  columns: props.columns,
  data: tableData,
})

方案二:正确结合computed与getter(解决视图不更新+内存泄漏)

通过getter函数获取computed的值,让useVueTable正确追踪响应式变化:

const props = withDefaults(defineProps<{
  columns: ColumnDef<TData, TValue>[]
  data: TData[],
  itemsPerPage?: number | undefined,
  showPagination?: boolean | undefined,
}>(), {
  showPagination: false
})

const data = computed(() => props.data)

// 使用getter获取computed的值,确保响应式追踪正常
const table = useVueTable({
  columns: props.columns,
  get data() {
    return data.value
  },
})

额外注意事项

  • 确保父组件传递的columnsData是稳定的引用(比如定义为常量,而非每次渲染都重新创建数组),避免触发useVueTable不必要的重新初始化。
  • 若使用分页、排序等功能,需确保useVueTable的其他配置项(如pagination)也正确使用响应式处理,避免额外的内存问题。

内容的提问来源于stack exchange,提问作者cony

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 10:05:16