3

有一个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>
4

1 回答 1

7

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

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

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

当然,这selected是假设您要分配给label.

注意:this仅当您使用methodName() {}(原样)或声明方法时才会起作用methodName: function (){...。所以在声明 vue 方法时不要使用箭头函数,它们会弄乱你的this.


@使用( ) v-onnot绑定到事件: 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"。这就是你想要的。

在此处查看演示 JSFiddle


自动更新label_ vue-chartjs_BarChart

即使你是

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

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

所以解决办法是:

  • “克隆”datacollection
  • 更新label克隆的
  • 将克隆分配给this.datacollection

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

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

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

在此处查看此解决方案的有效DEMO CODESANDBOX(参见changeLabelAndReassign()方法BarChart.vue)。

于 2018-02-28T12:16:47.970 回答