用图像验证 v-select
Vuetify v-select with image
我正在使用 Vuetify v-select 组件:https://vuetifyjs.com/en/components/selects/
我想用这样的图片制作 select :
但是我没有在文档中找到任何内容
你必须使用物品栏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>
<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
您可以利用插槽将图像内容填充到 select 上。我已经使用 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"
}
],
}
我自己的组件实现使用 <v-menu>
而不是 <v-select>
所以 UI-wise 它看起来像所需的模拟,没有 UI <v-select>
(如底部边框、箭头、标签等...)
简介:我被要求创建一个下拉选择器以在语言之间切换。选择不同的国家/地区将导致使用相应的所选语言翻译网络应用程序
TL;DR:工作笔:https://codepen.io/narxx/pen/JjRxjrQ
(很抱歉添加了一些额外的样式,不知道为什么 Vuetify 的样式没有加载而且看起来真的很糟糕。在我的项目中它看起来很棒 - 我保证!:))
模板:
<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 部分)。
JS:
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
是我们将在选择新语言时更改的反应变量。将默认为我们当前在 i18n
语言环境中拥有的任何内容。
langs
:给定包含语言名称的对象列表(下拉列表中将在屏幕上打印的文本),稍后将应用于 i18n
元素更改应用程序的区域设置,link 到代表国家/地区的图像。也可以是 svg 的 base64,或者 class 标志字体的名称等等。
getIcon
:计算将采用语言值(代码如 en
或 fr
..)并遍历 langs
和 [=63 中的所有语言=] 与给定值匹配的图像将显示在下拉列表和激活器元素中。
setLang
:在下拉列表中注册了点击事件后触发该方法来更改语言的方法。当然,您将更改此方法以在项目中执行任何操作。
CSS (lang sass):
.lang-menu-item
cursor: pointer
&:hover
background-color: var(--v-primaryBG-base)
让列表看起来更漂亮一点。背景颜色是我在项目中使用的变量,作为整个应用程序的默认背景。
我正在使用 Vuetify v-select 组件:https://vuetifyjs.com/en/components/selects/
我想用这样的图片制作 select :
但是我没有在文档中找到任何内容
你必须使用物品栏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>
<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
您可以利用插槽将图像内容填充到 select 上。我已经使用 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"
}
],
}
我自己的组件实现使用 <v-menu>
而不是 <v-select>
所以 UI-wise 它看起来像所需的模拟,没有 UI <v-select>
(如底部边框、箭头、标签等...)
简介:我被要求创建一个下拉选择器以在语言之间切换。选择不同的国家/地区将导致使用相应的所选语言翻译网络应用程序
TL;DR:工作笔:https://codepen.io/narxx/pen/JjRxjrQ (很抱歉添加了一些额外的样式,不知道为什么 Vuetify 的样式没有加载而且看起来真的很糟糕。在我的项目中它看起来很棒 - 我保证!:))
模板:
<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 部分)。
JS:
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
是我们将在选择新语言时更改的反应变量。将默认为我们当前在 i18n
语言环境中拥有的任何内容。
langs
:给定包含语言名称的对象列表(下拉列表中将在屏幕上打印的文本),稍后将应用于 i18n
元素更改应用程序的区域设置,link 到代表国家/地区的图像。也可以是 svg 的 base64,或者 class 标志字体的名称等等。
getIcon
:计算将采用语言值(代码如 en
或 fr
..)并遍历 langs
和 [=63 中的所有语言=] 与给定值匹配的图像将显示在下拉列表和激活器元素中。
setLang
:在下拉列表中注册了点击事件后触发该方法来更改语言的方法。当然,您将更改此方法以在项目中执行任何操作。
CSS (lang sass):
.lang-menu-item
cursor: pointer
&:hover
background-color: var(--v-primaryBG-base)
让列表看起来更漂亮一点。背景颜色是我在项目中使用的变量,作为整个应用程序的默认背景。