Моя текущая ситуация заключается в том, что я делаю 2 вызова через Axios и получаю два разных файла. Первый вызов - это полный файл json, который создает таблицу, а второй - только категории (почему? Сложное приложение сложное. Оно медленно обновляется из старой структуры). Я создаю два раскрывающихся списка — первый заполняется годами, который также строит таблицу. Второй раскрывающийся список заполнен категориями. При загрузке приложения таблица загружается за текущий год.
Мой вопрос: как мне создать собственный вычисляемый фильтр, который будет фильтровать таблицу и отображать только строки с выбранной категорией (из второго раскрывающегося списка). Итак, если я выберу 2019 из первого раскрывающегося списка, все таблицы будут загружены. И после этого, если я выберу, скажем, «Имя» в раскрывающемся списке категорий, таблица обновится и покажет только строки, в которых есть «Имя». Пробовал разные варианты, но этот не укладывается в голове.
Мой текущий код:
data() {
return {
year:[],
category:[] ,
tableData:[],
}
},
computed: {
axiosParams(){
const params = new URLSearchParams();
params.append('year', this.year);
return params;
},
methods: {
getYears: function(){
axios.get('myUrl', {
params: this.axiosParams
}).then((response) => {
this.year = response.data;
console.info(response.data)
this.tableData = response.data.result;
})
.catch((err) => {
console.info(err);
});
},
getCategory: function(){
let category = [];
axios.get('mySecondUrl').then((response, i) => {
this.category = response.data
for (var i = 0; i < category.length; i++) {
let catType = i
this.catType = response.data[i].name;
console.info(catType);
}
})
.catch((err) => {
console.info(err);
})
}
}
created: {
this.getYears();
this.getCategory();
}
Мой HTML:
<select v-model = "selectedYear" @change = "yearSelected">
<option v-for = "year in years" :key = "year"> {{year}} </option>
</select>
<select v-model = "selectedCat" >
<option v-for = "(item, index) in category" :item = "item"
:key = "index" :value = "item.name"> {{ item.name }} </option>
</select>
Таким образом, раскрывающийся список моей категории вызывается из другого URL-адреса получения, который также имеет идентификаторы, и я должен получить их оттуда. Итак, снова, когда я выбираю «имя» из раскрывающегося списка, он фильтрует только строки «имени», которые имеют другие значения, такие как someVal, otherVal и т. д. Если «имя» не существует для выбранного года, ничего не показывать. Структура tableData выглядит так и включает в себя также категории: {"status":100, "result":[{ "category":"Name", "year":2019, "username":"test", "otherValues": [ { "someVal":30, "otherVal":20 },] } ]}
Итак, ваш tableData представляет собой массив таких объектов:
[
{
"category":"Name",
"year":2019,
"username":"test",
"otherValues":[
{
"someVal":30,
"otherVal":20
},
]
},
]
и вам нужно отфильтровать элементы в массиве на основе выбранного имени категории. К счастью, javascript может сделать это довольно легко для нас. Есть несколько методов, которые вы можете использовать для работы с массивами, но в этом случае я думаю, что метод filter()
должен работать достаточно хорошо. Есть дополнительная информация об этом здесь.
В основном вам нужен новый массив, который будет отображать выбранные данные, или, если ничего не выбрано, показать весь массив tableData. Это должно быть вычисляемое свойство.
computed: {
filteredTableData() {
if (this.selectedCat !== null) {
const filtered = this.tableData.filter(d => d.category === this.selectedCat)
return filtered
}
return this.tableData
},
}
Это предполагает, что когда вы инициализируете selectedCat
в данных, вы устанавливаете его равным нулю. Поэтому, когда кто-то выбирает категорию, она будет соответствовать условию «если», и наша константа «filtered» будет новым массивом всех элементов «tableData», которые удовлетворяют нашему условию. Если ничего не выбрано, возвращается весь массив tableData.
Когда вы обращаетесь к «tableData» в своем шаблоне, предположительно с помощью v-for = "data in tableData"
, вам теперь придется использовать v-for = "data in filteredTableData"
.
Можете ли вы включить образец структуры
tableData
. В частности, как в нем размещено название категории.