vue2 父子組件input輸入框?qū)崿F(xiàn)雙向綁定

因?yàn)閜rops是單向數(shù)據(jù)流,所以我們有幾種方式去實(shí)現(xiàn)父子組件input輸入框雙向綁定。

方法一:props屬性 + input回調(diào)

父組件 Demo

<template>
    <div id="demo">
        <div class="box">
            <input type="text" v-model="name"/>
            <demo-child v-model="name"></demo-child>
        </div>
    </div>
</template>
    import DemoChild from '@/components/DemoChild'
    export default {
        data() {
            return {
                name:'你好呀'
            }
        },
        components: {
            DemoChild
        },
    }

子組件 DemoChild

<template>
  <div id="demo_child">
    <div class="box">
      <!-- input的值綁定nameFromFather,input的值發(fā)生改變時(shí)觸發(fā)change事件(input事件是輸入框值發(fā)生改變的回調(diào)事件)-->
     <input type="text" :value="nameFromFather" @input="change"/>
    </div>
  </div>
</template>
  export default {
    name: 'child',
    //聲明model,這個(gè)model就是父組件綁定的model
    model:{
      prop: 'nameFromFather',  // 綁定的props屬性,這里是'nameFromFather'
      event: 'dataToFather'    // 觸發(fā)父組件中v-model綁定的屬性發(fā)生改變的方法,名稱自取
    },
    props:{
      nameFromFather:String  //自定義屬性,名稱自取,這個(gè)屬性接收父組件傳遞過來的數(shù)據(jù)
    }, 
    methods: {
      change(e){
        //this.$emit('調(diào)用的方法即model中的event','子組件input的值')
        this.$emit('dataToFather',e.target.value)
      }
    },
  }

因?yàn)槊糠N方法對(duì)于父組件的寫法是一樣的,只是子組件上有所不同,所以下面的方法我就不貼上父組件的代碼了,有需要的話,直接看方法一中父組件的寫法即可。

方法二:data屬性 + input回調(diào)

子組件 DemoChild

<template>
  <div id="demo_child">
    <div class="box">
     <input type="text" v-model="value" @input="change"/>
    </div>
  </div>
</template>
  export default {
    name: 'child',
    //利用data數(shù)據(jù),與input輸入框的value值綁定
    data(){
      return {
        value:this.nameFromFather   //自定義屬性,名稱自取,使其值等于自定義的props屬性
      }
    },
    //聲明model,這個(gè)model就是父組件綁定的model
    model:{
      prop: 'nameFromFather',  // 綁定的props屬性,這里是'nameFromFather'
      event: 'dataToFather'    // 觸發(fā)父組件中v-model綁定的屬性發(fā)生改變的方法,名稱自取
    },
    props:{
      nameFromFather:String  //自定義屬性,名稱自取,這個(gè)屬性接收父組件傳遞過來的數(shù)據(jù)
    }, 
    methods: {
      change(e){
        //this.$emit('調(diào)用的方法即model中的event','子組件input的值')
        this.$emit('dataToFather',e.target.value)
      }
    },
  }

其實(shí)對(duì)比下來很明顯就能看到,方法一和方法二的不同就在于input輸入框綁定值的方式不一樣,一個(gè)是:value:nameFromFather,一個(gè)是v-model:"value",那么為什么我們不直接用v-model:"nameFromFather"呢?

其實(shí)原因很簡單,因?yàn)榻M件props屬性是單向數(shù)據(jù)流,如果它既接收父組件的數(shù)據(jù)又改變父組件的數(shù)據(jù),那么數(shù)據(jù)綁定這塊就亂套了,到底誰是初始數(shù)據(jù)就說不清楚了,所以vue把v-model綁定props屬性的這種使用方式做了報(bào)錯(cuò)處理。

v-model=”props屬性“.png

仔細(xì)看報(bào)錯(cuò)圖片"Instead..."后面那串,其實(shí)我們的方法二和方法三就是上面描述的方法,"use a data or computed property based on the prop's value"

方法三:data屬性+watch監(jiān)聽

子組件 DemoChild

<template>
  <div id="demo_child">
    <div class="box">
     <input type="text" v-model="value" />
    </div>
  </div>
</template>
  export default {
    name: 'child',
     //利用data數(shù)據(jù),與input輸入框的value值綁定
    data(){
      return {
        value:this.nameFromFather  //自定義屬性,名稱自取,使其值等于自定義的props屬性
      }
    },
    watch:{    
      //監(jiān)聽value屬性
      value(){ 
        //this.$emit('調(diào)用的方法即model中的event','子組件input的值')
        this.$emit('dataToFather',`${this.value}`)   
      }
    },
    //聲明model,這個(gè)model就是父組件綁定的model
    model:{  
      prop: 'nameFromFather',  // 綁定的props屬性,這里是'nameFromFather'
      event: 'dataToFather'    // 觸發(fā)父組件中v-model綁定的屬性發(fā)生改變的方法,名稱自取
    },
    props:{
      nameFromFather:String  //自定義屬性,名稱自取,這個(gè)屬性接收父組件傳遞過來的數(shù)據(jù)
    }
  }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容