Динамический массив в списке данных не отображается

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

  <div>
    <!-- Search Bar -->
    <b-form-input
      v-model="text"
      type="text"
      placeholder="Search Courses/Professors"
      list="search-list-id"
      @input="searchInputChanged"
    ></b-form-input>

    <!-- Displayes Filtered List -->
    <li id="my-list-1" v-for="(item, index) in searchArray" :key="index">{{item}}</li>

    <!-- Datalist for Search Bar -->
    <datalist id="search-list-id">
      <!-- This one shows -->
      <option v-for="(size,index) in sizes" :key="index">{{ size }}</option>
      <!-- This one doesn't show. WHY? -->
      <option v-for="(item, index) in searchArray" :key="index">{{item}}</option>
    </datalist>
  </div>
</template>

<script>
import axios from "axios"; // Communicates w/ backend

export default {
  /* eslint-disable no-console */

  name: "Search",
  components: {},
  data() {
    return {
      text: "",
      searchArray: [],
      sizes: ["Small", "Medium", "Large", "Extra Large"]
    };
  },
  methods: {
    searchInputChanged() {...},
    getSearchFromBackend() {...}
  },
  computed: {
    filteredProfessors() {...}
  }
};
</script>

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

Но мой динамический список, который, как я знаю, имеет правильный массив, потому что он отлично отображается в моем, не показывает Динамический массив не отображается с раскрывающимся списком

Кажется, я не могу понять это. Любые идеи?

Вот содержание моих методов...

methods: {
    searchInputChanged() {
      if (this.text.length > 1) this.getSearchFromBackend();
    },
    getSearchFromBackend() {
      // get the search from the backend
        new Promise((resolve, reject) => {
        this.status = "loading"; // we can show a loading wheel while in this state

        var dataToPassIn = { filter: this.text };
        axios({
          url: "/search/" + this.text,
          data: dataToPassIn,
          method: "GET"
        })
          .then(resp => {
            console.log(resp);
            this.searchArray = resp.data;
            this.status = "success";

            resolve(resp);
          })
          .catch(err => {
            console.log(err);
            this.status = "error";

            reject(err);
          });
      });
    }
  },

person Christian Brock    schedule 27.11.2019    source источник
comment
Итак, где вы присваиваете новое значение searchArray (и где вы выполняете асинхронный запрос)? Не могли бы вы предоставить весь исходный файл?   -  person Marc Dix    schedule 27.11.2019
comment
Я присваиваю значение searchArray в методе searchInputChanged, который вызывает метод getSearchFromBackend, который присваивает новые значения searchArray. Я обновлю пост, чтобы показать их   -  person Christian Brock    schedule 27.11.2019
comment
Код добавлен.   -  person Christian Brock    schedule 27.11.2019
comment
И я не думаю, что выполняю какие-либо асинхронные запросы, если только они не запутаны аксиомами. Нужен ли мне асинхронный запрос?   -  person Christian Brock    schedule 27.11.2019
comment
Поскольку вы делаете сетевой запрос, который не может быть мгновенным из-за задержки и времени, необходимого пакетам для перемещения, он является асинхронным. Итак, как вы сказали, это немного запутано аксиосами. Кроме того: я не вижу причин делать здесь new Promise, поскольку это делает axios, поэтому невыполнение этого устранило бы некоторую сложность/источники возможных ошибок.   -  person Marc Dix    schedule 27.11.2019
comment
Я сел пример ж. динамический список данных. Надеюсь, это поможет определить вашу проблему. codepen.io/mdix/pen/YzzmWPg   -  person Marc Dix    schedule 27.11.2019
comment
Спасибо. Я новичок в axios и немного не в своей зоне комфорта. Я избавлюсь от обещания. Значит, нужно время, чтобы появиться? Кажется, достаточно мгновенно обновить searchArray, отображаемый через неупорядоченный список?   -  person Christian Brock    schedule 27.11.2019
comment
Большое спасибо, Марк. Я взгляну.   -  person Christian Brock    schedule 27.11.2019


Ответы (1)


Избегайте использования одного и того же Vue :key для прямых дочерних элементов в одном корневом элементе:

    <!-- Datalist for Search Bar -->
    <datalist id="search-list-id">
      <!-- prefix key with string 'sizes-' -->
      <option v-for="(size,index) in sizes" :key="'sizes-'+index">{{ size }}</option>
      <!-- prefix key with string 'search-' -->
      <option v-for="(item, index) in searchArray" :key="'search-'+index">{{item}}</option>
    </datalist>

В противном случае Vue видит одно и то же значение key для двух <options> под одним элементом <datalist>.

Вы также можете упростить это, используя вспомогательный компонент <b-form-datalist>:

    <!-- Datalist for Search Bar -->
    <b-form-datalist id="search-list-id" :options="[...sizes, ...searchArray]">
    </b-form-datalist>
person Troy Morehouse    schedule 01.12.2019