【问题标题】:VueJs - Passing variables between methodsVueJs - 在方法之间传递变量
【发布时间】:2018-08-08 04:53:30
【问题描述】:

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

【问题讨论】:

    标签: vue.js vuejs2 reactive vuetify.js vue-chartjs


    【解决方案1】:

    在方法内部,您可以使用this 引用data 属性。

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

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

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

    注意:this 仅在您使用 methodName() {}(原样)或 methodName: function (){... 声明方法时有效。所以don't use arrow functions when declaring vue methods,他们会搞砸你的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 事件,不要使用:

    :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-chartjslabelBarChart

    即使你是

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

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

    所以解决办法是:

    • “克隆”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()方法)。

    【讨论】:

    • 显示你的v-select
    • 谢谢,但标签仍然不会改变并反映在 UI 中
    • 看看演示 JSFiddle。在那个演示中,它反映了
    • 再次感谢,是的,当我将其直接放入 div 元素时,它会发生变化,但我正在尝试创建条形图,而我现在只是尝试根据选择更改名称。跨度>
    猜你喜欢
    • 2013-10-30
    • 1970-01-01
    • 2014-07-13
    • 2012-03-20
    • 2021-01-23
    • 2020-10-25
    相关资源
    最近更新 更多