#javascript #vue.js #filter #v-for #vue-filter
Вопрос:
Я пытаюсь создать календарь, как показано ниже:
Как вы видите, у меня есть объект «Билеты», и в соответствии с датой этих билетов я их показываю. Что мне нужно сделать, как вы видите на картинке, я хочу отобразить текст «Нет доступного билета», когда он пуст. Например, для понедельника и вторника (фактически все дни, кроме среды). Поэтому, чтобы взять билет, я фильтрую билеты:
findTickets(tickets, date) {
return tickets.filter((ticket) => {
return (
ticket.date.getDate() === date.getDate() amp;amp;
ticket.date.getMonth() === date.getMonth() amp;amp;
ticket.date.getFullYear() === date.getFullYear() amp;amp;
this.getWeekNumber(ticket.date) === this.currentWeekNumber
);
});
},
И в основном отображается внутри таблицы с v-для:
<tr class="list-content" v-for="ticket in findTickets(tickets, date)">
<td>{{ ticket.time }}</td>
<td>{{ ticket.date }}</td>
<td>{{ ticket.name }}</td>
</tr>
Итак, вы знаете, как я могу написать «нет доступной даты», когда билет пуст?
Комментарии:
1. Можете ли вы предоставить более подробную информацию? Когда билет «пустой»? Вы хотите проверить, является ли дата нулевой?
2. Да, когда дата равна нулю, по-видимому, нет билета для фильтрации. Поэтому я хочу показать текст, когда div пуст
Ответ №1:
Вместо прямого вызова findTickets()
в HTML вы можете вызвать findTickets()
код Javascript и использовать список непосредственно в v-for
цикле. Вы можете v-if
проверить tickets
, пуст ли массив, и если да, то распечатать сообщение.
<tr v-for="ticket in tickets" v-bind:key="ticket.name">
<td>{{ ticket.time }}</td>
<td>{{ ticket.date }}</td>
<td>{{ ticket.name }}</td>
</tr>
<div v-if="tickets.length == 0">No available tickets</div>
Это данные:
data: function () {
return {
tickets: [],
};
},
В этом примере findTickets()
метод должен возвращать пустой массив, если нет билетов.
methods: {
findTickets() {
// Here you do your stuff.
// Let's say you found your tickets
var ticketsFound = true;
if (ticketsFound) {
this.tickets = [
{
time: "11:02",
date: "23/85/2009",
name: "Ticket 1",
},
{
time: "11:02",
date: "23/85/2009",
name: "Ticket 2",
},
{
time: "11:02",
date: "23/85/2009",
name: "Ticket 3",
},
{
time: "11:02",
date: "23/85/2009",
name: "Ticket 4",
},
];
} else {
this.tickets = [];
}
},
}
И тогда вам нужно только вызвать findTickets()
метод из любого места, где вам нравится. В моем примере я вызываю его, когда компонент монтируется.
mounted() {
this.findTickets();
},
Вот рабочий пример:
https://codesandbox.io/s/patient-wave-u8uk7
Ответ №2:
Вы можете попробовать использовать карту вместо фильтра, что-то вроде этого:
return tickets.map((ticket) => {
if (ticket.date.getDate() === date.getDate() amp;amp;
ticket.date.getMonth() === date.getMonth() amp;amp;
ticket.date.getFullYear() === date.getFullYear() amp;amp;
this.getWeekNumber(ticket.date) === this.currentWeekNumber) return ticket;
ticket = {time: '', date: 'No available ticket', name: ''}
return ticket
});
Возможно, лучший способ-создать вычисляемое свойство…