您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關怎么在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組件進行封裝就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。