Vue3 备忘条:把子组件“一键重启”的 3 行代码
·
场景
写了个 <Chart/> 子组件,里面套了 ECharts,画完图之后把实例存进了 let myChart = echarts.init(...)。
父组件里切换时间范围时,图死活不更新,因为 myChart 只在 onMounted 里初始化了一次。
不想把逻辑搬出来,就想让子组件“从头再来”。
口诀
“改 key 等于重启”
代码(最简可运行)
Parent.vue
<template>
<!-- 1. 给子组件一个 key -->
<Chart :key="chartKey" :range="range"/>
<button @click="reset">刷新图表</button>
</template>
<script setup>
import { ref } from 'vue'
import Chart from './Chart.vue'
const range = ref('today')
const chartKey = ref(0) // 2. 声明响应式 key
function reset() {
range.value = 'week' // 数据也顺便换
chartKey.value++ // 3. 自增 → 组件销毁+重建
}
</script>
Chart.vue(子组件不用改任何代码)
<template>
<div ref="box" style="width: 100%;height: 300px;"></div>
</template>
<script setup>
import { onMounted, ref } from 'vue'
import * as echarts from 'echarts'
const props = defineProps(['range'])
const box = ref()
onMounted(() => {
const myChart = echarts.init(box.value)
myChart.setOption({
title: { text: 'Range: ' + props.range },
series: [{ type: 'line', data: [5, 20, 36, 10, 10, 20] }]
})
})
</script>
要点
-
key变化 ⇒ Vue 把旧组件干掉,全新setup()跑一次。 -
不用
forceUpdate,不用v-if来回切换。 -
如果子组件内部还有异步数据,记得在
onMounted里重新拉取即可。
总结
“记不住生命周期?给子组件加把钥匙:key++ 就完事。”
更多推荐

所有评论(0)