微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Vue调用另一个组件文件方法

如何解决Vue调用另一个组件文件方法

我得到了文件“ PieChart.vue”。另一方面,我还有另一个文件调用dashboard.vue,但无法调用PieChart.vue->“ genChart”函数。可以调用函数吗?我想刷新图表。这是因为Im使用了vuetify标签,但是vue chart js似乎无法在vuetify标签中呈现图表。需要重新渲染以显示图表。这种情况有解决方案吗?

PieChart.vue:

<script>
import { Pie } from "vue-chartjs";

export default {
    extends: Pie,name: "v-PieChart",props: {
        data: Array,label: Array,color: Array,},watch: {
        data: function (newData,oldData) {
            this.debouncedGenChart();
        },created: function () {
        this.debouncedGenChart = _.debounce(this.genChart,500);
    },methods: {
        genChart: function () {
            this.renderChart(
                {
                    labels: this.label,datasets: [
                        {
                            backgroundColor: this.color,data: this.data,],{ responsive: true,maintainAspectRatio: false }
            );
        },};
</script>

Dashboard.vue:

<v-tabs>
    <v-tab
        :href="`#tab-AM`"
        @click="$refs.leaveChartAM.genChart()"
    >AM</v-tab>
    <v-tab
        :href="`#tab-PM`"
        @click="$refs.leaveChartPM.genChart()"
    >PM</v-tab>
    <v-tab-item :value="'tab-AM'">
        <v-PieChart
            :data="charts.leave.data"
            :label="charts.leave.label"
            :color="['#00E676','#66BB6A','#AED581']"
            ref="leaveChartAM"
        ></v-PieChart>
    </v-tab-item>
    <v-tab-item :value="'tab-PM'">
        <v-PieChart
            :data="charts.leave.data"
            :label="charts.leave.label"
            :color="['#00E676','#AED581']"
            ref="leaveChartPM"
        ></v-PieChart>
    </v-tab-item>
</v-tabs>

解决方法

您可以实现一个自定义事件,以在组件之间调用函数。我已经说明了可以用来绑定事件和调用函数的两种方法。

方法1


保留Vue的单独实例,仅注册自定义事件。将其分配给窗口,以便可以从eveywhere进行访问

// Initiate
window.Notifier = new Vue();

// Bind event
window.Notifier.$on('regenPieChartMethod1',function(message){
    //code block
});

// Call event from any component
window.Notifier.$emit('regenPieChartMethod1',message);

方法2


将事件绑定到父组件,以便可以从子组件对其进行访问

// Bind event
this.$parent.$on('regenPieChartMethod2',function(message){
    //code block
});

// Call event from child component
this.$parent.$emit('regenPieChartMethod2',message);

您可以使用适合您实施的任何选项

完整解决方案

// Use a seperate Vue instance only for event
window.Notifier = new Vue();

Vue.component('dashboard',{
  methods: {
  
    callRegenPieChartMethod1 () {
    
      var message = 'Pie Chart data is regenerated using method 1';
        window.Notifier.$emit('regenPieChartMethod1',message);
    },callRegenPieChartMethod2 () {
    
      var message = 'Pie Chart data is regenerated using method 2';
      this.$parent.$emit('regenPieChartMethod2',message);
    }
  },template: '<div><h4>Dashboard Component</h4><button @click="callRegenPieChartMethod1">Refresh Pie Chart - Method 1</button> <button @click="callRegenPieChartMethod2">Refresh Pie Chart - Method 2</button></div>',});


Vue.component('piechart',{
  data() {
    return {
      message: 'This is initial data of the pie chart!'
    };
  },mounted() {
    var _t = this;
    
    // use seperate Vue instance to bind event
    window.Notifier.$on('regenPieChartMethod1',function(message){
        _t.genChart(message);
    });
    
    // bind event to the parent
    this.$parent.$on('regenPieChartMethod2',function(message){
        _t.genChart(message);
    });
  },methods: {
    genChart (message) {
      this.message = message;
    }
  },template: '<div><h4>Pie Chart Component</h4> <p>Message : {{message}}</p></div>',});

new Vue({
  el: '#app',});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
  <dashboard></dashboard>
  <piechart></piechart>
</div>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。