【问题标题】:Child component not receiving props from parent after data is updated in parent在父组件中更新数据后,子组件未从父组件接收道具
【发布时间】:2019-12-09 15:29:53
【问题描述】:

我有一个名为Report.vue 的模板,在该模板中我还有一个名为dataSent:[] 的data() 属性。在所述模板中,我调用组件BarChart,我试图将dataSent 数组与更新元素(如dataSent[1,2,3,4,5...])传递给组件(条形图),以便它可以显示图形。但是,当我将 console.log 添加到 BarChart 时,它永远不会收到更新的道具。我怀疑它与事件有关,但由于我是新手,还没有完全理解它是如何工作的,想知道是否可以得到一些帮助

由于 dataSent:[] 被初始化为一个空数组,因此 BarChart 组件从一开始就没有显示任何内容,但随后,我创建了一个方法(在方法部分),称为 updateData() ,它显式地用 [12, 19, 3, 5, 2,8] 填充 dataSent。当然,我正在使用绑定到组件条形图(这个称为数据)的道具绑定到dataSent 数组。最后,在 html 部分,一个名为 GPSelect 的组件中的 @input 事件被认为是触发更改(更新 dataSent 数组),但是,如前所述,确实发生在父级(Report.vue)中,但不是在子组件(BarChart)中。

报告.vue

<v-flex lg4 sm12 xs12>
            <div class="selectOptions">
                <GPSelect 
                    @input="listSessions" 
                    v-model="programSelected" 
                    :items="programs" 
                    label="Programs" 
                    :disabled="programs === undefined || programs.length === 0" 
                />
            </div>
        </v-flex>

        <BarChart
                :label="label"
                :data="dataSent"
                :labels="labels"       
        />

data() {
        return {

            treatments: [],
            programs: [],
            programSelected: "",
            dataSent: [],
            label: "Number of sessions",
            labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange']
        }
    },

    methods: {

        async listSessions() {
         /*...some other sentences irrelevant */

            this.updateData();
        },

   updateData() {
            this.dataSent=[12, 19, 3, 5, 2,8];
            return this.dataSent;
        },

BarChart.vue

<template>
<div class="chart-container">
    <canvas id="barChart" ref="barChart">

    </canvas>
</div>
</template>

<script>
import Chart from "chart.js";

export default {

    props: {
        labels: Array,
        colors: Array,
        data: Array,
        label: ""
    },
    mounted() {

        this.displayChart();
    },
    methods: {
        displayChart() {
            console.log(this.data);
}

}

我希望 Barchart 的 console.log 显示从父组件 Report.vue 发送的更新后的数组(收到的this.data),但目前它显示的是[__ob__: Observer]

【问题讨论】:

  • 您是否尝试在data 内的BarChart 属性上添加watch?您提供的代码不会记录data 属性的新值,因为它只在mounted 中调用displayChart。 mounted 钩子只会在组件第一次渲染时被调用一次。 watch: { data () { console.log(this.data) } }

标签: vue.js events components updates vue-props


【解决方案1】:

条形图.vue

<template>
  <div class="chart-container">
    <canvas id="barChart" ref="barChart" />
  </div>
</template>

<script>
import Chart from "chart.js";

export default {
  props: {
    labels: Array,
    colors: Array,
    data: Array,
    label: ""
  },
  mounted() {
    this.displayChart();
  },
  watch: {
    'data': 'displayChart'
  },
  methods: {
    displayChart() {
      console.log(this.data);
    }
  }
}

试试这个:))

【讨论】:

  • 它成功了,谢谢,对于其他道具,我也必须这样做吗? `watch: { 'data': 'displayChart', 'label: 'displayChart' ....},
  • 方法displayChart()有什么作用?它是可以计算的吗?如果是,那么您可以编写一个计算属性。如果没有,您必须单独观看它们
猜你喜欢
  • 2020-10-02
  • 2021-02-09
  • 2019-09-08
  • 1970-01-01
  • 2019-02-17
  • 2019-08-30
  • 1970-01-01
  • 2020-09-01
  • 1970-01-01
相关资源
最近更新 更多