1. 程式人生 > >Vue.js 元件中的v-on繫結自定義事件理解

Vue.js 元件中的v-on繫結自定義事件理解

每個 Vue 例項都實現了事件介面(Events interface),即:

使用 $on(eventName) 監聽事件

使用 $emit(eventName) 觸發事件

Vue的事件系統分離自瀏覽器的EventTarget API。儘管它們的執行類似,但是$on$emit 不是addEventListenerdispatchEvent 的別名。

另外,父元件可以在使用子元件的地方直接用 v-on 來監聽子元件觸發的事件。
下面是一個文件上面的例子:
2017年4月11日更新

<div id="counter-event-example">
  <p>{{ total }}</p>
  <button-counter v-on:increment="incrementTotal"
></button-counter> <button-counter v-on:increment="incrementTotal"></button-counter> </div> Vue.component('button-counter', { template: '<button v-on:click="increment">{{ counter }}</button>', data: function () { return { counter: 0 } }, methods: { increment: function
() {
this.counter += 1 this.$emit('increment') } }, }) new Vue({ el: '#counter-event-example', data: { total: 0 }, methods: { incrementTotal: function () { this.total += 1 } } })

跟著這個例子我來談談理解,更新以前我那種錯誤的思想
先畫出理解的步驟,跟著步驟來進行理解
這裡寫圖片描述

步驟1:

大家先看到這裡,其實在步驟4裡面的自定義標籤經過渲染之後是變成了如 步驟一 一樣的程式碼,所以我們應該從這裡入手理解父子元件間事件繫結。在子元件裡面把點選事件(click)繫結給了函式increment(即圖片裡面的步驟2),這裡容易理解,即點選了子元件的按鈕將會觸發位於子元件的increment函式

步驟2與步驟3:

increment函式被觸發執行,在步驟2裡面執行了一句呼叫函式的語句

this.$emit('increment')

我們來看一下文件

vm.$emit( event, […args] ) : 觸發當前例項上的事件。附加引數都會傳給監聽器回撥

在這裡是什麼意思呢?按我自己的大白話就是這樣說的:
通過這句函式可以讓父元件知道子元件呼叫了什麼函式,this.$emit(‘increment’) 即類似於子元件跟父元件說了一聲“hi,爸爸 我呼叫了我自己的increment函式”,通知父元件

步驟4:

回看一下在父元件裡面定義的自定義標籤,可以看到

v-on:increment="incrementTotal"

什麼意思呢?我們還是用大白話來解釋一下
就是說“孩子,當你呼叫了increment函式的時候,我將呼叫incrementTotal函式來回應你”

這時我們回想步驟3,在子元件我們已經使用emit來進行通知,所以,這樣就形成父子元件間的相互呼應傳遞資訊,其實在開發的過程中父子元件通訊也都是使用這樣的方法,父元件傳遞資訊給子元件的時候會通過props引數,通常不會直接在子元件中修改父元件傳遞下來的資訊,而且通過這樣的一個鉤子去通知父元件對某些引數進行改變

步驟5:

這個就容易理解了,上一版本是本人在初學的時候寫的所以思維很不嚴謹,抱歉,歡迎大家指導批評

相關推薦

Vue.js 元件v-on定義事件理解

每個 Vue 例項都實現了事件介面(Events interface),即: 使用 $on(eventName) 監聽事件 使用 $emit(eventName) 觸發事件 Vue的事件系統分離自瀏覽器的EventTarget API。儘管它們的執行類似,

vue2.0v-on定義事件

vue中父元件通過prop傳遞資料給子元件,而想要將子元件的資料傳遞給父元件,則可以通過自定義事件的繫結。 每個 Vue 例項都實現了事件介面,即: 使用 $on(eventName) 監聽事件 使用 $emit(eventName) 觸發事

vue2.0v-on綁定定義事件理解

按鈕 自定義事件 監聽器 code 自定義 pre strong 數據 解耦 vue中父組件通過prop傳遞數據給子組件,而想要將子組件的數據傳遞給父組件,則可以通過自定義事件的綁定。 每個Vue實例都實現了【事件接口】,即: 1、使用 $on(eventName) 監聽事

vue.js v-model雙向資料vue.js form表單資料

vue.js v-model雙向資料繫結, vue.js form表單資料繫結   ================================ ©Copyright 蕃薯耀 2018年11月29日 http://fanshuyao.iteye.com/   &l

Vue.js學習筆記:屬性 v-bind

v-bind  主要用於屬性繫結,Vue官方提供了一個簡寫方式 :bind,例如: <!-- 完整語法 --> <a v-bind:href="url"></a> <!-- 縮寫 --> <a :href="url"

vue.js學習筆記之屬性 v-bind

vue.js中有許多的指令,其中屬性繫結的是v-bind。 v-bind可以繫結src,style,class 一、地址繫結 HTML程式碼: <body> <div id=

vue.js和angular雙向資料的實現原理

一、vue雙向資料繫結 1、原理 資料劫持: vue.js 是採用資料劫持結合釋出者-訂閱者模式的方式,通過Object.defineProperty()來劫持各個屬性的setter,getter,在資料變動時釋出訊息給訂閱者,觸發相應的監聽回撥。 2、實現步驟 要實現mv

Vue某些情況下 v-model資料不實時更新解決辦法

有的時候我們變化data內的內容,console.log列印的時候是顯示已經變化了的,但並沒有渲染到介面上去。受 ES5 的限制,Vue.js 不能檢測到物件屬性的新增或刪除。因為 Vue.js 在初始化例項時將屬性轉為 getter/setter,所以屬性必須

Vue.js快速上手|單向與雙向

 概述 Vue.js 最顯著的特點就是響應式和資料驅動,也就是將Model和View進行單向繫結或者雙向繫結。單向繫結:把Model繫結到View,當我們用JavaScript程式碼更新Model時,View就會自動更新。因此,我們不需要進行額外的DOM操作,只需要進行Mod

vue.js 2.0 關於ref--dom物件並獲取

v-ref、v-el 棄用 統一使用ref屬性為元素或元件新增標記,然後通過this.$refs獲取。 開始我用: <div class="menu-wrapper" ref="menu-wrapper"> 來繫結dom物

vue的思雙向資料的原理

我們在面試中經常會被問道什麼是mvc 什麼是 mvvm  還有雙向資料繫結的原理:MVC:對專案的整體把控,M代表的是資料庫中的資料,V代表的是前端的檢視層,C用於處理M和V之間進行互動的業務邏輯(業務

DevExPress控制元件ComboBoxEdit動態資料

List<string> strList = new List<string>(); //strList.Add()獲取資料後

JQuery - on多個事件

一、jquery為多個選擇器繫結同一個事件 $("#start,#end").on("click",function(){     alert("The paragraph was clicked."); }); 二、多個事件繫結同一個函式 $("p").on("mouseover

jquery on多個事件

一、jquery為多個選擇器繫結同一個事件 $("#start,#end").on("click",function(){     alert("The paragraph was clicked."); }); 二、多個事件繫結同一個函式

C# Combox控制元件如何定義資料

建立一個Combox控制元件為cbxSelectPilot,載入指定目錄中的檔名到cbxSelectPilot中di = new DirectoryInfo(defaultPilotParFolder);            fileInfo = di.GetFiles("

8.引數-定義型別(傳智播客)

需求:自定義日期型別引數繫結 private Date itemCreateDate; 如果controller形參pojo物件的屬性中有日期型別,需要自定義引數繫結。 將請求日期資料串轉換成日期型別,要轉換的日期型別和pojo中日期屬性的型別保持一致。所以自定義引數繫結將

WPF--定義資料型別

WPF作為資料繫結的目標: 使用DataContext屬性,表示當前控制元件中的每個元素都繫結此資料: 資料型別定義: public class FamilyData { private string m_familyName; private string m_widt

定義oracle表空間並定義使用者

建立oracle自定義的表空間和自定義使用者(PDB) 1.建立自定義表空間 建立表空間create tablespace  AARONPRO    //自定義的表空間名字, datafile '/opt/oracle/app/oradata/orcl/AARO

CEF3 非同步JavaScript 定義實現

https://github.com/fanfeilong/cefutil/blob/master/doc/CEF%20General%20Usage-zh-cn.md#asynchronous-javascript-bindings 在看非同步js繫結的自定義實現部分時,給出了幾個片段的程式碼

Quick-Cocos2d-x 3.3定義類至Lua(三)動手定義類至Lua

看【繫結自定義類至Lua】(二)新建專案中配製環境新建專案中配製環境,我們完美的在新建專案中完成了繫結需要的環境,接下來才是最關健的一步。繫結自定義C++類至Lua。 事實上引擎為了方便我們應對不同平臺,已經幫我們建立了不同平臺的工程專案。為了編輯程式碼方便,我