У меня есть приложение Vue, которое загружает другой компонент, реализующий поле даты диапазона с помощью vue-datepicker. Я хочу, чтобы при первом рендеринге у него был диапазон по умолчанию за последние 7 дней.
Однако я не могу установить данные для него при рендеринге, хотя я передаю их компоненту через атрибут :value.
Мой код компонента выбора даты:
<template>
<div>
<Datepicker
v-model = "selectedDates"
type = "range"
:value = "[startDate, endDate]"
@change = "onDateChange"
range
:enable-time-picker = "false"
format = "MMM dd"
/>
</div>
</template>
<script>
import Datepicker from "@vuepic/vue-datepicker"
export default {
components: {
Datepicker,
},
data() {
return {
selectedDates: [this.startDate, this.endDate],
startDate: new Date(new Date().setDate(new Date().getDate() - 7)),
endDate: new Date(),
}
},
methods: {
onDateChange() {
this.$emit("date-change", this.selectedDates)
},
},
}
</script>
В консоли браузера тоже нет ошибок.





Вы не можете определить реквизиты данных напрямую на основе других реквизитов данных. Вы можете определить значение для своей опоры напрямую, используя:
<template>
<div>
<Datepicker range
v-model = "selectedDates"
@change = "onDateChange"
:enable-time-picker = "false"
format = "MMM dd" />
</div>
</template>
<script>
import Datepicker from "@vuepic/vue-datepicker"
export default {
components: {
Datepicker,
},
data() {
return {
selectedDates: [new Date(new Date().setDate(new Date().getDate() - 7)), new Date()],
}
},
methods: {
onDateChange() {
this.$emit("date-change", this.selectedDates)
},
},
}
</script>
Обратите внимание, что теперь мы не ссылаемся на другие свойства при определении selectedDates.
Или вы можете использовать вычисляемые свойства, что, на мой взгляд, чище:
<template>
<div>
<Datepicker range
v-model = "selectedDates"
@change = "onDateChange"
:enable-time-picker = "false"
format = "MMM dd" />
</div>
</template>
<script>
import Datepicker from "@vuepic/vue-datepicker"
export default {
components: {
Datepicker,
},
computed: {
startDate() {
return new Date(new Date().setDate(new Date().getDate() - 7));
},
endDate() {
return new Date();
},
selectedDates() {
return [this.startDate, this.endDate]
}
}
methods: {
onDateChange() {
this.$emit("date-change", this.selectedDates)
},
},
}
</script>
Также обратите внимание, что вы привязываетесь как к v-model, так и к :value. Я бы предложил только привязку к v-model.
Полно и точно. Спасибо.