1. 程式人生 > 程式設計 >Vue v-model元件封裝(類似彈窗元件)

Vue v-model元件封裝(類似彈窗元件)

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

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>

現在我們如果想把v-model用到除表單之外的自定義元件中,該怎麼使用呢,其實官網所給的例子也比較清晰了,只是如果死腦筋的話,那就限制住了,沒錯說的就是我-.-.

<!--封裝的類彈窗元件-->
<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>

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

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

原因,看原始碼

function transformModel (options,data: any) {
 const prop = (options.model && options.model.prop) || 'value' //子元件不存在options.model,預設給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 //把回撥賦值給監聽的函式
 }
}

so,我們就可以加上model屬性,進行程式碼修改

<template>
  <div>
    <div v-show="value">這是v-model的彈窗元件</div>
    <div @click="cancelClick">元件內部呼叫</div>
  </div>
</template>
<script>
export default {
  props:{
    value:{
      type:Boolean,default:false
    },model:{
      prop:"value",event:'change'
    }
  },methods:{
    cancelClick:function(){
      //內部呼叫這個方法可以進行控制
      this.$emit("change",false)
    }
  }
}
</script>

當然我們也可以通過model屬性,對value這個屬性名進行修改,也是實現同樣的效果

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

注意如果滅有加model屬性的話,對props的value屬性名修改的話,是沒效果的,預設的v-model的event預設修改的還是value

const prop = (options.model && options.model.prop) || 'value' //子元件不存在options.model,預設給value
 const event = (options.model && options.model.event) || 'input'//event="input"

總結

以上所述是小編給大家介紹的Vue中的 v-model元件封裝(類似彈窗元件),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對我們網站的支援!
如果你覺得本文對你有幫助,歡迎轉載,煩請註明出處,謝謝!