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"
相同。这就是你想要的。
自动更新 vue-chartjs
的 BarChart
的 label
即使你是
- using the
reactiveProp
mixin;和
- 更改标签
图表未自动反映更改(标签未更改)。
我注意到发生这种情况是因为 图表仅对整个 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.vue
的changeLabelAndReassign()
方法)。
有一个 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"
相同。这就是你想要的。
自动更新 vue-chartjs
的 BarChart
的 label
即使你是
- using the
reactiveProp
mixin;和 - 更改标签
图表未自动反映更改(标签未更改)。
我注意到发生这种情况是因为 图表仅对整个 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.vue
的changeLabelAndReassign()
方法)。