Vue 自定義組件實現(xiàn)v-model雙向綁定

之前一直很好奇element-ui自定義組件是怎么實現(xiàn)雙向綁定的兽叮,后來抽空學(xué)習(xí)了一下灾锯,今天來復(fù)習(xí)一下加深一下記憶吕朵。

首先在components目錄下新建一個名為MyInput的組件衅澈,代碼如下:

// v-model 默認(rèn)接收一個value的參數(shù)和向父組件觸發(fā)一個input的事件
<template>
  <div>
    <input type="text" :value="value" @input="onInput" />
  </div>
</template>

<script>
  export default{
    props: ['value'],
    methods: {
      onInput(e){
        this.$emit('input', e.target.value)
      }
    }
  }
</script>  

然后在父組件引入使用键菱,使用方式如下:

<template>
  <div>
     <my-input v-model="message"></my-input >
  </div>
</template>

<script>
  import MyInput from '@/src/components/MyInput.vue'
  export default{
    components: {
      MyInput 
    },
    data(){
      return{
        message: ''
      }
    }
  }
</script>  

v-model其實就是一個語法糖,就是父組件監(jiān)聽子組件emit發(fā)出的input事件今布,然后把子組件傳來的值賦給了message经备,等同于以下代碼:

<my-input :value="message" @input="message = $event"></my-input>

剛才也說了v-mode默認(rèn)接收的props是value,觸發(fā)的是input事件部默,當(dāng)然我們也可以通過model改一下侵蒙,這樣就更靈活了,雙向綁定就不僅僅只是適用于input組件了傅蹂,就可以像element-ui那樣自定義自己的radio checkbox組件并可以雙向綁定了:

子組件修改如下:

<template>
  <div>
    <input type="radio" :name="label" :value="label" @click="onChange" :checked="radio === label">
    <span>{{label}}</span>
  </div>
</template>

<script>
  export default{
    props: ['label', 'radio'],
    model: {
      prop: 'radio', //父組件監(jiān)聽到click事件以后就會把label的值賦給radio了
      event: 'click' // 父組件的v-model現(xiàn)在默認(rèn)監(jiān)聽的就是click事件了
    },
    methods: {
      onChange(){
        this.$emit('click', this.label)
        this.$emit('change', this.label) // 為了像element那樣纷闺, 我們再派發(fā)一個change,方便我們監(jiān)聽回調(diào)事件
      }
    }
  }
</script>  

父組件修改代碼如下:

<template>
  <div>
    <my-radio v-model="radio" label="label1" @change="onChange"></my-radio>
    <my-radio v-model="radio" label="label2" @change="onChange"></my-radio>
  </div>
</template>

<script>
  import MyRadio from '@/src/components/MyRadio.vue'
  export default{
    components: {
      MyRadio
    },
    data(){
      return{
        radio: 'label1' // 默認(rèn)選中l(wèi)abel1
      }
    },
    methods: {
      onChange(){
          console.log(val)
      }
    }
  }
</script>  

現(xiàn)在就可以靈活自定義自己的雙向綁定組件了份蝴,如果組件使用頻繁的話犁功,可以注冊到全局組件,就不用一次次引入了婚夫。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末浸卦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子案糙,更是在濱河造成了極大的恐慌限嫌,老刑警劉巖靴庆,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異怒医,居然都是意外死亡炉抒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門稚叹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來端礼,“玉大人,你說我怎么就攤上這事入录「虬拢” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵僚稿,是天一觀的道長凡桥。 經(jīng)常有香客問我,道長蚀同,這世上最難降的妖魔是什么缅刽? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮蠢络,結(jié)果婚禮上衰猛,老公的妹妹穿的比我還像新娘。我一直安慰自己刹孔,他們只是感情好啡省,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著髓霞,像睡著了一般卦睹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上方库,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天结序,我揣著相機與錄音,去河邊找鬼纵潦。 笑死徐鹤,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的邀层。 我是一名探鬼主播返敬,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼被济!你這毒婦竟也來了救赐?” 一聲冷哼從身側(cè)響起涧团,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤只磷,失蹤者是張志新(化名)和其女友劉穎经磅,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钮追,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡预厌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了元媚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轧叽。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖刊棕,靈堂內(nèi)的尸體忽然破棺而出炭晒,到底是詐尸還是另有隱情,我是刑警寧澤甥角,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布网严,位于F島的核電站,受9級特大地震影響嗤无,放射性物質(zhì)發(fā)生泄漏震束。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一当犯、第九天 我趴在偏房一處隱蔽的房頂上張望垢村。 院中可真熱鬧,春花似錦嚎卫、人聲如沸嘉栓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胸懈。三九已至,卻和暖如春恰响,著一層夾襖步出監(jiān)牢的瞬間趣钱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工胚宦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留首有,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓枢劝,卻偏偏與公主長得像井联,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子您旁,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348