【问题标题】:VueJS use v-model on custom component date time pickerVueJS 在自定义组件日期时间选择器上使用 v-model
【发布时间】:2019-06-14 20:17:34
【问题描述】:

我想在我的自定义日期时间组件上使用 v-model,如下所示:

<date-time-picker v-model="startDate" label="Start date"></date-time-picker>

所以我在 DateTimePicker.vue 中所做的是:

<template>
  <v-menu v-model="menu" :close-on-content-click="false" full-width max-width="290" transition="scale-transition">
    <!-- Text field -->
    <v-text-field slot="activator" :label="label" append-icon="date_range" solo
                  :value="formattedDate" @input="handleDateTime"></v-text-field>

    <!-- Date picker -->
    <v-date-picker v-model="selectedDate" locale="fr-fr" v-if="datePicker" :min="todayDate">
      <v-spacer></v-spacer>
      <v-btn flat color="primary" @click="menu = false">Cancel</v-btn>
      <v-btn flat color="primary" @click="chooseDate">OK</v-btn>
    </v-date-picker>

    <!-- Time picker -->
    <v-time-picker v-if="!datePicker" v-model="selectedTime" full-width format="24hr" :min="todayTime">
      <v-spacer></v-spacer>
      <v-btn flat color="primary" @click="menu = false">Cancel</v-btn>
      <v-btn flat color="primary" @click="chooseTime">OK</v-btn>
    </v-time-picker>
  </v-menu>
</template>

<script>
  import format from 'date-fns/format'

  export default {
    name: "DateTimePicker",
    props: ['label', 'value'],
    data() {
      const todayDate = new Date().toISOString().substr(0, 10);
      const todayTime = new Date().getHours() + ':' + new Date().getMinutes();

      return {
        dateValue: '',
        timeValue: '',
        todayDate,
        todayTime,
        selectedDate: todayDate,
        selectedTime: todayTime,
        datePicker: true,
        timePicker: false,
        menu: false
      }
    },
    methods: {
      // Triggered by clicking on OK button inside Datepicker
      chooseDate: function () {
        this.dateValue = this.selectedDate;
        this.datePicker = false;
      },
      // Triggered by clicking on OK button inside Timepicker
      chooseTime: function () {
        this.timeValue = this.selectedTime;
        this.menu = false;
      },
      handleDateTime: function () {
        this.$emit('input', this.formattedDate);
      }
    },
    computed: {
      // Format date
      formattedDate() {
        return this.dateValue && this.timeValue ? format(this.dateValue, 'DD/MM/YYYY') + ' at ' + this.timeValue : '';
      }
    },
    watch: {
      // Display date picker when the menu is closed
      menu: function (opened) {
        if (!opened) this.datePicker = true;
      }
    }
  }
</script>

<style scoped>

</style>

但是当我选择日期时不会触发@input 事件,因此永远不会调用handleDateTime。 我不明白出了什么问题你能帮我吗?或者也许不可能在我的组件上使用 v-model 并且我必须使用另一种方式?

【问题讨论】:

  • 你在使用 Vuetify 吗?
  • @BoussadjraBrahim 是的,为什么?
  • 我创建了 vuetify 样板,请添加缺少的内容以便调试它codesandbox.io/s/5k254z99kx
  • 谢谢。没关系,我们有我们需要的所有东西。那么 stateDate v-model 适合你吗?

标签: javascript vue.js vuejs2 vue-component v-model


【解决方案1】:

您像以前一样保留父代码的代码:

<date-time-picker v-model="startDate" label="Start date"></date-time-picker>

在子组件中为formattedDate属性添加一个观察者如下:

   watch:{
       ....
     formattedDate(v) {
        this.$emit('input', this.formattedDate)
    }

   }

full running code

【讨论】:

  • 好的,谢谢,所以不可能在我的组件上使用 v-model 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-26
  • 1970-01-01
  • 2020-01-19
  • 2019-06-14
  • 1970-01-01
  • 2017-11-07
  • 2018-06-08
相关资源
最近更新 更多