vue組件封裝v-model,組件嵌套組件時封裝v-model

首先來理解下 v-model

<input v-model="something">

是語法糖

<input
  v-bind:value="something"
  v-on:input="something = $event.target.value">

與組件一起使用時,簡化為

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

所以對于一個組件來說v-model,它應該(這些可以在2.2.0+中配置):
1.接受value道具
2.用新值發(fā)出一個input事件

一個組件上的 v-model 默認會利用名為 value 的 prop 和名為 input 的事件,但是像單選框、復選框等類型的輸入控件可能會將 value 特性用于不同的目。model 選項可以用來避免這樣的沖突:

<template>
    <input
      type="checkbox"
      v-bind:checked="checked"
      v-on:change="$emit('change', $event.target.checked)"
    >
</template>
<script>
export default {
    name: 'base-checkbox',
    model:{
        prop: 'checked',
        event: 'change'
    },
    props: {checked: Boolean}
}

現(xiàn)在在這個組件上使用 v-model 的時候:

<base-checkbox v-model="lovingVue"></base-checkbox>

這里的 lovingVue 的值將會傳入這個名為 checked 的 prop。同時當 <base-checkbox> 觸發(fā)一個 change 事件并附帶一個新的值的時候,這個 lovingVue 的屬性將會被更新。

以上是官網的基本的方法,弄懂以上的前提下,我們來繼續(xù)看嵌套組件時怎么再封裝一個v-model,我們新建一個組件special-checkbox里面包含上面的組件base-checkbox,如何將子父組件的v-model打通

<template>
  <base-checkbox v-model="newlovingVue"></base-checkbox>
</template>
<script>
export default {
    name: 'special-checkbox ',
    model:{
        prop:'lovingVue',//要存在于proops
        event:'change'//當組件的值發(fā)生改變時要emit的事件名
    },
    props: ['lovingVue'],
    data:function(){
        return{//要重新定義一個data,賦值為props中的值,因為組件時單數(shù)據流,不能直接修改props
            newlovingVue:this.lovingVue
        } 
    },
    watch:{//這里檢測data中的值,一旦發(fā)生變化就提交事件到父組件
        newlovingVue:function(newVal,oldVal){
            this.$emit('change',newVal)
        }
    }
}
</script>

現(xiàn)在使用這個二次封裝的組件的時候

<special-checkbox v-model="lovingVue"></base-checkbox>

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 組件注冊 組件名 在注冊一個組件的時候,我們始終需要給它一個名字。 該組件名就是Vue.component的第一個...
    oWSQo閱讀 458評論 0 1
  • 什么是組件? 組件 (Component) 是 Vue.js 最強大的功能之一。組件可以擴展 HTML 元素,封裝...
    youins閱讀 9,709評論 0 13
  • 以下內容是我在學習和研究Vue時,對Vue的特性、重點和注意事項的提取、精練和總結,可以做為Vue特性的字典; 1...
    科研者閱讀 14,226評論 3 24
  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內容,還有我對于 Vue 1.0 印象不深的內容。關于...
    云之外閱讀 5,187評論 0 29
  • 主要還是自己看的,所有內容來自官方文檔。 介紹 Vue.js 是什么 Vue (讀音 /vju?/,類似于 vie...
    Leonzai閱讀 3,556評論 0 25

友情鏈接更多精彩內容