【问题标题】:Vuetify v-select with imageVuetify v-select with image
【发布时间】:2020-05-13 13:07:03
【问题描述】:

我正在使用 Vuetify v-select 组件:https://vuetifyjs.com/en/components/selects/

我想用这样的图像进行选择:

但是我没有在文档中找到任何东西

【问题讨论】:

    标签: vue.js vuetify.js v-select


    【解决方案1】:

    你必须使用物品栏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

    【讨论】:

    • 我更新了答案,现在又可以了 :)
    • 值得注意的是,它必须是一个名为item的变量,并且它不能被修改,因为它取决于v-selectitems属性。所以模板中的内部变量没有自定义命名是不可能的。例如,如果我有一个 :items="dogs" 列表,我无法发布 dog 实例,而必须使用 item 实例。
    【解决方案2】:

    您可以利用插槽将图像内容填充到选择中。我已经使用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"
          }
       ],
      }
    

    【讨论】:

    • 这不再起作用了。查看 codepen 示例,注意选择框中显示的值为[Object object]。知道如何解决这个问题吗?
    • i.stack.imgur.com/2pGBD.png 可以了,我刚刚截了个截图。
    • 兄弟,这很容易用 item-text="name" 属性修复。笔的想法是展示如何配置下拉菜单以放置国旗和国家名称。
    • 对不起,我刚刚添加了。 :)
    【解决方案3】:

    我自己使用 &lt;v-menu&gt; 而不是 &lt;v-select&gt; 实现的组件,所以 UI 方面看起来像所需的模拟,没有 &lt;v-select&gt; 的所有 UI(如底部边框、箭头、标签等...)

    简介:我被要求创建一个下拉选择器来更改语言。选择不同的国家/地区会导致使用相应的所选语言翻译网络应用程序

    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>
    

    上面模板的一些解释:

    使用&lt;v-menu&gt; 组件允许我们手动创建自己的 html 作为激活元素,在本示例中,我们希望显示一个国家的标志作为激活元素。

    &lt;v-list&gt; 中,我们将通过遍历语言列表手动创建下拉列表中的项目(在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元素的值更改应用程序的区域设置,以及指向代表国家/地区的图像的链接。也可以是 svg 的 base64,或标志字体的类名或其他。

    getIcon:计算将采用语言值(代码如enfr..)并遍历langs 中的所有语言并返回与给定值匹配的图像,以显示在下拉列表,并在 activator 元素中。

    setLang:一旦从下拉列表中注册了点击事件,更改语言的方法,触发此方法。当然,您将更改此方法以在项目中做任何您想做的事情。

    CSS(语言 sass):

    .lang-menu-item
      cursor: pointer
      &:hover
        background-color: var(--v-primaryBG-base)
    

    只是让列表看起来更好一点。背景颜色是我在项目中使用的变量,作为整个应用的默认背景。

    【讨论】:

      猜你喜欢
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 2020-02-10
      • 2020-07-20
      • 2019-02-05
      • 2020-08-16
      • 2019-08-01
      • 1970-01-01
      相关资源
      最近更新 更多