Search code examples
apivue.jsvue-select

VueJS - How can i use the response of API in vue-select


I want to use the response coming from the API in v-select. Here is a scenario i want to use the API call from component A to component B, rather than calling it again in the component B.

Component A:

methods: {
      forVselect (id) {
          this.$http.get(`/type/${id}`)
            .then((res) => {
              this.icecream = res.data})
            .catch((e) => {console.log(e)})
        }
      },
    mounted (){
      this.forVselect (this.$route.params.un_id)
    }

Component B:

<template>
  <div class="The V-select">
    <vselect v-model="input1" :options="[{label: 'Vanilla' , value: 'vanilla'}]" :dir="$vs.rtl ? 'rtl' : 'ltr'" />
  </div>
</template>

<script>
import vselect from 'vue-select'
...
input1: null,
icecream: null
...
methods: {
  forVselect (id) {
      this.$http.get(`/type/${id}`)
        .then((res) => {
          this.icecream = res.data})
        .catch((e) => {console.log(e)})
    }
  },
mounted (){
  this.forVselect (this.$route.params.un_id)
}
</script>
  1. As you can see my Component B i have hard coded as 'vanilla' in v-select, rather i want to use the data coming from the API, i want to know how it can be done.

Here is my Api response:

[

      {
        "id": 3,
        "flavor": "vanilla",
        "price": "150",
        "taste": "super",
        "cream": "high",
        "investments": null,
      },
      {
        "id": 8,
        "flavor": "chocolate",
        "price": "250",
        "taste": "super high",
        "cream": "fantastic",
        "investments": "too high",
      } 

      ...
]
  1. Please do help me. I tried just by using label: type.flavor but nothing was displayed. And in order to make code effective i want to use the response coming from API call made in component A

Solution

  • use just have to add a variable at the place of option as shown below:

    <template>
      <div class="The V-select">
        <vselect v-model="input1" :options="icecream" :dir="$vs.rtl ? 'rtl' : 'ltr'" />
      </div>
    </template>
    
    <script>
    import vselect from 'vue-select'
    ...
    input1: null,
    icecream: null
    ...
    methods: {
      forVselect (id) {
          this.$http.get(`/type/${id}`)
            .then((res) => {
              this.icecream = res.data})
            .catch((e) => {console.log(e)})
        }
      },
    mounted (){
      this.forVselect (this.$route.params.un_id)
    }
    </script>
    

    and also you need modify your api response... response like:

    [
    
          {
            "id": 3,
            "flavor": "vanilla",
            "price": "150",
            "taste": "super",
            "cream": "high",
            "investments": null,
            "label": "Vanilla" ,
            "value": "vanilla"
          },
          {
            "id": 8,
            "flavor": "chocolate",
            "price": "250",
            "taste": "super high",
            "cream": "fantastic",
            "investments": "too high",
            "label": "Chocolate" ,
            "value": "chocolate"
          } 
    
          ...
    ]
    

    you need to modify response like that from server side or client side when response received...

    If you don't want to modify your json response so atleat you need to add 2 additional key which is label & value key so that you can use...