Поиск содержимого таблицы на основе выбранного элемента и поля поиска - PullRequest
1 голос
/ 19 апреля 2019

Я пытаюсь создать поле выбора и поиска для таблицы данных в vue js.Элементы опций выбора являются заголовками столбцов таблицы. Когда мы выбираем один вариант (один заголовок столбца) и осуществляем поиск в поле ввода, нам нужно искать только в этом конкретном столбце.Например, ID, Имя и Профессия - это три столбца в таблице. Если мы выберем Имя в опциях выбора, мы сможем искать имена в поле ввода.Я делюсь своим кодом здесь, может кто-нибудь помочь мне с этим

Я использовал Vuetify и Vue js2 для кода

<template>
<v-flex xs6>
        <v-select
          v-model="e1"
          :items="states"
          menu-props="auto"
          label="Select"
          hide-details
          prepend-icon="map"
          single-line
        ></v-select>
      </v-flex>
<v-text-field
            v-model="search"
            :counter="10"
            label="First name"
            required
          ></v-text-field>
        </v-flex>
  <v-data-table
    v-model="selected"
    :headers="headers"
    :items="desserts"
    item-key="name"
    select-all
    class="elevation-1"
  >
    <template v-slot:items="props">
      <td>
        <v-checkbox
          v-model="props.selected"
          primary
          hide-details
        ></v-checkbox>
      </td>
      <td>{{ props.item.name }}</td>
      <td class="text-xs-right">{{ props.item.calories }}</td>
      <td class="text-xs-right">{{ props.item.fat }}</td>
      <td class="text-xs-right">{{ props.item.carbs }}</td>
      <td class="text-xs-right">{{ props.item.protein }}</td>
      <td class="text-xs-right">{{ props.item.iron }}</td>
    </template>
  </v-data-table>
</template>

<script>
  export default {
    data () {
      return {
search: ''
        states: [
          'Calories','Fat','Carbs','Protein','Iron'
        ]
      }
        selected: [],
        headers: [
          {
            text: 'Dessert (100g serving)',
            align: 'left',
            sortable: false,
            value: 'name'
          },
          { text: 'Calories', value: 'calories' },
          { text: 'Fat (g)', value: 'fat' },
          { text: 'Carbs (g)', value: 'carbs' },
          { text: 'Protein (g)', value: 'protein' },
          { text: 'Iron (%)', value: 'iron' }
        ],
        desserts: [
          {
            name: 'Frozen Yogurt',
            calories: 159,
            fat: 6.0,
            carbs: 24,
            protein: 4.0,
            iron: '1%'
          },
          {
            name: 'Ice cream sandwich',
            calories: 237,
            fat: 9.0,
            carbs: 37,
            protein: 4.3,
            iron: '1%'
          },
          {
            name: 'Eclair',
            calories: 262,
            fat: 16.0,
            carbs: 23,
            protein: 6.0,
            iron: '7%'
          },
          {
            name: 'Cupcake',
            calories: 305,
            fat: 3.7,
            carbs: 67,
            protein: 4.3,
            iron: '8%'
          },
          {
            name: 'Gingerbread',
            calories: 356,
            fat: 16.0,
            carbs: 49,
            protein: 3.9,
            iron: '16%'
          },
          {
            name: 'Jelly bean',
            calories: 375,
            fat: 0.0,
            carbs: 94,
            protein: 0.0,
            iron: '0%'
          },
          {
            name: 'Lollipop',
            calories: 392,
            fat: 0.2,
            carbs: 98,
            protein: 0,
            iron: '2%'
          },
          {
            name: 'Honeycomb',
            calories: 408,
            fat: 3.2,
            carbs: 87,
            protein: 6.5,
            iron: '45%'
          },
          {
            name: 'Donut',
            calories: 452,
            fat: 25.0,
            carbs: 51,
            protein: 4.9,
            iron: '22%'
          },
          {
            name: 'KitKat',
            calories: 518,
            fat: 26.0,
            carbs: 65,
            protein: 7,
            iron: '6%'
          }
        ]
      }
    }
  }
</script>

1 Ответ

0 голосов
/ 19 апреля 2019

Попробуйте этот код.

<v-flex xs6>
      {{searchField}}
      {{search}}
      <v-select
        v-model="searchField"
        :items="states"
        menu-props="auto"
        label="Select"
        hide-details
        prepend-icon="map"
        single-line
        @change="search=''"
      ></v-select>
      <v-text-field
        v-model="search"
        :counter="10"
        label="First name"
        required
      ></v-text-field>
    </v-flex>
    <v-data-table
      v-model="selected"
      :headers="headers"
      :items="table_data"
      item-key="name"
      select-all
      class="elevation-1"
    >
      <template v-slot:items="props">
        <td>
          <v-checkbox
            v-model="props.selected"
            primary
            hide-details
          ></v-checkbox>
        </td>
        <td>{{ props.item.name }}</td>
        <td class="text-xs-right">{{ props.item.calories }}</td>
        <td class="text-xs-right">{{ props.item.fat }}</td>
        <td class="text-xs-right">{{ props.item.carbs }}</td>
        <td class="text-xs-right">{{ props.item.protein }}</td>
        <td class="text-xs-right">{{ props.item.iron }}</td>
      </template>
    </v-data-table>


data() {
      return {
        dialog: false,
        search: '',
        states: [
          'Calories', 'Fat', 'Carbs', 'Protein', 'Iron'
        ], selected: [],
        searchField: '',
        headers: [
          {
            text: 'Dessert (100g serving)',
            align: 'left',
            sortable: false,
            value: 'name'
          },
          {text: 'Calories', value: 'calories'},
          {text: 'Fat (g)', value: 'fat'},
          {text: 'Carbs (g)', value: 'carbs'},
          {text: 'Protein (g)', value: 'protein'},
          {text: 'Iron (%)', value: 'iron'}
        ],
        desserts: [
          {
            name: 'Frozen Yogurt',
            calories: 159,
            fat: 6.0,
            carbs: 24,
            protein: 4.0,
            iron: '1%'
          },
          {
            name: 'Ice cream sandwich',
            calories: 237,
            fat: 9.0,
            carbs: 37,
            protein: 4.3,
            iron: '1%'
          },
          {
            name: 'Eclair',
            calories: 262,
            fat: 16.0,
            carbs: 23,
            protein: 6.0,
            iron: '7%'
          },
          {
            name: 'Cupcake',
            calories: 305,
            fat: 3.7,
            carbs: 67,
            protein: 4.3,
            iron: '8%'
          },
          {
            name: 'Gingerbread',
            calories: 356,
            fat: 16.0,
            carbs: 49,
            protein: 3.9,
            iron: '16%'
          },
          {
            name: 'Jelly bean',
            calories: 375,
            fat: 0.0,
            carbs: 94,
            protein: 0.0,
            iron: '0%'
          },
          {
            name: 'Lollipop',
            calories: 392,
            fat: 0.2,
            carbs: 98,
            protein: 0,
            iron: '2%'
          },
          {
            name: 'Honeycomb',
            calories: 408,
            fat: 3.2,
            carbs: 87,
            protein: 6.5,
            iron: '45%'
          },
          {
            name: 'Donut',
            calories: 452,
            fat: 25.0,
            carbs: 51,
            protein: 4.9,
            iron: '22%'
          },
          {
            name: 'KitKat',
            calories: 518,
            fat: 26.0,
            carbs: 65,
            protein: 7,
            iron: '6%'
          }
        ],
        headers: [
          {
            text: 'Dessert (100g serving)',
            align: 'center',
            sortable: false,
            value: 'name'
          },
          {text: 'Calories', align: 'center', value: 'calories'},
          {text: 'Fat (g)', align: 'center', value: 'fat'},
          {text: 'Carbs (g)', align: 'center', value: 'carbs'},
          {text: 'Protein (g)', align: 'center', value: 'protein'},
          {text: 'Actions', align: 'left', value: 'name', sortable: false}
        ],
      }
    }

computed: {

      table_data() {
        let self = this;
        let filtered_data = this.desserts.filter(function (item) {
          if (self.searchField && self.search != '') {
            console.log(item[self.searchField.toLowerCase()])
            console.log(self.search)
            return item[self.searchField.toLowerCase()] == self.search;
          }
          else {
            return item
          }
        });
        return filtered_data;
      }
    },
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...