VueJs - 在方法之间传递变量

VueJs - Passing variables between methods

有一个 v-select 组件,在更改时我正在启动 fillData(selected),其中选择的是 v-model。我需要更新 datacollection.datasets.label 中的标签以进行更改。我该怎么做?

<script>
  import BarChart from './BarChart.js'
  import { mapGetters, mapActions } from "vuex";

  export default {
    name : "TestLegPerformance",
    components: {
      BarChart
    },
    data: () => ({   
      datacollection : {
          labels: ['Week-1','Week-2','Week-3'],
          datasets: [
            {
                label: '',
                backgroundColor: '#C58917',
                data: [40, 50, 20]
            }
          ]
        },
      selected: []

    }),
     computed: {
        ...mapGetters({
        planNames: "planNames"
        })
    },
    mounted () {
        this.getAllPlanNamesAction();
    },
    methods: {
      ...mapActions(["getAllPlanNamesAction"]), 
      fillData(selected){
          console.log(selected)
      },
    }
  }
</script>

在方法内部,您可以使用 this.

引用 data 属性

在你的情况下,你可以使用 this.datacollection.datasets.label 并分配给它:

methods: {
  // ...
  fillData(selected){
     this.datacollection.datasets[0].label = selected;
  },
}

当然,这里假设selected是你要分配给label的字符串。

注意: this 仅在您使用 methodName() {}(如您所愿)或 methodName: function (){... 声明方法时有效。所以 ,他们会搞砸你的 this


使用 @ (v-on) 而非 : v-bind)

绑定到事件

您的模板:

<v-select label="Select a Plan" :items="planNames" v-model="selected" single-line max-height="auto" :change="fillData(selected)" required >

要监听更改事件,请不要使用:

:change="fillData(selected)"

使用

@change="fillData"

不要发送参数(它会把事情搞砸)。 v-select 已经发给你了。

请注意将 : 替换为 @

首先,:v-bind 的别名。所以 :change="xyz"v-bind:change="xyz".

相同

第二个,@v-on的别名。所以 @change="xyz"v-on:change="xyz" 相同。这就是你想要的。

See demo JSFiddle here.


自动更新 vue-chartjsBarChartlabel

即使你是

图表未自动反映更改(标签未更改)。

我注意到发生这种情况是因为 图表仅对整个 datacollection 变化作出反应,而不对内部属性(如 label)作出反应。

所以解决方案是:

  • "clone"datacollection
  • 更新克隆label
  • 将克隆分配给 this.datacollection

并且图表会做出反应(标签更改会反映出来)。

因此,将您的 fillData 方法更改为以下内容:

fillData(selected){
    let collectionClone = Object.assign({}, this.datacollection);
    collectionClone.datasets[0].label = selected;
    this.datacollection = collectionClone;
},

检查here a working DEMO CODESANDBOX of this solution(参见BarChart.vuechangeLabelAndReassign()方法)。