91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在Vue中對v-model組件進行封裝

發布時間:2021-03-29 18:03:19 來源:億速云 閱讀:744 作者:Leah 欄目:web開發

這篇文章將為大家詳細講解有關怎么在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組件進行封裝就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

玉田县| 安龙县| 万盛区| 东乌珠穆沁旗| 兴宁市| 积石山| 江华| 通山县| 中超| 崇文区| 大同市| 永定县| 黄陵县| 沁阳市| 河源市| 景泰县| 台南县| 通海县| 新巴尔虎左旗| 潞城市| 奇台县| 湘阴县| 金湖县| 德保县| 麦盖提县| 贵溪市| 和平县| 赤峰市| 马尔康县| 华蓥市| 夏河县| 三河市| 阿鲁科尔沁旗| 湖南省| 阿坝县| 蓝田县| 方山县| 绥宁县| 萍乡市| 涡阳县| 台东市|