computed set 自定義參數_深入理解vmodel之自定義組件用法

根據上一篇《深入理解 v-model 之表單用法》基本對 v-model 有了比較深的理解,接下來我們看看它如何在自定義組件中使用。

首先,我們知道下面兩個用法等價的:

<input?v-model="msg"?/>

<input?:value="msg"?@input="msg?=?$event.target.value"?/>

在 vue3 中

當在自定義組件中使用v-model時,組件接收一個屬性modelValue的值,然后通過觸發update:modelValue事件來更新該值:

<custom-comp?v-model="msg">custom-comp>

<custom-comp?:model-value="msg"?@update:model-value="msg?=?$event">custom-comp>

v-model 實現

根據上面的定義規則,我們可以這樣實現一個自定義 input 組件:

//?示例1:自定義input組件
//?實現1:
app.component('custom-input',?{
??props:?['modelValue'],
??template:?`??????:value="modelValue"
??????@input="$emit('update:modelValue',?$event.target.value)"
????>
??`,
});
//?實現2:使用input的v-model + computed(計算屬性)
app.component('custom-input',?{
??props:?['modelValue'],
??computed:?{
????value:?{
??????get()?{
????????return?this.modelValue;
??????},
??????set(v)?{
????????this.$emit('update:modelValue',?v);
??????},
????},
??},
??template:?`
??`,
});

使用:

<custom-input?v-model="msg">custom-input>;

上面示例只是對 input 做了一層包裝,如果自定義組件里面不包含 input 又該如何實現呢?為了加深理解,我們看下面一個自定義 count 組件示例:

//?示例2:自定義count組件
app.component('custom-count',?{
??props:?{
????modelValue:?Number,
??},
??methods:?{
????increment()?{
??????this.$emit('update:modelValue',?++this.modelValue);
????},
????decrement()?{
??????this.$emit('update:modelValue',?--this.modelValue);
????},
??},
??template:?`+1?~?-1

{{modelValue}}


??`,
});

使用:

<custom-count?v-model="num">custom-count>;

我們來看看實現

043e385728143c4b6d585a51514e3336.gif

vue3自定義組件的v-model實現

v-model 參數

通過示例我們發現 v-model 是接收屬性modelValue的值,然后觸發事件update:modelValue來更新該值,那么我們可不可以修改這個屬性名modelValue呢?該如何操作?其實我們只需要給v-model添加參數即可,比如:v-model:mv,這樣就將modelValue換成了mv

我們來將上面的自定義組件改造一下:

app.component('custom-input',?{
??props:?['mv'],
??template:?`??????:value="mv"
??????@input="$emit('update:mv',?$event.target.value)"
????>
??`,
});

使用方式就變成了:

<custom-count?v-model:mv="num">custom-count>;

多個 v-model 綁定

正是由于 vue3 中新增了 v-model 的參數傳遞,所以自定義組件可以同時支持多個v-model的綁定:

<user-name?v-model:first-name="firstName"?v-model:last-name="lastName">user-name>

組件實現就變成了:

app.component('user-name',?{
??props:?{
????firstName:?String,
????lastName:?String,
??},
??template:?`??????type="text"
??????:value="firstName"
??????@input="$emit('update:firstName',?$event.target.value)">??????type="text"
??????:value="lastName"
??????@input="$emit('update:lastName',?$event.target.value)">
??`,
});

實現效果

ff1c53a11fe573adfbca3193e0dadfb5.gif

綁定多個v-model

在 vue2 中

當在自定義組件中使用v-model時,組件接收一個屬性value的值,然后通過觸發input事件來更新該值:

<custom-comp?v-model="msg">custom-comp>

<custom-comp?:value="msg"?@input="msg?=?$event">custom-comp>

v-model 實現

實現方式類似,我們看下 vue2 中實現一個自定義 input 組件:

//?示例1:自定義input組件
Vue.component('comp-input',?{
??props:?{
????value:?String,
??},
??template:?`??????type="text"
??????:value="value"
??????@input="$emit('input',?$event.target.value)"
????>
??`,
});

自定義 v-model 屬性

同樣在 vue2 中也支持修改接收的屬性名,只是和 vue3 不同,vue2 是通過在組件中指定屬性 modelpropevent 來修改:

//?示例2:自定義count組件
Vue.component('custom-count',?{
??model:?{
????prop:?'v',?//?default:?value
????event:?'i',?//?default:?input
??},
??props:?{
????v:?Number,
??},
??data()?{
????return?{
??????count:?this.v,
????};
??},
??template:?`+1`,
});

我們看到在這個示例里面多了一個model屬性,并指定了兩個屬性:propevent,沒錯,這正是 v-model 需要的屬性和事件名,只是他們的默認值為valueinput,我們通過修改 model 屬性的 prop 和 event 就實現了自定義。

在線效果

b081d669f15e3236246a63a2634f38d6.gif

vue2自定義組件的v-model實現

關于為什么要出來一個 model 屬性,官方文檔也有說明,就是為了避免和 value 值有其他用途時和 v-model 產生沖突,比如單選框、復選框,具體可以查看官方示例

總結

自定義組件的 v-model 我們通過在 vue3 和 vue2 中的實現都講解了一遍,而且也能發現了其中的差異:

  1. vue3 默認屬性名、事件名為:modelValueupdate:modelValue;而 vue2 中則是:valueinput
  2. vue3 中直接通過 v-model 后面參數v-model:foo來指定屬性名,而且修改體現在父組件中,并且支持綁定多個 v-model;而 vue2 中通過子組件的model 屬性中的prop值和event值來指定屬性名和事件名,修改體現在子組件中。

接下來我們來看下一篇:《深入理解 vue 中 v-model 之修飾符》。

文章引用鏈接:

  1. https://codepen.io/cleam_lee/pen/ExKMYKE
  2. https://codepen.io/cleam_lee/pen/MWyRpvg
  3. https://codepen.io/cleam_lee/pen/mdPvWvY
  4. https://cn.vuejs.org/v2/guide/components-custom-events.html#%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BB%84%E4%BB%B6%E7%9A%84-v-model

b06fcf9c1a1c4ab73c778a59f44d4ae1.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/541628.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/541628.shtml
英文地址,請注明出處:http://en.pswp.cn/news/541628.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

01json轉字符串

/** * json轉字符串聲明 */ (NSString *)jsonToString:(NSDictionary *)dic; /** * json轉字符串實現 */ (NSString *)jsonToString:(NSDictionary *)dic { if(!dic){ return nil; } NSData *jsonData [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWriting…

AYUSH的完整形式是什么?

AYUSH&#xff1a;阿育吠陀&#xff0c;瑜伽和自然療法&#xff0c;烏納尼&#xff0c;悉達多和順勢療法 (AYUSH: Ayurvedic, Yoga and Naturopathy, Unani, Siddha and Homeopathy) AYUSH is an abbreviation of Ayurvedic, Yoga and Naturopathy, Unani, Siddha, and Homeopa…

大班科學電子計算機,計算器教案

計算器的認識和簡單應用教學內容&#xff1a;義務教育六年制小學第九冊第二單元第42頁。教學目標&#xff1a;1、通過學生自主探究&#xff0c;掌握計算器的使用方法&#xff0c;并能夠用計算器進行簡單的計算。2、借助計算器解決生活中的數學問題、探索數學規律&#xff0c;體…

arraylist能否接收強轉類型_ArrayList 源碼解析

點擊上方"IT牧場"&#xff0c;選擇"設為星標"技術干貨每日送達&#xff01;前言 JDK源碼解析系列文章&#xff0c;都是基于JDK8分析的&#xff0c;雖然JDK14已經出來&#xff0c;但是JDK8我還不會&#xff0c;我…類圖 實現了RandomAccess接口&#xff0c;…

exit c+_C / C ++中的exit(0)vs exit(1)與示例

exit cexit() is a library function in C/C programming language, it is used to terminate the calling process (function) immediately i.e. we can say it is used for the normal program termination and also perform the several cleanup steps. exit()是C / C 編程語…

校園計算機網絡系統,校園計算機網絡系統

一、校園網的基本概念基本功能&#xff1a;數據交換、資源共享&#xff0c;這里所指的數據包括各種信息&#xff0c;基本組成和結構&#xff1a;基本網絡由網絡網絡的分類&#xff1a;有多種分類方法&#xff0c;按規模可分為局域網、區域網、&127;廣域網。局域網服務范圍一…

mc有什么紅石機器人_我的世界10月考試!來測測你的MC成績吧~

考試規則&#xff1a;本次考試為閉卷考試&#xff0c;考生需要在30分鐘內完成試卷。試卷總分為100分&#xff0c;其中包括單項選擇題50分&#xff0c;多項選擇題20分&#xff0c;判斷題30分。考試內容包括《我的世界》手游1.11.0及以上版本在不添加任何模組的情況下的所有游戲內…

130、 Android OkHttp完全解析(轉載)

完全解析&#xff1a;http://blog.csdn.net/lmj623565791/article/details/47911083 從原理角度解析http文件上傳 http://blog.csdn.net/lmj623565791/article/details/23781773 https://github.com/hongyangAndroid/okhttputils

json轉string示例_C.示例中的String.Copy()方法

json轉string示例C&#xff03;String.Copy()方法 (C# String.Copy() Method) String.Copy() method is used to copy a string to new string object, it returns a new instance of String with the same value as given string. String.Copy()方法用于將字符串復制到新的字符…

自定義分頁 html,MVC 自定義HtmlHelper幫助類型之分頁

方法一&#xff1a;在項目中增加App_Code文件夾&#xff0c;新增一個MyHtmlper.cshtml視圖文件寫入代碼&#xff1a;helper Pagger(int pageIndex, int pageCount){for (int i 1; i < pageCount; i){if (i ! pageIndex){(i)}else{i}}}新增一個HomeControllerpublic class H…

vue 對象繼承_Vue2.0中組件的繼承與擴展是什么

Vue2.0中組件的繼承與擴展是什么發布時間&#xff1a;2020-12-07 14:04:09來源&#xff1a;億速云閱讀&#xff1a;100作者&#xff1a;小新小編給大家分享一下Vue2.0中組件的繼承與擴展是什么&#xff0c;相信大部分人都還不怎么了解&#xff0c;因此分享這篇文章給大家參考一…

stack示例_C.示例中的Stack.Clone()方法

stack示例C&#xff03;Stack.Clone()方法 (C# Stack.Clone() method) Stack.Clone() method is used to create a shallow copy of the stack. Stack.Clone()方法用于創建堆棧的淺表副本。 Syntax: 句法&#xff1a; Object Stack.Clone();Parameters: None 參數&#xff1a…

簡述計算機圖形的圖形應用主要有哪些,5計算機圖形學考試簡答題復習.doc

5計算機圖形學考試簡答題復習計算機圖形學考試簡答題復習1、簡述計算機動畫的概念&#xff0c;它經歷了哪幾個階段的發展&#xff1f;(2分)計算機動畫是指采用圖形與圖像的處理技術&#xff0c;借助于編程或動畫制作軟件生成一系列的景物畫面&#xff0c;其中當前幀是前一幀的部…

在圖片中選定任意凸多邊形制作掩膜程序MATLAB

function S get_convex_S(C,vx,vy) %該函數實現的功能為指定圖像中多邊形的頂點&#xff0c;返回屬于該凸多邊形中的所有像素點 %xv&#xff0c;yv為頂點坐標按照順時針或者逆時針。vx(1) xv(end); yv(1) yv(end) %輸入的C是結構&#xff0c;vx vy是數組存的是頂點坐標。 %輸…

js console 輸出到文件_Node.js核心入門

正文核心模塊是Node.js的心臟&#xff0c;主要是有一些精簡高效的庫組成(這方面和Python有很大的相似之處)&#xff0c;為Node.js提供了基礎的API。主要內容包括&#xff1a;Node.js核心入門(一)全局對象常用工具事件機制Node.js核心入門(二)文件系統訪問HTTP服務器與客戶端全局…

scala 當前日期_如何在Scala中檢查當前日期和時間?

scala 當前日期Scala is a general-purpose programming language, which is majorly used for data manipulation. It has libraries and support for almost all different utilities that are important. One of the important things that are required while programming …

計算機科學考試大綱,計算機科學與技術考試大綱.doc

計算機科學與技術考試大綱計算機科學與技術專業本專業的專業課程考試為“計算機軟件基礎”和“計算機硬件基礎”兩門課程的組合試卷&#xff0c;卷面總分200分&#xff0c;時間150分鐘&#xff0c;考試方式為筆試。考試可攜帶計數器&#xff0c;但禁止攜帶文曲星、商務通等帶有…

eclipse中項目內存溢出問題

2019獨角獸企業重金招聘Python工程師標準>>> SpringBoot項目熱啟動Perm區內存溢出。 Failed to instantiate [org.springframework.orm.jpa.JpaVendorAdapter]: Factory method jpaVendorAdapter threw exception; nested exception is java.lang.OutOfMemoryErro…

云盾idaas登陸_移動端掃碼登錄IDaaS平臺

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":10,"count":10}]},"card":[{"des":"刷臉門禁通行系統前端接入人臉AI賦能的人臉…

express rest_Express / Node中用于REST API的郵遞員工具

express restWhen dealing with routes (like in express), we may use any of the REST verbs and at times, the browser is limited to facilitate testing the routes/REST API. 在處理路由時(如快速表達)&#xff0c;我們可以使用任何REST動詞&#xff0c;有時瀏覽器會受到…