vue 自定義組件使用v-model

<input v-model="something">

v-model指令實際上是下面的語法糖包裝而成:html

<input
  :value="something"
  @:input="something = $event.target.value">

在一個組件上使用 v-model 時,會簡化爲:vue

<custom-input
  :value="something"
  @input="value => { something = value }">
</custom-input>

所以,對於一個帶有 v-model 的組件,它應該以下:ide

  • 接收一個 value prop
  • 觸發 input 事件,並傳入新值

利用 $emit 觸發 input 事件:ui

this.$emit('input', value);

組件1:this

Vue.component('my-component', {
  template: `<div>
  <input type="text" :value="currentValue" @input="handleInput"/>
  </div>`,
  computed:{
    currentValue:function () {
      return this.value
    }
  },
  props: ['value'], //接收一個 value prop
  methods: {
    handleInput(event) {
      var value = event.target.value;
      this.$emit('input', value); //觸發 input 事件,並傳入新值
    }
  }
});    
上面是將prop屬性綁定到data裏,以便修改 prop 數據(Vue不容許直接修改prop屬性的值)#查看原理#

組件2:spa

Vue.component("my-counter", {
  template: `<div>
  <h1>{{value}}</h1>
  <button @click="plus">+</button>
  <button @click="minu">-</button>
  </div>`,
  props: {
    value: Number //接收一個 value prop
  },
  data: function() {
    return {
      val: this.value
    }
  },
  methods: {
    plus() {
      this.val = this.val + 1
      this.$emit('input', this.val) //觸發 input 事件,並傳入新值
    },
    minu() {
      if(this.val>0){
        this.val = this.val-1
        this.$emit('input', this.val) //觸發 input 事件,並傳入新值
      }
    }
  }
});

 

查看在線例子.net

 

 

 

參考文檔:https://vuejs.org/v2/guide/components.htmlcode

相關文章
相關標籤/搜索