中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

怎么在Vue中對v-model組件進(jìn)行封裝

這篇文章將為大家詳細(xì)講解有關(guān)怎么在Vue中對v-model組件進(jìn)行封裝,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),奉新企業(yè)網(wǎng)站建設(shè),奉新品牌網(wǎng)站建設(shè),網(wǎng)站定制,奉新網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,奉新網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。

v-model是vue的一個語法糖,限制在input和textarea等這些表單元素中,官網(wǎng)所給的例子也是僅限于表單組件

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

現(xiàn)在我們?nèi)绻氚裿-model用到除表單之外的自定義組件中,該怎么使用呢,其實官網(wǎng)所給的例子也比較清晰了,只是如果死腦筋的話,那就限制住了,沒錯說的就是我-.-.

<!--封裝的類彈窗組件-->
<template>
  <div>
    <div v-show="value">這是v-model的彈窗組件</div>
  </div>
</template>
<script>
export default {
  props:{
    value:{
      type:Boolean,
      default:false
    }
  }
}
</script>
<!--父組件-->
<template>
  <div>
    <v-model v-model="value"></v-model>
    <button @click="value=true">點擊顯示</button>
    <button @click="value=false">點擊消失</button>
  </div>
</template>
<script>
import VModel from "./Vmodel"
export default {
  components:{VModel},
  data:function(){
    return {
      value:true
    }
  }
}
</script>

其實這樣父組件這邊已經(jīng)可以通過v-model對顯示和消失進(jìn)行控制了,但是封裝組件的 value 這個屬性名是不能修改的,必須叫 value ,叫 value1 就不可以了

props:{
    value1:{ //失效
      type:Boolean,
      default:false
    }
  }

原因,看源碼

function transformModel (options, data: any) {
 const prop = (options.model && options.model.prop) || 'value' //子組件不存在options.model,默認(rèn)給value
 const event = (options.model && options.model.event) || 'input'//event="input"
 ;(data.attrs || (data.attrs = {}))[prop] = data.model.value
 const on = data.on || (data.on = {})
 const existing = on[event] //undefined
 const callback = data.model.callback //f()
 if (isDef(existing)) { //false
  if (
   Array.isArray(existing)
    ? existing.indexOf(callback) === -1
    : existing !== callback
  ) {
   on[event] = [callback].concat(existing)
  }
 } else {
  on[event] = callback //把回調(diào)賦值給監(jiān)聽的函數(shù)
 }
}

so,我們就可以加上model屬性,進(jìn)行代碼修改

<template>
  <div>
    <div v-show="value">這是v-model的彈窗組件</div>
    <div @click="cancelClick">組件內(nèi)部調(diào)用</div>
  </div>
</template>
<script>
export default {
  props:{
    value:{
      type:Boolean,
      default:false
    },
    model:{
      prop:"value",
      event:'change'
    }
  },
  methods:{
    cancelClick:function(){
      //內(nèi)部調(diào)用這個方法可以進(jìn)行控制
      this.$emit("change",false)
    }
  }
}
</script>

當(dāng)然我們也可以通過model屬性,對value這個屬性名進(jìn)行修改,也是實現(xiàn)同樣的效果

bool:{
    type:Boolean,
    default:false
  },
model:{
  prop:"bool",
  event:'change'
}

注意如果滅有加model屬性的話,對props的value屬性名修改的話,是沒效果的,默認(rèn)的v-model的event默認(rèn)修改的還是value

const prop = (options.model && options.model.prop) || 'value' //子組件不存在options.model,默認(rèn)給value
 const event = (options.model && options.model.event) || 'input'//event="input"

關(guān)于怎么在Vue中對v-model組件進(jìn)行封裝就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

當(dāng)前題目:怎么在Vue中對v-model組件進(jìn)行封裝
網(wǎng)頁鏈接:http://www.rwnh.cn/article22/peohjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計關(guān)鍵詞優(yōu)化、靜態(tài)網(wǎng)站動態(tài)網(wǎng)站、小程序開發(fā)、建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)
肥西县| 苏尼特右旗| 孝感市| 沐川县| 井陉县| 河津市| 龙泉市| 阳高县| 青州市| 泗水县| 临清市| 台湾省| 陆川县| 澎湖县| 武隆县| 临湘市| 吉水县| 峨眉山市| 湄潭县| 唐河县| 邳州市| 永昌县| 佛教| 北川| 关岭| 邻水| 庄河市| 镇宁| 吐鲁番市| 崇仁县| 始兴县| 阿图什市| 健康| 九寨沟县| 乌拉特中旗| 府谷县| 金山区| 葵青区| 孟州市| 惠东县| 鸡泽县|