代码之家  ›  专栏  ›  技术社区  ›  tobiasg

将new Date()与v-Date-picker一起使用不起作用

  •  9
  • tobiasg  · 技术社区  · 6 年前

    我正试着跟着 this video 使用Vue和Vuetify将当前日期应用于 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-日期选择器 尝试使用时 新建日期() 使用 V-模型 指令。此外,日期选择器未呈现。这个 v-time-picker 但效果很好。

    在本地设置中,我使用Vue cli创建了一个Vue项目。下面是我遇到的错误:

    [Vue warn]:创建挂钩时出错:“TypeError:dateString.split不是 a函数“

    在中找到

    ---&燃气轮机; 在src/components/Meetup/CreateMeetup。vue 在src/App。vue

    我的操作与下面的教程完全一样,所以我不知道这是否是Vue或Vuetify最新版本的bug?还是我遗漏了什么?

    6 回复  |  直到 6 年前
        1
  •  7
  •   connexo    6 年前

    显然(从您收到的错误消息中) v-datepicker 期望绑定到 String . 你可能想试试

    data: { 
        date: new Date().toJSON(), 
        time: new Date().toJSON() 
    }
    

    https://codepen.io/connexo/pen/ypWxLv

    另请参阅Vuetify API文档(其中明确指出 v-model 类型为 一串 ):

    v-model   String    null    Controls the displayed date. Must use ISO 8601 format.
    

    Vuetify Datepicker API Docs

        2
  •  4
  •   lokesh    4 年前

    相反,使用value属性来克服绑定。

    实例

    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>
        3
  •  3
  •   Aldo Canepa    5 年前

    在我的例子中,我需要将日期存储为日期对象,而不是字符串。因此,我没有在日期选择器中使用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>
        4
  •  1
  •   Kyle G    4 年前

    可以使用计算特性作为v模型的“垫片”。computed属性包含类型强制的所有逻辑,其他一切都照常进行。

    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
  •  0
  •   ZaidRehman    5 年前

    从官方示例来看,您必须这样使用

    data: { 
        date: new Date().toISOString().substr(0, 10), 
        time: new Date().getHours() + ':' + new Date().getMinutes(), 
    }
    

    示例-

    https://github.com/vuetifyjs/vuetifyjs.com/blob/master/src/examples/date-pickers/dateDialogAndMenu.vue

        6
  •  0
  •   zubair    3 年前

    Vuetify日期选择器需要该特定格式的日期(“YYYY-MM-DD”)。可以通过以下方式解决此问题:-

    new Vue({
      el:"#app",
      data: {
        date: moment(new Date()).format('YYYY-MM-DD'),
        time: new Date()
      }
    })