#javascript #vue.js #calendar #vuex #vcalendar
Вопрос:
я только начал писать код, и прямо сейчас мы используем v-calendar.io в нашем проекте airbnb нам нужно отключить даты на основе списка недоступных дат списка в бэкэнде.
<v-date-picker
class="date-picker"
v-model="date"
:disabled-dates="[new Date(2021, 9, 10)]"
color="blue"
is-range
/>
Таким образом, добавление дат в :отключенные даты работает, но как мне сделать так, чтобы он функционировал на основе списка массивов вместо жестко заданных дат? ( Я научился извлекать данные из бэкенда, но я не знаю, как кодировать, поэтому :отключенные даты принимают эту информацию )
Комментарии:
1. Что у тебя
script
на бирке? Вы используете свойствоcomputed
илиdata
?2. спасибо за ваш ответ, я сейчас не использую никаких вычислений, просто использую код vcalendar, предоставленный на их сайте. <скрипт> экспорт по умолчанию { данные() { возврат { диапазон: { начало: новая дата(2020, 0, 1), конец: новая дата(2020, 0, 5), }, }; }, }; <сценарий></сценарий>
Ответ №1:
Поместите свой массив дат в данные компонентов Vue:
data: () => ({
disabledDays: [] // later populated from API call
})
Тогда вы можете сделать:
<v-date-picker
class="date-picker"
v-model="date"
:disabled-dates="disabledDays" /*not hardcoded*/
color="blue"
is-range
/>
Как только вы получите строки дат из бэкенда, вы сможете преобразовать их в объекты дат, такие как:
this.disabledDays = response.disabledDates.map(string => new Date(string))`
Комментарии:
1. Привет, спасибо за ваш ответ, я немного смущен, разве это не должно быть похоже на код vcalendar [Новая дата()] что-то? Существует ли какой-либо необходимый формат даты, когда мы сохраняем наш arraylist в бэкэнде?
2. Ваш сервер будет сохранять и возвращать формат данных в формате ISOString, как только вы получите эти строки во внешнем интерфейсе, вы сможете преобразовать их в объекты фактической даты, такие как
this.disabledDays = response.dateStringsArrayFromBackend.map(string => new Date(string))
Ответ №2:
Я придумал фрагмент, чтобы показать вам вещи попроще. Я ввожу setTimeout
, mounted
чтобы имитировать запрос с сервера, и через 1 секунду ответ придет с сервера и заполнит объекты disable_dates
с датой.
Я использовал самый простой способ сопоставления строк с объектами даты, и вы также можете использовать map
or normal for
для достижения этой цели.
new Vue({
el: '#app',
data: {
date: null,
disable_dates: [],
},
mounted() {
setTimeout(() => {
let string_dates_from_srver = ['2021-05-05', '2021-05-08']
string_dates_from_srver.forEach((item) => {
this.disable_dates.push(new Date(item))
})
}, 1000)
}
})
<script src="https://unpkg.com/vue@2.6.12/dist/vue.min.js"></script>
<link href="https://unpkg.com/v-calendar@2.3.0/lib/v-calendar.min.css" rel="stylesheet"/>
<script src="https://unpkg.com/v-calendar@2.3.0/lib/v-calendar.umd.min.js"></script>
<div id='app'>
<v-date-picker class="date-picker" v-model="date" :disabled-dates="disable_dates" color="blue" is-range></v-date-picker>
{{date}}
</div>