首先,你需要在 Vue 中创建一个日历组件,该组件应该能够显示一个月的日历并允许用户选择日期。然后,当用户点击一个日期时,你需要将所选日期的值传递给父组件。最后,你可以在父组件中创建一个时间输入框,当用户点击日历中的日期时,在时间输入框中自动填充所选日期的值。
下面是一个简单的示例代码:
<!-- 在父组件模板中创建一个时间输入框 --> <template> <div> <label>选择日期:</label> <input type="text" v-model="selectedDate"> <my-calendar @date-selected="updateSelectedDate"></my-calendar> </div> </template> <script> import MyCalendar from './MyCalendar.vue' export default { components: { MyCalendar }, data() { return { selectedDate: '' } }, methods: { updateSelectedDate(date) { this.selectedDate = date } } } </script>
<!-- 在子组件中编写日历组件 --> <template> <div class="calendar"> <div>{{ month }} {{ year }}</div> <div> <button @click="prev"><</button> <button @click="next">></button> </div> <table> <thead> <tr> <th v-for="day in daysOfWeek">{{ day }}</th> </tr> </thead> <tbody> <tr v-for="week in weeks"> <td v-for="day in week" @click="selectDate(day)" :class="{ 'selected': isSelected(day) }"> {{ day }} </td> </tr> </tbody> </table> </div> </template> <script> export default { data() { return { today: new Date(), selectedDate: null, daysOfWeek: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], monthNames: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] } }, computed: { weeks() { let weeks = [] let week = [] let firstDayOfMonth = new Date(this.year, this.month, 1) let lastDayOfMonth = new Date(this.year, this.month + 1, 0) let dayOfWeek = firstDayOfMonth.getDay() let daysInMonth = lastDayOfMonth.getDate() for (let i = 1; i <= daysInMonth; i++) { let date = new Date(this.year, this.month, i) week.push(i) if (dayOfWeek === 6 || i === daysInMonth) { weeks.push(week) week = [] } dayOfWeek = (dayOfWeek + 1) % 7 } return weeks }, month() { return this.today.getMonth() }, year() { return this.today.getFullYear() } }, methods: { prev() { this.today = new Date(this.year, this.month - 1, 1) }, next() { this.today = new Date(this.year, this.month + 1, 1) }, selectDate(day) { this.selectedDate = new Date(this.year, this.month, day) this.$emit('date-selected', this.selectedDate) }, isSelected(day) { return this.selectedDate && this.selectedDate.getDate() === day } } } </script>
在上面的代码中,子组件是一个日历组件,它可以显示一个月的日历。当用户点击一个日期时,使用 selectDate
方法来设置 selectedDate
值,并通过 $emit
方法将所选日期传递给父组件。在父组件中,我们创建了一个时间输入框,并使用 selectedDate
的值来更新它的 v-model
值。
这样,当用户点击日历中的日期时,所选日期的值就会自动渲染到时间输入框中。