我使用Vuetify v-select组件:https://vuetifyjs.com/en/components/selects/我想用这样的图像进行选择:
但我在文件里没找到任何东西
von4xj4u1#
您必须使用项目插槽https://vuetifyjs.com/en/components/selects/#api
<v-select :items="items" label="Standard"> <template v-slot:selection="{ item, index }"> <img :src="item.image">{{ item.name }} </template> <template v-slot:item="{ item }"> <img :src="item.image">{{ item.name }} </template> </v-select>
JS:
new Vue({ el: '#app', vuetify: new Vuetify(), data: () => ({ items: [ { name: 'Foo', image: 'https://www.gravatar.com/avatar/b17065ea1655f1e3283aac8d8fc16019?s=48&d=identicon&r=PG'}, { name: 'Bar', image: 'https://www.gravatar.com/avatar/b17065ea1655f1e3283aac8d8fc16019?s=48&d=identicon&r=PG'}, { name: 'Hoo', image: 'https://www.gravatar.com/avatar/b17065ea1655f1e3283aac8d8fc16019?s=48&d=identicon&r=PG'}, { name: 'Coo', image: 'https://www.gravatar.com/avatar/b17065ea1655f1e3283aac8d8fc16019?s=48&d=identicon&r=PG'}], }), })
JSFiddle:https://codepen.io/reijnemans/pen/vYNadMo?editors=1010
3xiyfsfu2#
您可以利用插槽来填充图像内容到选择。我使用https://emoji-css.afeld.me/来获取国家的国旗。请参阅Codepen示例:https://codepen.io/aaha/pen/ZEbRwpy?editors=1011我无法填写整个国家列表。这将是伟大的,如果你能填补它和分享,我也可以使用它的地方。:D个
<v-select v-model="select" :items="countries" label="Select" item-text="name" > <template v-slot:item="slotProps"> <i :class="['mr-2', 'em', slotProps.item.flag]"></i> {{slotProps.item.name}} </template> </v-select>
data: { select: null, countries: [ { name: "Andorra", flag: "em-flag-ad" }, { name: "Arab Emirates", flag: "em-flag-ae" }, { name: "Afghanistan", flag: "em-flag-af" }, { name: "Antigua & Barbuda", flag: "em-flag-ag" }, { name: "Albania", flag: "em-flag-al" }, { name: "Anguilla", flag: "em-flag-ai" } ], }
hyrbngr73#
我自己的组件实现使用了<v-menu>而不是<v-select>,因此UI方面看起来像是所需的模拟,没有<v-select>的所有UI(如底部边框,箭头,标签等)。简介:我被要求创建一个下拉选择器来在语言之间切换。选择其他国家/地区将导致使用相应的选定语言翻译Web应用程序TL;DR:工作笔:https://codepen.io/narxx/pen/JjRxjrQ(很抱歉添加了一些额外的样式,不知道为什么Vuetify的样式没有加载,它看起来真的很糟糕。在我的项目中,它看起来很棒-我保证!:))模板(T):
<v-menu>
<v-select>
<v-menu offset-y> <template v-slot:activator="{ on, attrs }"> <img style="width: 32px" class="d-block" :src="getIcon()" v-bind="attrs" v-on="on" /> </template> <v-list> <v-list-item v-for="(lang, index) in langs" :key="index" class="lang-menu-item" > <div class="d-flex align-center" @click="setLang(lang.value)"> <img style="width: 32px" :src="lang.iconSrc" class="mr-2 d-block"/> <span>{{ lang.text }}</span> </div> </v-list-item> </v-list> </v-menu>
关于上面模板的一些解释:使用<v-menu>组件允许我们手动创建自己的html作为激活器元素,在这个例子中,我们想显示一个国家的标志作为激活器元素。在<v-list>中,我们将通过迭代语言列表(在langs中-参见JS部分)手动创建JavaScript列表中的项目。JS:
<v-list>
langs
data () { return { selectedLang: this.$i18n.locale, langs: [ { value: 'en', text: 'English', iconSrc: require('../assets/flags/eng.svg') }, { value: 'fr', text: 'French', iconSrc: require('../assets/flags/fr.svg') }, ], } }, computed: { getIcon () { return (item) => { let image = item || this.selectedLang let iconSrc = null Object.keys(this.langs).forEach( (index) => { if (this.langs[index].value === image) { iconSrc = this.langs[index].iconSrc } }) return iconSrc } }, }, methods: { setLang(lang) { this.selectedLang = lang this.$i18n.locale = lang }, }
上面代码的一些解释selectedLang是我们在选择新语言时将更改的React变量。将默认为我们当前在i18n区域设置中的任何内容。langs:给定一个对象列表,其中包含语言名称(将打印在屏幕下拉列表中的文本),稍后将应用于i18n元素以更改应用程序的区域设置的值,以及表示国家的图像的链接。也可以是一个base64的svg,或者是标志字体的类名或者其他什么。getIcon:计算将接受一个语言值(代码如en或fr..)并遍历langs中的所有语言,并返回与要在搜索列表和激活器元素中显示的给定值匹配的图像。setLang:一旦从列表中注册了单击事件,就会触发此方法来更改语言。当然,你会改变这个方法,在你的项目中做任何你想做的事情。CSS(lang sass):
selectedLang
i18n
getIcon
en
fr
setLang
.lang-menu-item cursor: pointer &:hover background-color: var(--v-primaryBG-base)
把名单弄得好看点。背景颜色是我在项目中使用的变量,用于整个应用程序的默认背景。
9nvpjoqh4#
Vuetify 3.0.0更新
在Vuetify 3.0.0中有一个突破性的变化,这花费了我很多时间,因为它没有记录。在这个版本中,v-list-item不是用前面的方法生成的。你必须自己创造它。我认为这将很快得到解决,但在此之前,请使用此方法:
<v-select :items="mylist" item-title="name" item-value="id"> <template #item="{ item, props }"> <v-list-item v-bind="props"> <template #title> <span><img :src="item.raw.image" /> {{item.raw.name}}</span> </template> </v-list-item> </template> </v-select> data () { return { mylist: [ {id:0, image:"pic1.png", name:"Entry1"}, {id:1, image:"pic2.png", name:"Entry2"}, {id:2, image:"pic3.png", name:"Entry3"}, ] } }
4条答案
按热度按时间von4xj4u1#
您必须使用项目插槽https://vuetifyjs.com/en/components/selects/#api
JS:
JSFiddle:https://codepen.io/reijnemans/pen/vYNadMo?editors=1010
3xiyfsfu2#
您可以利用插槽来填充图像内容到选择。我使用https://emoji-css.afeld.me/来获取国家的国旗。
请参阅Codepen示例:https://codepen.io/aaha/pen/ZEbRwpy?editors=1011我无法填写整个国家列表。这将是伟大的,如果你能填补它和分享,我也可以使用它的地方。:D个
hyrbngr73#
我自己的组件实现使用了
<v-menu>
而不是<v-select>
,因此UI方面看起来像是所需的模拟,没有<v-select>
的所有UI(如底部边框,箭头,标签等)。简介:我被要求创建一个下拉选择器来在语言之间切换。选择其他国家/地区将导致使用相应的选定语言翻译Web应用程序
TL;DR:工作笔:https://codepen.io/narxx/pen/JjRxjrQ(很抱歉添加了一些额外的样式,不知道为什么Vuetify的样式没有加载,它看起来真的很糟糕。在我的项目中,它看起来很棒-我保证!:))
模板(T):
关于上面模板的一些解释:
使用
<v-menu>
组件允许我们手动创建自己的html作为激活器元素,在这个例子中,我们想显示一个国家的标志作为激活器元素。在
<v-list>
中,我们将通过迭代语言列表(在langs
中-参见JS部分)手动创建JavaScript列表中的项目。JS:
上面代码的一些解释
selectedLang
是我们在选择新语言时将更改的React变量。将默认为我们当前在i18n
区域设置中的任何内容。langs
:给定一个对象列表,其中包含语言名称(将打印在屏幕下拉列表中的文本),稍后将应用于i18n
元素以更改应用程序的区域设置的值,以及表示国家的图像的链接。也可以是一个base64的svg,或者是标志字体的类名或者其他什么。getIcon
:计算将接受一个语言值(代码如en
或fr
..)并遍历langs
中的所有语言,并返回与要在搜索列表和激活器元素中显示的给定值匹配的图像。setLang
:一旦从列表中注册了单击事件,就会触发此方法来更改语言。当然,你会改变这个方法,在你的项目中做任何你想做的事情。CSS(lang sass):
把名单弄得好看点。背景颜色是我在项目中使用的变量,用于整个应用程序的默认背景。
9nvpjoqh4#
Vuetify 3.0.0更新
在Vuetify 3.0.0中有一个突破性的变化,这花费了我很多时间,因为它没有记录。在这个版本中,v-list-item不是用前面的方法生成的。你必须自己创造它。我认为这将很快得到解决,但在此之前,请使用此方法: