vue中用父组件刷新子组件中echarts饼图中的数据
-
使用
props
和watch
属性(推荐方法)- 步骤一:在父组件中传递数据给子组件
- 首先在父组件的数据部分定义要传递给子组件的数据,例如一个名为
pieData
的数据。
data() { return { pieData: [ {name: '类别1', value: 30}, {name: '类别2', value: 50}, {name: '类别3', value: 20} ] }; }
- 然后在父组件的模板中,将数据通过自定义属性(
props
)传递给子组件。假设子组件标签名为PieChartComponent
。
<template> <div> <PieChartComponent :pieData="pieData"/> </div> </template> <script> import PieChartComponent from './PieChartComponent.vue'; export default { components: { PieChartComponent }, data() { // 上面定义的数据 } }; </script>
- 首先在父组件的数据部分定义要传递给子组件的数据,例如一个名为
- 步骤二:在子组件中接收数据并监听数据变化
- 在子组件中,通过
props
接收父组件传递的数据。
export default { props: { pieData: { type: Array, required: true } }, data() { return { chart: null }; }, mounted() { this.initChart(); }, methods: { initChart() { this.chart = echarts.init(this.$el); this.updateChart(); }, updateChart() { let option = { series: [ { type: 'pie', data: this.pieData } ] }; this.chart.setOption(option); } }, watch: { pieData(newData, oldData) { this.updateChart(); } } };
- 在
mounted
生命周期钩子中,调用initChart
方法初始化echarts
饼图。initChart
方法中先初始化echarts
实例(echarts.init(this.$el)
),然后调用updateChart
方法来设置饼图的初始选项。 - 定义
watch
属性来监听pieData
的变化。当父组件传递的pieData
数据发生变化时,watch
中的回调函数会被触发,然后调用updateChart
方法来更新饼图的数据。
- 在子组件中,通过
- 步骤一:在父组件中传递数据给子组件
-
使用
ref
属性和事件总线(Event Bus
)(适用于复杂场景)- 步骤一:创建事件总线
- 在一个单独的
JavaScript
文件(例如event - bus.js
)中创建事件总线。
import Vue from 'vue'; export const eventBus = new Vue();
- 在一个单独的
- 步骤二:在父组件中触发事件并使用
ref
引用子组件- 在父组件中,通过
import
引入事件总线。当需要刷新子组件数据时,触发一个自定义事件。
<template> <div> <button @click="refreshPieData">刷新饼图数据</button> <PieChartComponent ref="pieChart"/> </div> </template> <script> import PieChartComponent from './PieChartComponent.vue'; import {eventBus} from './event - bus.js'; export default { components: { PieChartComponent }, data() { return { newPieData: [ {name: '新类别1', value: 40}, {name: '新类别2', value: 40}, {name: '新类别3', value: 20} ] }; }, methods: { refreshPieData() { eventBus.$emit('refresh - pie - data', this.newPieData); } } }; </script>
- 在父组件中,通过
- 步骤三:在子组件中监听事件并更新数据
- 在子组件中,通过
mounted
生命周期钩子挂载事件监听器,监听父组件触发的refresh - pie - data
事件。
<script> import echarts from 'echarts'; export default { data() { return { chart: null, pieData: [ {name: '类别1', value: 30}, {name: '类别2', value: 50}, {name: '类别3', value: 20} ] }; }, mounted() { this.initChart(); this.$bus = this.$root.$children.find(child => child._uid === 0).$eventBus; this.$bus.$on('refresh - pie - data', (newData) => { this.pieData = newData; this.updateChart(); }); }, methods: { initChart() { this.chart = echarts.init(this.$el); this.updateChart(); }, updateChart() { let option = { series: [ { type: 'pie', data: this.pieData } ] }; this.chart.setOption(option); } } }; </script>
- 在
mounted
钩子中,先初始化echarts
饼图(initChart
方法),然后获取事件总线并监听refresh - pie - data
事件。当接收到事件后,更新pieData
数据并调用updateChart
方法来更新饼图。
- 在子组件中,通过
- 步骤一:创建事件总线
-
使用
provide
和inject
(高级用法)- 步骤一:在父组件中提供数据和刷新方法
- 在父组件中,使用
provide
选项来提供一个函数,用于刷新子组件的数据。
export default { data() { return { pieData: [ {name: '类别1', value: 30}, {name: '类别2', value: 50}, {name: '类别3', value: 20} ] }; }, provide() { return { refreshPieData: this.refreshPieData, pieData: this.pieData }; }, methods: { refreshPieData(newData) { this.pieData = newData; } } };
- 在父组件中,使用
- 步骤二:在子组件中注入数据和刷新方法并使用
- 在子组件中,使用
inject
选项来获取父组件提供的刷新方法和数据。
export default { inject: ['refreshPieData', 'pieData'], data() { return { chart: null }; }, mounted() { this.initChart(); }, methods: { initChart() { this.chart = echarts.init(this.$el); this.updateChart(); }, updateChart() { let option = { series: [ { type: 'pie', data: this.pieData } ] }; this.chart.setOption(option); } }, watch: { pieData(newData, oldData) { this.updateChart(); } } };
- 当父组件调用
refreshPieData
方法更新数据时,子组件通过watch
监听pieData
的变化来更新echarts
饼图。
- 在子组件中,使用
- 步骤一:在父组件中提供数据和刷新方法