Фильтрация по таблице в качестве пользовательских типов на панели ввода

У меня есть таблица, которая заполняется на основе массива объектов страны, и у меня также есть панель поиска, которая будет взаимодействовать с таблицей путем фильтрации в реальном времени по массиву стран и отображать только те страны, которые частично или полностью соответствуют тем, которые пользователь вводит в панель поиска.

Проблема в том, что я новичок в Vue, и мне сложно понять, как заставить это работать. Если кто-то может взглянуть на мой код и указать мне прямо на то, что я делаю неправильно, это было бы здорово!

Итак, сейчас моя логика заключается в том, что у меня есть v-модель в текстовом поле, которая будет привязывать все, что пользователь вводит, к значению данных, называемому «filterBy».

Мое понимание, вероятно, неверно, но сейчас я думаю о том, что, создавая функцию FilterCountries внутри computed, и так как Computed будет запускаться всякий раз, когда переменная внутри функции изменяется, она будет автоматически вызываться всякий раз, когда что-то вводится внутри панели поиска, таким образом фильтруя массив стран и таблица будут перерисованы.

<template>
  <div class="countries-table">
    <div class="countries-search-bar">
      <v-flex xs12 sm6 md3>
        <v-text-field
          v-model="filterBy"
          placeholder="Search by country name or alpha2"
        />
      </v-flex>
    </div>
    <v-data-table
      :headers="headerValues"
      :items="items"
      :pagination.sync="pagination"
      item-key="id"
      class="elevation-1"
      :rows-per-page-items="[300]"
    >
      <template v-slot:headers="props">
        <tr>
          <th
            v-for="header in props.headers"
            :key="header.text"
            :class="[
              'column sortable',
              pagination.descending ? 'desc' : 'asc',
              header.value === pagination.sortBy ? 'active' : ''
            ]"
            @click="changeSort(header.value)"
          >
            <v-icon small>arrow_upward</v-icon>
            {{ header.text }}
          </th>
          <th>
            Edit
          </th>
        </tr>
      </template>

      <template v-slot:items="props">
        <tr :active="props.selected" @click="props.selected = !props.selected">
          <td>{{ props.item.country_alpha2 }}</td>
          <td class="text-xs-right">{{ props.item.country_name }}</td>
          <boolean-cell
            custom-class="text-xs-right"
            :input="props.item.is_active"
            :output="{ true: 'Yes', false: 'No' }"
          ></boolean-cell>
          <date-cell
            custom-class="text-xs-right"
            :input="props.item.updated_at"
          ></date-cell>
          <td class="text-xs-right" @click="triggerEdit(props.item)">
            <v-icon class="edit-icon">edit</v-icon>
          </td>
        </tr>
      </template>
    </v-data-table>
  </div>
</template>

<script>
import BooleanCell from '~/components/global-components/Table/BooleanCell'
import DateCell from '~/components/global-components/Table/DateCell'

export default {
  components: {
    BooleanCell,
    DateCell
  },
  props: {
    headerValues: {
      type: Array,
      required: true
    },
    items: {
      type: Array,
      required: true
    }
  },
  computed: {
    filteredCountries() {
      return this.items.filter(country => {
        return country.country_name.includes(this.filterBy)
      })
    }
  },
  data() {
    return {
      pagination: {
        sortBy: 'country_alpha2'
      },
      filterBy: ''
    }
  },
  methods: {
    changeSort(headerValue) {
      if (this.pagination.sortBy === headerValue) {
        this.pagination.descending = !this.pagination.descending
      } else {
        this.pagination.sortBy = headerValue
        this.pagination.descending = false
      }
    }
  }
}
</script>

Таблица остается прежней с текущим кодом, который я имею, несмотря на то, что я набираю что-то внутри строки поиска.

Может кто-нибудь показать мне, что я делаю не так?

Всего 1 ответ


Для элементов v-data-table вы используете items которые идут как опора. Вы должны использовать вычисляемое свойство FilterCountries.


Есть идеи?

10000