vue.js - 如何通过设置 v-model 来更新现有的 v-select?
问题描述
我一直在自学 Vue(成功有限),但遇到了以下问题。
我有两个,每个都有一个 v-model:
Select 1:
<v-select
class="pr-2"
:items="latteSizeList"
v-model="sizeid"
item-text="sizename"
item-value="id"
@change="updateAvailibleOz(), calculate(), togglesizeSelected()"
solo
>
</v-select>
Select 2:
<v-select
:items="shotsArray"
v-model="shotcount"
:value.sync="shotcount"
item-text="shotsAmountName"
item-value="shotsAmountAmount"
@change="calculate()"
solo
>
</v-select>
我想在调用函数 togglesizeSelected() 时更新第二个 v-select 的显示值。
methods: {
togglesizeSelected: function () {
this.shotcount= this.sizeList.filter( (item) => item.id.indexOf(this.sizeid) > -1)[0].latteshots;
console.log("Shots Count: " + this.shotcount)
},
}
变量正在更新并显示在控制台中。但我无法让显示的项目更新。我错过了什么?
解决方案
有趣的是我今天遇到了同样的问题:)
(如果控制台隐藏了解决方案,只需单击“整页”)
new Vue({
el: '#app',
vuetify: new Vuetify(),
data() {
return {
sizeid: null,
latteSizeList: [{
id: 0,
sizename: "Small",
latteshots: 5,
},
{
id: 1,
sizename: "Large",
latteshots: 10,
},
],
shotcount: null,
shotsArray: [{
shotsAmountName: "5 shots",
shotsAmount: 5,
},
{
shotsAmountName: "10 shots",
shotsAmount: 10,
},
],
}
},
methods: {
latteSizeListClickHandler(e) {
this.togglesizeSelected(e)
this.calculate()
},
togglesizeSelected({
latteshots
}) {
this.shotcount = this.shotsArray.find(({
shotsAmount
}) => shotsAmount === latteshots)
},
calculate() {
console.log('calculate executed')
}
},
})
<link href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/@mdi/font@4.x/css/materialdesignicons.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.min.css" rel="stylesheet">
<div id="app">
<v-app>
<v-main>
<v-container>
Select 1:
<v-select class="pr-2" :items="latteSizeList" v-model="sizeid" item-text="sizename" item-value="id" @change="(e) => latteSizeListClickHandler(e)" return-object solo>
</v-select>
Select 2:
<v-select :items="shotsArray" v-model="shotcount" item-text="shotsAmountName" item-value="shotsAmountAmount" solo>
</v-select>
</v-container>
</v-main>
</v-app>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.x/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.js"></script>
我的想法:
- 不要在模板中的处理程序上放置多个函数。而是创建一个“组合函数”,然后调用它。(一般来说,尽量让模板在 JS 代码方面尽可能简单。这只是个好建议。)
- 你必须
- 设置
v-select
返回整个对象不是value
唯一的。您可以通过添加return-object
到v-select
- 将对象作为参数传递给处理函数(
(e) => latteSizeListClickHandler(e)
->e
是参数) - 将 设置为
shotcount
中的对象,shotsArray
不仅是它的shotsAmount
:value.sync="shotcount"
从第二个中删除v-select
。.sync
用于其他东西(这是对子组件中发出的事件做出反应的简写语法)
瞧!作品v-select
!
用更短的方式:
return-object
第一次使用v-select
- 在 & 中找到对象
shotsArray
并设置shotcount
为该对象 - 删除
:value.sync
- 这搞砸了v-model
推荐阅读
- android - 如何使用kotlin协程在recycleview中显示和隐藏按钮并进行一些去抖动
- jhipster - 如何扩展 JHipster JDL
- reactjs - 响应媒体查询/使用 Shopify 显示的产品
- python - 从csv中选择几行并在python中绘制两列
- html - 按钮与文本框对齐
- angular - 如何从文件输入@angular/material 中获取文件名
- javascript - 我如何每隔几秒钟重复一次javascript函数?
- 3d - 跟随玩家旋转的摄像机
- android - Compose Appbar 重叠活动内容
- python - Django:使用循环内部的数据库条目预填充表单