我正在尝试使用Vue和Vuetify关注this video,使用v-model
将当前日期应用于日期选择器组件v-date-picker
,使用最初的数据值date
正在设置new Date()
。
这是我项目的简化结构:
JS
new Vue({
el:"#app",
data: {
date: new Date(),
time: new Date()
}
})
模板
<div id="app">
<v-date-picker v-model="date"></v-date-picker>
{{ date }}
<v-time-picker v-model="time"></v-time-picker>
</div>
这是一个CodePen 。很遗憾,我无法让Vuetify CSS与CodePen一起使用,但是如果你打开控制台,当我尝试将v-date-picker
与new Date()
一起使用时,我会发现v-model
出现错误{1}}指令。日期选择器也不会渲染。然而v-time-picker
工作正常。
在我的本地设置中,我使用vue-cli创建了一个Vue项目。这是我到达那里的错误:
[Vue警告]:创建的钩子出错:“TypeError:dateString.split不是 功能“
在
中找到---&GT; 在src / components / Meetup / CreateMeetup.vue 在src / App.vue
我正在完成我正在关注的教程,所以我不知道这是否是最新版本的Vue或Vuetify的错误?或者我错过了什么?
答案 0 :(得分:5)
显然(从您收到的错误消息中)v-datepicker
期望绑定到String
。您可能想尝试
data: {
date: new Date().toJSON(),
time: new Date().toJSON()
}
https://codepen.io/connexo/pen/ypWxLv
另请参阅Vuetify API文档(明确指出它希望v-model
的类型为String
):
v-model String null Controls the displayed date. Must use ISO 8601 format.
答案 1 :(得分:1)
data: {
date: new Date().toISOString().substr(0, 10)
}
相反,请使用value属性来克服绑定。
示例
enter code here
data: {
date: new Date().toISOString().substr(0, 10)
}
<v-text-field slot="activator" :value="dataValue.datePass" label="Date" append-icon="event" readonly style="font-size:14px"></v-text-field>
<v-date-picker v-model="dataValue.datePass"></v-date-picker>
答案 2 :(得分:1)
就我而言,我需要将日期存储为Date对象而不是String。因此,我没有使用日期选择器中的v-model,而是使用@input和:value来处理此问题。
new Vue({
el: '#app',
data() {
return {
isActive: false,
theDate: new Date()
}
},
computed: {
formattedDate() {
return this.theDate ? moment(this.theDate).format('MM/DD/YYYY') : undefined; // Custom format
},
datePickerFormattedDate() {
return this.theDate ? moment(this.theDate).format('YYYY-MM-DD') : undefined; // Date picker objects needs date in this particular format
}
},
methods: {
inputHandler(date) {
if (typeof date === 'string')
date = moment(date).toDate();
this.isActive = false;
this.theDate = date;
}
}
})
<html>
<head>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.1/locale/en-gb.js">
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vuetify/1.3.12/vuetify.min.js">
</script>
<script src="https://cdn.jsdelivr.net/momentjs/2.10.6/moment-with-locales.min.js">
</script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/material-design-icons/3.0.1/iconfont/material-icons.min.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons">
<link rel="stylesheet" href="https://unpkg.com/vuetify/dist/vuetify.min.css">
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<div id="app">
<v-app id="inspire">
<v-content>
<v-container>
<v-layout row wrap>
<v-flex pb-4 xs12>
Stored date: {{ theDate }}
</v-flex>
<v-flex xs12>
<v-text-field :readonly="true" :value="formattedDate" label="I want to enter dates here"></v-text-field>
<v-menu :close-on-content-click="true" v-model="isActive" :nudge-right="40" lazy transition="scale-transition" offset-y full-width min-width="290px">
<v-icon slot="activator">event</v-icon>
<v-date-picker :value="datePickerFormattedDate" @input="inputHandler"></v-date-picker>
</v-menu>
</v-flex>
</v-layout>
</v-container>
</v-content>
<v-footer></v-footer>
</v-app>
</div>
</body>
</html>
答案 3 :(得分:0)
在官方示例中,您看起来像这样使用
data: {
date: new Date().toISOString().substr(0, 10),
time: new Date().getHours() + ':' + new Date().getMinutes(),
}
示例-
答案 4 :(得分:0)
您可以将计算的属性用作v模型的“垫片”。计算出的属性包含强制类型的所有逻辑,而其他所有内容都照常进行。
JS
new Vue({
el:"#app",
data: {
date: new Date()
},
computed: {
// "shim" for v-date-picker
sdate: {
get() {
return this.date?.toISOString()
},
set(val) {
this.date = new Date(val)
}
}
}
})
模板
<div id="app">
<v-date-picker v-model="sdate"></v-date-picker>
{{ date }}
</div>
答案 5 :(得分:-2)