Vue v-model組件封裝(類似彈窗組件)
v-model是vue的一個(gè)語(yǔ)法糖,限制在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用到除表單之外的自定義組件中,該怎么使用呢,其實(shí)官網(wǎng)所給的例子也比較清晰了,只是如果死腦筋的話,那就限制住了,沒(méi)錯(cuò)說(shuō)的就是我-.-.
<!--封裝的類彈窗組件-->
<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">點(diǎn)擊顯示</button>
<button @click="value=false">點(diǎn)擊消失</button>
</div>
</template>
<script>
import VModel from "./Vmodel"
export default {
components:{VModel},
data:function(){
return {
value:true
}
}
}
</script>
其實(shí)這樣父組件這邊已經(jīng)可以通過(guò)v-model對(duì)顯示和消失進(jìn)行控制了,但是封裝組件的 value 這個(gè)屬性名是不能修改的,必須叫 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)聽(tīng)的函數(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)用這個(gè)方法可以進(jìn)行控制
this.$emit("change",false)
}
}
}
</script>
當(dāng)然我們也可以通過(guò)model屬性,對(duì)value這個(gè)屬性名進(jìn)行修改,也是實(shí)現(xiàn)同樣的效果
bool:{
type:Boolean,
default:false
},
model:{
prop:"bool",
event:'change'
}
注意如果滅有加model屬性的話,對(duì)props的value屬性名修改的話,是沒(méi)效果的,默認(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"
總結(jié)
以上所述是小編給大家介紹的Vue中的 v-model組件封裝(類似彈窗組件),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
vue-cli+webpack項(xiàng)目打包到服務(wù)器后,ttf字體找不到的解決操作
這篇文章主要介紹了vue-cli+webpack項(xiàng)目打包到服務(wù)器后,ttf字體找不到的解決操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08
詳解Unity webgl 嵌入Vue實(shí)現(xiàn)過(guò)程
Unity webgl嵌入到前端網(wǎng)頁(yè)中,前端通過(guò)調(diào)用Unity webgl內(nèi)方法實(shí)現(xiàn)需要展示的功能,前端點(diǎn)擊Unity webgl內(nèi)的交互點(diǎn),Unity webgl返回給前端一些需要的數(shù)據(jù),這篇文章主要介紹了Unity webgl 嵌入Vue實(shí)現(xiàn)過(guò)程,需要的朋友可以參考下2024-01-01
vue啟動(dòng)報(bào)錯(cuò)‘vue-cli-service serve‘問(wèn)題及解決
這篇文章主要介紹了vue啟動(dòng)報(bào)錯(cuò)‘vue-cli-service serve‘問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10
vue?element?ui表格相同數(shù)據(jù)合并單元格效果實(shí)例
工作中遇到需要根據(jù)單元格某個(gè)屬性合并,特此記錄下,下面這篇文章主要給大家介紹了關(guān)于vue?element?ui表格相同數(shù)據(jù)合并單元格效果的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11
vue.js實(shí)現(xiàn)h5機(jī)器人聊天(測(cè)試版)
這篇文章主要為大家詳細(xì)介紹了vue.js實(shí)現(xiàn)h5機(jī)器人聊天測(cè)試版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07
Vue跳轉(zhuǎn)頁(yè)面的幾種常用方法總結(jié)
在Vue.js中,頁(yè)面跳轉(zhuǎn)是構(gòu)建單頁(yè)面應(yīng)用(SPA)的基本操作之一,本文將介紹Vue中實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)的幾種方法,并通過(guò)實(shí)例代碼幫助理解每種方法的用法,需要的朋友可以參考下2024-09-09
Vue實(shí)現(xiàn)一個(gè)帶有緩存功能的Tab頁(yè)簽功能
在現(xiàn)代?Web?應(yīng)用中,Tab?頁(yè)簽功能是非常常見(jiàn)的一種交互模式,它可以幫助用戶在不同的視圖間快速切換,而不會(huì)丟失當(dāng)前視圖的狀態(tài),本文將介紹如何在?Vue?項(xiàng)目中實(shí)現(xiàn)一個(gè)帶有緩存功能的?Tab?頁(yè)簽功能,需要的朋友可以參考下2024-08-08
Vue實(shí)現(xiàn)將數(shù)據(jù)庫(kù)中帶html標(biāo)簽的內(nèi)容輸出(原始HTML(Raw HTML))
今天小編就為大家分享一篇Vue實(shí)現(xiàn)將數(shù)據(jù)庫(kù)中帶html標(biāo)簽的內(nèi)容輸出(原始HTML(Raw HTML)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10
vue自定義一個(gè)v-model的實(shí)現(xiàn)代碼
這篇文章主要介紹了vue自定義一個(gè)v-model的實(shí)現(xiàn)代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-06-06
在vite項(xiàng)目中使用@進(jìn)行文件的引入方式
這篇文章主要介紹了在vite項(xiàng)目中使用@進(jìn)行文件的引入方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03

