在vuetify的v-select组件上使用“禁用项目”的道具时,我遇到了问题。我正在尝试将其与文字选项一起使用。
以下是重现该问题的摘录:
在此示例中,我要禁用“ Buzz”选项。
Vue.use(Vuetify)
new Vue({
el: '#app',
data: () => ({
items: ['Foo', 'Bar', 'Fizz', 'Buzz'],
disabledItems: ['Buzz'],
})
})
<link href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/vuetify/1.5.14/vuetify.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.10/vue.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vuetify/1.5.14/vuetify.min.js"></script>
<div id="app">
<v-app id="inspire">
<v-container fluid grid-list-xl>
<v-layout wrap align-center>
<v-flex xs12 sm6 d-flex>
<v-select :items="items" :item-disabled="disabledItems" box label="Box style"></v-select>
</v-flex>
</v-layout>
</v-container>
</v-app>
</div>
<v-select :items="items" :item-disabled="disabledItems"></v-select>
...
items: ['Foo', 'Bar', 'Fizz', 'Buzz'],
disabledItems: ['Buzz'],
我确实意识到我可以像下面的示例那样使用非文字键值对:https://codepen.io/anon/pen/joyoaj,它可以工作。但是我宁愿不必编写包装器组件就可以将文字选项转换为键值,而不必解决此问题。
<v-select :items="items"></v-select>
...
items: [
{text: 'Foo', value: 'Foo'},
{text: 'Bar', value: 'Bar'},
{text: 'Fizz', value: 'Fizz'},
{text: 'Buzz', value: 'Buzz', disabled: true},
],
有人知道如何禁用文字值吗?
答案 0 :(得分:1)
您不能那样做,因为item-disabled
属性实际上用于其他用途。
来自docs:
item-disabled
默认值:disabled
类型:字符串|数组|功能设置项目的禁用值属性
因此item-disabled
仅指定对象上的哪个字段将被视为“禁用字段”。默认情况下,该字段为disabled
。
没有item-disabled
,您将拥有这样的对象:
items: [
{text: 'Foo', value: 'Foo'},
{text: 'Buzz', value: 'Buzz', disabled: true},
],
如果对象还具有其他“禁用属性”(例如customDisabled
),则使用item-disabled
prop这样:
<v-select :items="items" item-disabled="customDisabled"
// ...
items: [
{text: 'Foo', value: 'Foo'},
{text: 'Buzz', value: 'Buzz', customDisabled: true},
],
如果您需要保留字符串数组,则可以将项目映射到对象数组并将其传递:
<v-select :items="computedItems"
// ...
data: () => ({
items: ['Foo', 'Bar', 'Fizz', 'Buzz'],
disabledItems: ['Buzz'],
}),
computed: {
computedItems() {
return this.items.map(item => {
return {
text: item,
disabled: this.disabledItems.includes(item)
}
})
}
}
另外,如果嵌套了禁用字段,则可以传递数组以达到所需深度,例如:
:item-disabled="['meta', 'disabled']"
// ...
{
text: item,
meta: {
disabled: true
}
}
答案 1 :(得分:1)
一个实际的最小工作示例,每个项目都具有功能检查。
<v-select
:items="items"
item-text="name"
item-value="id"
:item-disabled="checkIsItemDisabled"
/>
<script>
data: function(){
return {
items: [
{id: 1, name: 'Foo'},
{id: 2, name: 'Bar'},
],
},
methods: {
checkIsItemDisabled(item) {
return (item.id === 1)
},
}
},
</script>
答案 2 :(得分:0)
在@Traxo的答案中添加功能选项:
<v-select :items="items" item-disabled="disableItem">
...
methods: {
disableItem(item) {
if (item.prop === this.anyOtherPropValue) {
return true;
}
return false;
},
},
是的,以防万一this.anyOtherPropValue更改