-
使用
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
饼图。
- 在子组件中,使用
- 步骤一:在父组件中提供数据和刷新方法