Vue之自定義組件的v-model

来源:http://www.cnblogs.com/wind-lanyan/archive/2017/11/26/7899428.html
-Advertisement-
Play Games

最近在學習vue,今天看到自定義事件的表單輸入組件,糾結了一會會然後恍然大悟...官方教程寫得不是很詳細,所以我決定總結一下。 v-model語法糖 v-model實現了表單輸入的雙向綁定,我們一般是這麼寫的: 通過該語句實現price變數與輸入值雙向綁定 實際上v-model只是一個語法糖,真正的 ...


最近在學習vue,今天看到自定義事件的表單輸入組件,糾結了一會會然後恍然大悟...官方教程寫得不是很詳細,所以我決定總結一下。

 

v-model語法糖

v-model實現了表單輸入的雙向綁定,我們一般是這麼寫的:

1 <div id="app">
2     <input v-model="price">
3 </div>
1 new Vue({
2     el: '#app',
3     data: {
4          price: ''
5     }
6 });

通過該語句實現price變數與輸入值雙向綁定

實際上v-model只是一個語法糖,真正的實現是這樣的:

1 <input type="text" 
      :value
="price"
      @input
="price=$event.target.value">

以上代碼分幾個步驟:

  1. 將輸入框的值綁定到price變數上,這個是單向綁定,意味著改變price變數的值可以改變input的value,但是改變value不能改變price
  2. 監聽input事件(input輸入框都有該事件,當輸入內容時自動觸發該事件),當輸入框輸入內容就單向改變price的值

這樣就實現了雙向綁定。

 

自定義表單輸入組件

我們平時寫input可以不像上面那麼複雜,直接用v-model就行了,但是既然我們研究這個語法糖那肯定是有別的用處,比如說自定義表單輸入框組件。

1 <div id="app">
2      <input-price v-model="price"></input-price>
3 </div>
1 Vue.component('input-price', {
2     template: '<input type='text'>'
3 });
4 new Vue({
5     el: '#app',
6     data: {
7          price: ''
8     }
9 });

上面的<input-price>是我們自定義的表單輸入組件,我們能直接用v-model實現雙向綁定嗎?如果你覺得可以那你就是Too young了~

首先根據我們的v-model語法糖來看

  1. 我們的子組件(input-price)的value需要綁定一個從父組件傳來的值,通過子組件的props接收
  2. 在子組件上有新的輸入時需要觸發父組件的input事件,並將新的值作為參數傳遞給父組件
1 <div id="app"> 
2     <!-- <price-input v-model="price"></price-input> -->
3 
4      <!-- 手動實現了v-model雙向綁定 -->
5      <!-- 3、父組件的input事件被觸發,將傳來的值賦給父組件的變數price -->
6      <!-- 4、父組件value的值綁定到price -->
7      <price-input :value="price" @input="onInput"></price-input>
8      <p>{{price}}</p>
9 </div>

 

 1 Vue.component('price-input', {
 2     // 5、將父組件的value值通過props傳遞給子組件
 3     // 1、當有數據輸入時觸發了該組件的input事件
 4     template: '<input :value="value" @input="updateVal($event.target.value)" type="text">',
 5     props: ["value"], 
 6     methods: {
 7          updateVal: function(val) {
 8             // 2、手動觸發父組件的input事件並將值傳給父組件
 9             this.$emit('input', val);  
10          }
11      }
12 });
13 var app = new Vue({
14      el: '#app',
15      data: {
16          price: ''
17      },
18      methods: {
19           onInput: function(val) {
20                this.price = val;
21           }
22       }
23  });

這裡備註了幾個步驟:

  1. 當有數據輸入時觸發了該組件的input事件
  2. 手動觸發父組件的input事件並將值傳給父組件
  3. 父組件的input事件被觸發,將傳來的值賦給父組件的變數price,實現輸入框value到父元素的price的單向綁定
  4. 父組件value的值綁定到price 
  5. 將父組件的value值通過props傳遞給子組件,實現了父組件的price到子組件value的單向綁定

 

小小的總結一下:

  • v-bind只能實現單向綁定
  • v-model(v-bind+觸發的input事件)實現雙向綁定

 

如果大家有什麼意見或建議希望大家在評論區多多交流,謝謝。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.AngularJs指的是angular 1.x框架,Angular一般指的是2和4 2.angularjs是什麼:是一個js框架,幫助我們寫頁面的,是由谷歌公司創建,遵循MIT協議,開源開放 3.angularjs主要應用於增刪改查等數據操作比較頻繁的,比如說購物車,後臺管理系統。然而游戲,圖形 ...
  • <html><body> <script> //js模擬類的創建以及繼承 //第一步:創建父類 function Parent(name){ this.name = name; } //給父類添加屬性方法 Parent.prototype.age = 18; //var p1 = new Paren ...
  • ...
  • Function()是頂級的構造器 Object.prototype是頂級的原型對象 函數有prototype屬性,對象有__proto__欄位 ,而這個欄位的值,等於此對象的構造器(函數)的原型對象(prototype) js中一切都是對象,都有構造器(constructor) ...
  • Javascript OOP 創建對象: 構造型函數方式: 1、可以創建很多個對象 2、函數裡面是可以寫代碼的 對象字面量形式: Object 實例方法: 1、prototype的方式 2、其它 靜態方法: 成員的訪問: js的2大特性: 1、弱類型 2、動態性 instanceof: 構造器(Co ...
  • 錯誤描述 當form表單加FormGroup屬性時報錯 Can't bind to 'formGroup' since it isn't a known property of 'form' 原因分析與解決方案 在使用form表單時,如果用到了form-group與formControlName,需 ...
  • 隨機生成10個0~100不重覆的數字(包含0和100); 需要用到的知識點:隨機數 去重 下麵放代碼 寫代碼前思路一定要清晰,整理好邏輯再寫會讓你的開發事半功倍! ...
  • HTML5 作為下一代網站開發技術,無論你是一個 Web 開發人員或者想探索新的平臺的游戲開發者,都值得去研究。藉助尖端功能,技術和 API,HTML5 允許你創建響應性、創新性、互動性以及令人驚嘆的漂亮網站。更進一步,你也可以使用 HTML5 創建原來只能用於桌面平臺上的複雜應用程式。 這篇文章挑 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...