H5W3
当前位置:H5W3 > 其他技术问题 > 正文

关于vue.js中的input事件

<div id="app">
  <currency-input 
    label="Price" 
    v-model="price"
  ></currency-input>
  <currency-input 
    label="Shipping" 
    v-model="shipping"
  ></currency-input>
  <currency-input 
    label="Handling" 
    v-model="handling"
  ></currency-input>
  <currency-input 
    label="Discount" 
    v-model="discount"
  ></currency-input>
  
  <p>Total: ${{ total }}</p>
</div>
Vue.component('currency-input', {
  template: '\
    <div>\
      <label v-if="label">{{ label }}</label>\
      $\
      <input\
        ref="input"\
        v-bind:value="value"\
        v-on:input="updateValue($event.target.value)"\
        v-on:focus="selectAll"\
        v-on:blur="formatValue"\
      >\
    </div>\
  ',
  props: {
    value: {
      type: Number,
      default: 0
    },
    label: {
      type: String,
      default: ''
    }
  },
  mounted: function () {
    this.formatValue()
  },
  methods: {
    updateValue: function (value) {
      var result = currencyValidator.parse(value, this.value)
      if (result.warning) {
        this.$refs.input.value = result.value
      }
      this.$emit('input', result.value)
    },
    formatValue: function () {
      this.$refs.input.value = currencyValidator.format(this.value)
    },
    selectAll: function (event) {
      // Workaround for Safari bug
      // http://stackoverflow.com/questions/1269722/selecting-text-on-focus-using-jquery-not-working-in-safari-and-chrome
      setTimeout(function () {
          event.target.select()
      }, 0)
    }
  }
})

new Vue({
  el: '#app',
  data: {
    price: 0,
    shipping: 0,
    handling: 0,
    discount: 0
  },
  computed: {
    total: function () {
      return ((
        this.price * 100 + 
        this.shipping * 100 + 
        this.handling * 100 - 
        this.discount * 100
      ) / 100).toFixed(2)
    }
  }
})

在上面的代码中,对input事件有如下疑惑:
v-on:input=”updateValue($event.target.value)” 明确定义了组件this.$emit(‘input’, result.value)呢?为什么调用this.$emit(‘input’, result.value)不触发updateValue而是其他的方法呢?

回答:

$.emit()和$.on()是一对,都是自定义方法,一个触发一个监听,常用在子组件向父组件传递数据方面
你在本例中你如果想在input中触发updeteVlue方法,你直接在调一次updeteVlue()就好

回答:

input属于原生事件this.$emit()无法触发原生事件
this.$emit()一般用于自定义事件父子组件传值,触发器

回答:

input事件与v-model可以实现数据双向绑定。 这条答案非常关键

本文地址:H5W3 » 关于vue.js中的input事件

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址