Home > database >  v-select display different item-text on clicking drop down
v-select display different item-text on clicking drop down

Time:05-19

The question is related to v-select and specifically on how I can show different value when a drop down is clicked. Below is my code and I've a drop down with country & code info. When a dropdown is selected, I would like the 'country' value to be displayed (eg., Austria ( 43) but a value is selected, I'd like the 'code' value to be displayed (eg., 43 instead of Austria ( 43)). How do I change this? I tried using 'onchange' event but couldn't figure out. Any guidance is appreciated.

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <script src="https://cdn.tailwindcss.com"></script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/babel-polyfill/dist/polyfill.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vuetify.min.js"></script>
    <link
      rel="stylesheet"
      href="https://cdn.jsdelivr.net/npm/@mdi/[email protected]/css/materialdesignicons.min.css"
    />
    <link
      rel="stylesheet"
      type="text/css"
      href="https://cdn.jsdelivr.net/npm/[email protected]/dist/vuetify.min.css"
    />
  </head>
  <body>
    <div id="app">
      <v-app id="inspire">
        <v-content>
          <v-container fluid >
            <v-row no-gutters >
              <v-col cols="2" sm="1" md="2" lg="1" xl="1"> </v-col>
              <v-col align-self="center" cols="2" sm="1" md="2" lg="1" xl="1">
                <v-select
                  
                  v-model="selectedCountry"
                  :items="countryList"
                  item-text="country"
                  item-value="code"
                  return-object
                  single-line
                  v-on:change="countryChange"
                ></v-select>
              </v-col>
              <v-col align-self="center">
                <v-text-field
                  
                  length="10"
                  filled
                  rounded
                ></v-text-field>
              </v-col>
            </v-row>
          </v-container>
        </v-content>
      </v-app>
    </div>

    <script>
      new Vue({
        el: "#app",
        vuetify: new Vuetify(),
        data() {
          return {
            selectedCountry: { country: "United States ( 1)", code: " 1" },
            countryList: [
              { country: "United States ( 1)", code: " 1" },
              { country: "Canada ( 1)", code: " 1c" },
              { country: "Australia ( 61)", code: " 61" },
              { country: "Austria ( 43)", code: " 43" },
              { country: "Belgium ( 32)", code: " 32" },
              { country: "Bulgaria ( 359)", code: " 359" },
              { country: "Croatia ( 385)", code: " 385" },
              { country: "Cyprus ( 357)", code: " 357" },
              { country: "Czech Republic ( 420)", code: " 420" },
              { country: "Denmark ( 45)", code: " 45" },
              { country: "Estonia ( 372)", code: " 372" },
              { country: "Finland ( 358)", code: " 358" },
              { country: "France ( 33)", code: " 33" },
              { country: "Germany ( 49)", code: " 49" },
              { country: "Greece ( 30)", code: " 30" },
              { country: "Hungary ( 36)", code: " 36" },
              { country: "Ireland ( 353)", code: " 353" },
              { country: "Italy ( 39)", code: " 39" },
              { country: "Latvia ( 371)", code: " 371" },
              { country: "Lithuania ( 370)", code: " 370" },
              { country: "Luxembourg ( 352)", code: " 352" },
              { country: "Malta ( 356)", code: " 356" },
              { country: "Mexico ( 52)", code: " 52" },
              { country: "Netherlands ( 31)", code: " 31" },
              { country: "New Zealand ( 64)", code: " 64" },
              { country: "Poland ( 48)", code: " 48" },
              { country: "Portugal ( 351)", code: " 351" },
              { country: "Romania ( 40)", code: " 40" },
              { country: "Singapore ( 65)", code: " 65" },
              { country: "Slovakia ( 421)", code: " 421" },
              { country: "Slovenia ( 386)", code: " 386" },
              { country: "South Africa ( 27)", code: " 27" },
              { country: "Spain ( 34)", code: " 34" },
              { country: "Sweden ( 46)", code: " 46" },
              { country: "United Kingdom ( 44)", code: " 44" },
              { country: "Other ( 0)", code: " 0" }
            ],
          };
        },
        methods: {
          countryChange(o) {
            console.log(this);
            console.log(this.$el.outerText);
            console.log(o.code);
            console.log(o.country);
            console.log(o);
          },
        },
        computed: {},
        beforeMount() {},
      });
    </script>
  </body>
</html>

CodePudding user response:

You are using vuetify v-select component. It takes array of strings or array of objects like what you are using in code above.

item-text prop takes the property to display. item-value takes property to return as a value when the option is selected. You are using return-object as well which will return the whole object instead of the item-value

Finally to show 43 instead of Austria ( 43) you have to change item-text to code instead of country Like this item-text="code"

CodePudding user response:

You can achieve this with one workaround, In the dropdown you can show the code and on select you can show the country as a hint by using :hint keyword and vice versa.

Demo :

new Vue({
  el: '#app',
  vuetify: new Vuetify(),
  data: () => ({
    countryList: [
              { country: "United States ( 1)", code: " 1" },
              { country: "Canada ( 1)", code: " 1c" },
              { country: "Australia ( 61)", code: " 61" },
              { country: "Austria ( 43)", code: " 43" },
              { country: "Belgium ( 32)", code: " 32" },
              { country: "Bulgaria ( 359)", code: " 359" },
              { country: "Croatia ( 385)", code: " 385" },
              { country: "Cyprus ( 357)", code: " 357" },
              { country: "Czech Republic ( 420)", code: " 420" },
              { country: "Denmark ( 45)", code: " 45" },
              { country: "Estonia ( 372)", code: " 372" },
              { country: "Finland ( 358)", code: " 358" },
              { country: "France ( 33)", code: " 33" },
              { country: "Germany ( 49)", code: " 49" },
              { country: "Greece ( 30)", code: " 30" },
              { country: "Hungary ( 36)", code: " 36" },
              { country: "Ireland ( 353)", code: " 353" },
              { country: "Italy ( 39)", code: " 39" },
              { country: "Latvia ( 371)", code: " 371" },
              { country: "Lithuania ( 370)", code: " 370" },
              { country: "Luxembourg ( 352)", code: " 352" },
              { country: "Malta ( 356)", code: " 356" },
              { country: "Mexico ( 52)", code: " 52" },
              { country: "Netherlands ( 31)", code: " 31" },
              { country: "New Zealand ( 64)", code: " 64" },
              { country: "Poland ( 48)", code: " 48" },
              { country: "Portugal ( 351)", code: " 351" },
              { country: "Romania ( 40)", code: " 40" },
              { country: "Singapore ( 65)", code: " 65" },
              { country: "Slovakia ( 421)", code: " 421" },
              { country: "Slovenia ( 386)", code: " 386" },
              { country: "South Africa ( 27)", code: " 27" },
              { country: "Spain ( 34)", code: " 34" },
              { country: "Sweden ( 46)", code: " 46" },
              { country: "United Kingdom ( 44)", code: " 44" },
              { country: "Other ( 0)", code: " 0" }
            ],
    selectedCountry: null
  }),
})
<script src="https://unpkg.com/[email protected]/dist/vue.js"></script>
<script src="https://unpkg.com/[email protected]/dist/vuetify.min.js"></script>
<link rel="stylesheet" href="https://unpkg.com/[email protected]/dist/vuetify.min.css"/>
<div id="app">
  <v-app id="inspire">
    <v-container fluid>
          <v-select
            :items="countryList"
            v-model="selectedCountry"
            label="Select Country Code"
            item-text="code"
            return-object
            :hint="selectedCountry?.country.split('(')[0].trim()"
            outlined
          ></v-select>
    </v-container>
  </v-app>
</div>

  • Related