Динамические параметры с помощью компонентов VueJS Bootstrap Select

Документация VueJS Bootstrap Form Select Component показывает параметры только для жестко закодированных значений.

В большинстве случаев вы будете работать с сайтом, где ваши параметры будут вызываться динамически. Я нашел ряд примеров, предполагающих, что ваши данные API соответствуют вашим параметрам, т. е. возвращают пару значение/текст. Но на самом деле, скорее всего, вы будете вызывать конечную точку, которая возвращает что-то вроде:

{"id":1,"name":"sm","full_name":"Small","deleted_at":null,"created_at":"2019-01-01-16:11:49","updated_at":"2019-01-01-16:11:49"}

Это общий ::all() из чего-то вроде laravel. Мы хотим перевести это в: {"value":"1",text":"sm"} и т. д., чтобы оно правильно загружалось в наши параметры.

Предполагая, что у вас есть работающий сайт с VueJS и VueBootstrap и серверным API, мы не будем вдаваться во все эти настройки и рассмотрим только этот конкретный случай.

Пример того, как все это будет работать (на данный момент с использованием жестко закодированных опций):

  1. Пример select — у нас есть динамический список размеров рубашки в зависимости от критериев, возвращаемых нашим серверным API:
<b-form-select name="shirtSize" id="shirtSize" :options="shirtSizeOptions">
 <template v-slot:first>
  <option value="" disabled>- Select Size -</option>
 </template>
</b-form-select>

2)Определите данные о параметрах:

export default {
 data () {
  return {
   shirtSizes: [],
   shirtSizeOptions: [],
  }
 },
 .... 
}

3) Используя жестко закодированную версию, чтобы показать вам, как она будет работать:

methods: {
 setShirtSizeOptions: function () {
  var options = [
   { value: "1", text: "Small" },
   { value: "2", text: "Medium" },
   { value: "3", text: "Large" }
  ]
 
  for(var i = 0; i < options.length; i++){
   this. shirtSizeOptions.push(options[i])
  }
 }
}

4) Загрузить параметры размера рубашки

...
created (){
 this.setShirtSizeOptions()
},
...

Когда вы скомпилируете, вы увидите, что выпадающий список правильно загружает параметры. Таким образом, этот базовый фрагмент дает вам общее представление о том, как загружать динамические параметры. Теперь, чтобы сделать их динамическими.

Предполагая, что у вас есть свои аксиомы или какие-либо другие настройки, вы можете называть их как хотите. Данные, которые я возвращаю из этого API, в значительной степени соответствуют этому формату (бэкенд — Laravel):

{"id":1,"name":"sm","full_name":"Small","deleted_at":null,"created_at":"2019-01-01-16:11:49","updated_at":"2019-01-01-16:11:49"}

5) Определить, как мы будем динамически загружать наши параметры:

methods: {
 setShirtSizeOptions: function () {
  this.$http.get('/api/shirt-sizes')
  .then(resp => {
   this.shirtSizes = resp.data
   for(var i = 0; i < this.shirtSizes.length; i++){
    var option = []
    for(var key in this.shirtSizes[i]){
     if(key == "id"){
      option["value"] = this.shirtSizes[i][key]
     }else if(key == "full_name"){
      option["text"] = this.shirtSizes[i][key]
     }
     
    }
    this. shirtSizeOptions.push(Object.assign({},option))
   }
  })
  .catch(err => {
   console.log(err)
  })
  
 }
}

В этом примере наши параметры помещаются в массив, затем преобразуются в объект Javascript перед отправкой в ​​значение shirtSizeOptions. Вы могли бы сделать это по-другому, но вы поняли идею.

Это довольно быстро и грязно. Это можно было бы очистить с помощью большего количества проверок — например. убедитесь, что параметры Value и Text были добавлены перед отправкой в ​​объект массива shirtSizeOptions, чтобы вы не помещали пустые/неопределенные значения.

Я не эксперт в Javascript или VueJS, поэтому может быть более чистый метод, но после поиска в StackOverflow и других местах я обнаружил отсутствие четких примеров из прямого вызова API -> Загрузка данных параметров с помощью VueJS Bootstrap.