【问题标题】:How to emit momentjs dates in correct format如何以正确的格式发出 momentjs 日期
【发布时间】:2020-07-08 16:02:44
【问题描述】:

我正在尝试格式化我的数据以将其发送到父组件,但它似乎不是响应式的

      if(this.selectedDate !== '' && this.selectedMonth !== '' && this.selectedDate !== '' ){
    this.$emit("emit-data",  this.selectedYr+"-"+moment().set(this.selectedDate) .format("DD")+"- "+moment().set(this.selectedMonth).format("MM"))
  }

它不会发送选定的下拉菜单,而是发送在页面加载时预先选择的默认下拉菜单。但是如果我从正在发送的数据中删除moment() 格式,它会发送正确的值,但我仍然需要该格式的数据,例如YYYY-DD-MM

有没有办法在发射之前使用 setter 和 getter 计算?我不确定如何,但如果有办法?

【问题讨论】:

    标签: vue.js momentjs


    【解决方案1】:

    是的,您绝对可以为此使用响应式计算 getter。这是一个例子:

    <div id="app">
      <parent-component />
    </div>
    
    const parentComponent = Vue.component('parent-component', {
      data () {
        return {
          formattedDate: null
        }
      },
      template: `
        <div>
          <p>You have selected: {{ formattedDate || "nothing yet" }}.</p>
    
          <child-component
            @emit-data="(payload) => formattedDate = payload"
          />
        </div>
      `
    })
    
    const childComponent = Vue.component('child-component', {
      data () {
        return {
          selectedDate: null,
          selectedMonth: null,
          selectedYear: null
        }
      },
      computed: {
        formattedDate () {
          if (![this.selectedDate, this.selectedMonth, this.selectedYear].every((el) => el)) return null
          
          return moment({
            day: this.selectedDate,
            // Months in Moment.js are 0-indexed!
            month: this.selectedMonth - 1,
            year: this.selectedYear
          }).format("YYYY-DD-MM")
        }
      },
      watch: {
        formattedDate (newVal) {
          this.$emit("emit-data", newVal)
        }
      },
      template: `
        <div>
          <input v-model="selectedDate" type="number" placeholder="Day" min="1" max="31" step="1">
          <input v-model="selectedMonth" type="number" placeholder="Month" min="1" max="12" step="1">
          <input v-model="selectedYear" type="number" placeholder="Year" min="1900" max="2100" step="1">
        </div>
      `
    })
    
    new Vue({
      el: "#app"
    })
    

    您可以在https://jsfiddle.net/46vuLcy0/ 上以交互方式运行上述内容。

    【讨论】:

    • thnx,问题是我有几个月的字母数字格式的下拉列表,我需要在发出时将其转换为数字格式
    • 在这种情况下什么是字母数字格式?除非您提供您正在使用的完整代码,否则我认为我们无法为您提供进一步的帮助。
    • here你举个例子。所以我希望将发出的数据月份格式化为 07,例如 7 月
    • 你去吧:codesandbox.io/s/simple-moment-to-live-in-q6hg8?file=/src/…。观察控制台以查看事件何时发出以及使用什么有效负载。
    【解决方案2】:

    试试

    this.$emit('emit-data', moment(new Date(this.selectedMonth + "-" + this.selectedDate + "-" + this.selectedYr)).format(YYYY-DD-MM))
    

    你也可以看到这些examples

    更新

    在上面的代码中,您的数据被处理到moment 日期。可以将结果格式化为您想要的格式。

    示例

    如果你希望日期是15-JUL-2020,你可以有

    moment(/* your date */).format('DD-MMM-YYYY')
    

    你可以直接提供给点赞

    this.$emit("emit-data", moment(this.selectedYr + "-" + this.selectedDate + "-" + this.selectedMonth).format("YYYY-DD-MM"))
    

    根据格式,代码将产生类似2020-15-07 的结果。

    【讨论】:

    • 谢谢,我做了一些实验,观察者改变了数据(见我更新的问题),但是用你的例子和我的例子。有什么区别,newDate() 有什么作用?我以为moment() 给了你时间对象
    • new Date() 会将您的字符串日期格式转换为可识别的 UTC 格式。
    • 代码格式错误。 this.$emit(...).format is not a function
    • @Nofel 更新了 sn-p
    • 谢谢,太好了。一些我不明白的事情。 1. 为什么我的代码没有反应,例如为什么即使在选择之后它也不会发出选定的下拉菜单并发出今天的日期 2. 计算方法和计算代码看起来太相似的原因是什么?
    猜你喜欢
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    相关资源
    最近更新 更多