vue.js - 重置 v-autocomplete 中的选择值,以便添加多个项目
问题描述
我正在创建一个应用程序,它有一个选择框来在一些模板数据之间进行选择。但是,用户应该能够多次选择相同的模板选项,并且每次选择模板时,屏幕中都会出现一个新的信息框。
我的问题是 v-autocomplete 组件不支持这种行为:我们可以选择一个选项(或多个选项),但不能两次选择相同的选项。
我想过做这样的事情:每次用户选择选项 A 时,信息框都会出现在下方,并且组件将重置为空选项。然后,用户可以再次选择选项A,当他选择它时,会出现另一个信息框,用户需要多少次。
我怎么能用 vue 做这样的事情?我没有找到任何默认情况下会执行此类操作的组件,所以我想我必须调整组件的行为,但我不知道从哪里开始。
我的模板:
<template>
<div class="select-wrapper" id="selectBox">
<v-autocomplete
class="select-input"
:items="items"
:name="label"
placeholder="select item"
solo
:value="value"
@change="$event => onChange($event, items)"
item-text="name"
item-value="value"
:required="required"
:rules="[
value =>
!required ||
!!value ||
"required"
]"
></v-autocomplete>
</div>
</template>
还有我的 Vue 代码:
<script lang="ts">
import { defineComponent } from "@vue/composition-api";
import Vue from "vue";
interface SelectItem {
name: string,
value: string
}
interface SelectBoxProps {
items: SelectItem[];
value: string;
onSelect: ({ target }: { target?: SelectItem }) => void;
hasResetSelection: boolean;
}
export default defineComponent({
name: "SelectBox",
props: {
label: String,
items: Array,
value: [String, Number],
onSelect: Function,
disabled: Boolean,
required: {
type: Boolean,
default: false
},
hasError: Boolean,
errorMessage: String,
hasResetSelection: {
type: Boolean,
default: false
}
},
directives: {
ClickOutside
},
setup({ onSelect, hasResetSelection }: SelectBoxProps) {
const onChange = (selectedValue: string, itemsArr: SelectItem[]) => {
const targetItem = itemsArr.find(i => i.value === selectedValue);
if (hasResetSelection) {
Vue.nextTick(() => {
console.log("onselect should reset value");
return onSelect({ target: { name: "", value: "" } });
});
}
return onSelect({ target: targetItem });
};
return {
onChange
};
}
});
</script>
这是我对Vue.nextTick的最后一次尝试,我已经尝试使用ref()调整组件,但效果不佳。你有什么建议吗?
解决方案
您可以使用另一个变量来保存autocomplete
组件的输入,如下所示:
var app = new Vue({
el: '#app',
vuetify: new Vuetify(),
data: {
items: [{ name : 'hello', value : 1 }, { name : 'world', value : 2 }],
value : null,
values : []
},
methods: {
onChange() {
this.values.push(this.value)
this.$nextTick(() => {
this.value = null
})
},
}
})
<link href="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.0"></script>
<script src="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.js"></script>
<div id="app">
<v-app>
<v-container>
Values : {{values}}
<v-autocomplete
:items="items"
placeholder="select item"
solo
v-model="value"
item-text="name"
item-value="value"
@change="onChange"
/>
</v-container>
</v-app>
</div>
推荐阅读
- python - 如何告诉张量流顺序无关紧要
- arrays - 将数组划分为嵌入页面 - Discord.JS
- python - 有没有办法在 Python 中设置特定于脚本的默认参数,这样您就不必每次都指定它?
- c# - Rust 插件:无法隐式转换类型
- java - 在 CVC4 中使用类型参数调用自定义数据类型的无参数构造函数
- .net-core - 在 GitHub 工作流中使用 Entity Framework Core 工具时出错
- c# - Elasticsearch 无法搜索字符串字段
- php - OpenCart 3 + Journal 3,从客人结帐中删除电子邮件字段?
- python - (Python) 尝试使用 Google Classroom API 访问课程作业时出现错误 401
- arrays - Excel:检查 2 个列表以查看它们是否包含值,并计算它们相互配对的次数