- VueJS 教程
- VueJS - 首頁
- VueJS - 概述
- VueJS - 環境設定
- VueJS - 簡介
- VueJS - 例項
- VueJS - 模板
- VueJS - 元件
- VueJS - 計算屬性
- VueJS - 偵聽器
- VueJS - 繫結
- VueJS - 事件
- VueJS - 渲染
- VueJS - 過渡與動畫
- VueJS - 指令
- VueJS - 路由
- VueJS - 混入
- VueJS - 渲染函式
- VueJS - 響應式介面
- VueJS - 示例
- VueJS 有用資源
- VueJS - 快速指南
- VueJS - 有用資源
- VueJS - 討論
VueJS - 事件
v-on 是新增到 DOM 元素上的屬性,用於在 VueJS 中監聽事件。
點選事件
示例
<html>
<head>
<title>VueJs Instance</title>
<script type = "text/javascript" src = "js/vue.js"></script>
</head>
<body>
<div id = "databinding">
<button v-on:click = "displaynumbers">Click ME</button>
<h2> Add Number 100 + 200 = {{total}}</h2>
</div>
<script type = "text/javascript">
var vm = new Vue({
el: '#databinding',
data: {
num1: 100,
num2 : 200,
total : ''
},
methods : {
displaynumbers : function(event) {
console.log(event);
return this.total = this.num1+ this.num2;
}
},
});
</script>
</body>
</html>
輸出
以下程式碼用於為 DOM 元素分配點選事件。
<button v-on:click = "displaynumbers">Click ME</button>
v-on 有一個簡寫形式,這意味著我們也可以如下呼叫事件:
<button @click = "displaynumbers">Click ME</button>
點選按鈕時,它將呼叫方法“displaynumbers”,該方法接收事件,我們在瀏覽器中對其進行了控制檯輸出,如上所示。
現在我們將檢查另一個事件 mouseover mouseout。
示例
<html>
<head>
<title>VueJs Instance</title>
<script type = "text/javascript" src = "js/vue.js"></script>
</head>
<body>
<div id = "databinding">
<div v-bind:style = "styleobj" v-on:mouseover = "changebgcolor" v-on:mouseout = "originalcolor"></div>
</div>
<script type = "text/javascript">
var vm = new Vue({
el: '#databinding',
data: {
num1: 100,
num2 : 200,
total : '',
styleobj : {
width:"100px",
height:"100px",
backgroundColor:"red"
}
},
methods : {
changebgcolor : function() {
this.styleobj.backgroundColor = "green";
},
originalcolor : function() {
this.styleobj.backgroundColor = "red";
}
},
});
</script>
</body>
</html>
在上面的示例中,我們建立了一個寬度和高度為 100px 的 div。它被賦予了紅色背景色。在滑鼠懸停時,我們將顏色更改為綠色,在滑鼠移出時,我們將顏色更改回紅色。
因此,在滑鼠懸停期間,會呼叫一個名為 changebgcolor 的方法,一旦我們把滑鼠移出 div,就會呼叫一個名為 originalcolor 的方法。
操作如下:
<div v-bind:style = "styleobj" v-on:mouseover = "changebgcolor" v-on:mouseout = "originalcolor"></div>
如上所示,兩個事件 - mouseover 和 mouseout - 被分配給 div。我們建立了一個 styleobj 變數,併為其提供了要分配給 div 的所需樣式。同一個變數使用 v-bind:style = ”styleobj” 繫結到 div 上。
在 changebgcolor 中,我們使用以下程式碼將顏色更改為綠色。
changebgcolor : function() {
this.styleobj.backgroundColor = "green";
}
使用 stylobj 變數,我們將顏色更改為綠色。
類似地,以下程式碼用於將其更改回原始顏色。
originalcolor : function() {
this.styleobj.backgroundColor = "red";
}
這就是我們在瀏覽器中看到的。
當我們滑鼠懸停時,顏色將更改為綠色,如下面的螢幕截圖所示。
事件修飾符
Vue 在 v-on 屬性上提供了事件修飾符。以下是可用的修飾符:
.once
允許事件只執行一次。
語法
<button v-on:click.once = "buttonclicked">Click Once</button>
在呼叫修飾符時,我們需要新增點運算子,如上面的語法所示。讓我們在一個示例中使用它,並瞭解 once 修飾符的工作原理。
示例
<html>
<head>
<title>VueJs Instance</title>
<script type = "text/javascript" src = "js/vue.js"></script>
</head>
<body>
<div id = "databinding">
<button v-on:click.once = "buttonclickedonce" v-bind:style = "styleobj">Click Once</button>
Output:{{clicknum}}
<br/><br/>
<button v-on:click = "buttonclicked" v-bind:style = "styleobj">Click Me</button>
Output:{{clicknum1}}
</div>
<script type = "text/javascript">
var vm = new Vue({
el: '#databinding',
data: {
clicknum : 0,
clicknum1 :0,
styleobj: {
backgroundColor: '#2196F3!important',
cursor: 'pointer',
padding: '8px 16px',
verticalAlign: 'middle',
}
},
methods : {
buttonclickedonce : function() {
this.clicknum++;
},
buttonclicked : function() {
this.clicknum1++;
}
}
});
</script>
</body>
</html>
輸出
在上面的示例中,我們建立了兩個按鈕。帶有“單擊一次”標籤的按鈕添加了 once 修飾符,另一個按鈕沒有任何修飾符。這就是按鈕定義的方式。
<button v-on:click.once = "buttonclickedonce" v-bind:style = "styleobj">Click Once</button> <button v-on:click = "buttonclicked" v-bind:style = "styleobj">Click Me</button>
第一個按鈕呼叫方法“buttonclickedonce”,第二個按鈕呼叫方法“buttonclicked”。
buttonclickedonce : function() {
this.clicknum++;
},
buttonclicked : function() {
this.clicknum1++;
}
在 clicknum 和 clicknum1 中定義了兩個變數。當點選按鈕時,這兩個變數都會遞增。這兩個變數都初始化為 0,並且輸出顯示在上面。
點選第一個按鈕時,變數 clicknum 遞增 1。在第二次點選時,數字不會遞增,因為修飾符阻止它執行或執行分配給按鈕點選的任何操作項。
點選第二個按鈕時,執行相同的操作,即變數遞增。在每次點選時,值都會遞增並顯示。
以下是我們在瀏覽器中獲得的輸出。
.prevent
語法
<a href = "http://www.google.com" v-on:click.prevent = "clickme">Click Me</a>
示例
<html>
<head>
<title>VueJs Instance</title>
<script type = "text/javascript" src = "js/vue.js"></script>
</head>
<body>
<div id = "databinding">
<a href = "http://www.google.com" v-on:click = "clickme" target = "_blank" v-bind:style = "styleobj">Click Me</a>
</div>
<script type = "text/javascript">
var vm = new Vue({
el: '#databinding',
data: {
clicknum : 0,
clicknum1 :0,
styleobj: {
color: '#4CAF50',
marginLeft: '20px',
fontSize: '30px'
}
},
methods : {
clickme : function() {
alert("Anchor tag is clicked");
}
}
});
</script>
</body>
</html>
輸出
如果我們點選 clickme 連結,它將傳送一個警報“錨標籤被點選”,並且它將在新標籤頁中開啟連結 https://www.google.com,如下面的螢幕截圖所示。
現在這以正常方式工作,即連結按我們想要的方式開啟。如果我們不希望連結開啟,我們需要向事件新增一個修飾符“prevent”,如下面的程式碼所示。
<a href = "http://www.google.com" v-on:click.prevent = "clickme" target = "_blank" v-bind:style = "styleobj">Click Me</a>
新增後,如果我們點選按鈕,它將傳送一條警報訊息,並且不再開啟連結。prevent 修飾符阻止連結開啟,並且只執行分配給標籤的方法。
示例
<html>
<head>
<title>VueJs Instance</title>
<script type = "text/javascript" src = "js/vue.js"></script>
</head>
<body>
<div id = "databinding">
<a href = "http://www.google.com" v-on:click.prevent = "clickme" target = "_blank" v-bind:style = "styleobj">Click Me</a>
</div>
<script type = "text/javascript">
var vm = new Vue({
el: '#databinding',
data: {
clicknum : 0,
clicknum1 :0,
styleobj: {
color: '#4CAF50',
marginLeft: '20px',
fontSize: '30px'
}
},
methods : {
clickme : function() {
alert("Anchor tag is clicked");
}
}
});
</script>
</body>
</html>
輸出
點選連結時,它將顯示警報訊息,並且不再開啟 url。
事件 - 鍵修飾符
VueJS 提供了鍵修飾符,基於這些修飾符,我們可以控制事件處理。假設我們有一個文字框,我們希望僅在按下 Enter 時呼叫該方法。我們可以透過向事件新增鍵修飾符來做到這一點,如下所示。
語法
<input type = "text" v-on:keyup.enter = "showinputvalue"/>
我們想要應用於事件的鍵是 V-on.eventname.keyname(如上所示)
我們可以使用多個鍵名。例如,V-on.keyup.ctrl.enter
示例
<html>
<head>
<title>VueJs Instance</title>
<script type = "text/javascript" src = "js/vue.js"></script>
</head>
<body>
<div id = "databinding">
<input type = "text" v-on:keyup.enter = "showinputvalue" v-bind:style = "styleobj" placeholder = "Enter your name"/>
<h3> {{name}}</h3>
</div>
<script type = "text/javascript">
var vm = new Vue({
el: '#databinding',
data: {
name:'',
styleobj: {
width: "30%",
padding: "12px 20px",
margin: "8px 0",
boxSizing: "border-box"
}
},
methods : {
showinputvalue : function(event) {
this.name=event.target.value;
}
}
});
</script>
</body>
</html>
輸出
在文字框中輸入一些內容,我們將在按下 Enter 時看到它被顯示。
自定義事件
父元件可以使用 prop 屬性向其子元件傳遞資料,但是,我們需要在子元件發生更改時告訴父元件。為此,我們可以使用自定義事件。
父元件可以使用 v-on 屬性監聽子元件事件。
示例
<html>
<head>
<title>VueJs Instance</title>
<script type = "text/javascript" src = "js/vue.js"></script>
</head>
<body>
<div id = "databinding">
<div id = "counter-event-example">
<p style = "font-size:25px;">Language displayed : <b>{{ languageclicked }}</b></p>
<button-counter
v-for = "(item, index) in languages"
v-bind:item = "item"
v-bind:index = "index"
v-on:showlanguage = "languagedisp"></button-counter>
</div>
</div>
<script type = "text/javascript">
Vue.component('button-counter', {
template: '<button v-on:click = "displayLanguage(item)"><span style = "font-size:25px;">{{ item }}</span></button>',
data: function () {
return {
counter: 0
}
},
props:['item'],
methods: {
displayLanguage: function (lng) {
console.log(lng);
this.$emit('showlanguage', lng);
}
},
});
var vm = new Vue({
el: '#databinding',
data: {
languageclicked: "",
languages : ["Java", "PHP", "C++", "C", "Javascript", "C#", "Python", "HTML"]
},
methods: {
languagedisp: function (a) {
this.languageclicked = a;
}
}
})
</script>
</body>
</html>
輸出
以上程式碼展示了父元件和子元件之間的資料傳遞。
元件使用以下程式碼建立。
<button-counter v-for = "(item, index) in languages" v-bind:item = "item" v-bind:index = "index" v-on:showlanguage = "languagedisp"> </button-counter>
有一個 v-for 屬性,它將迴圈遍歷 languages 陣列。陣列中包含一列語言。我們需要將詳細資訊傳送到子元件。陣列的值儲存在 item 和 index 中。
v-bind:item = "item" v-bind:index = "index"
要引用陣列的值,我們需要先將其繫結到一個變數,並且使用 props 屬性引用該變數,如下所示。
Vue.component('button-counter', {
template: '<button v-on:click = "displayLanguage(item)"><span style = "font-size:25px;">{{ item }}</span></button>',
data: function () {
return {
counter: 0
}
},
props:['item'],
methods: {
displayLanguage: function (lng) {
console.log(lng);
this.$emit('showlanguage', lng);
}
},
});
props 屬性包含陣列形式的 item。我們也可以引用索引,如下所示:
props:[‘item’, ‘index’]
元件中還添加了一個事件,如下所示:
<button-counter v-for = "(item, index) in languages" v-bind:item = "item" v-bind:index = "index" v-on:showlanguage = "languagedisp"> </button-counter>
事件的名稱是 showlanguage,它呼叫一個名為 languagedisp 的方法,該方法在 Vue 例項中定義。
在元件中,模板定義如下:
template: '<button v-on:click = "displayLanguage(item)"><span style = "font-size:25px;">{{ item }}</span></button>',
建立了一個按鈕。按鈕將根據語言陣列中的計數建立。點選按鈕時,會呼叫一個名為 displayLanguage 的方法,並將點選的按鈕項作為引數傳遞給函式。現在,元件需要將點選的元素髮送到父元件以進行顯示,操作如下:
Vue.component('button-counter', {
template: '<button v-on:click = "displayLanguage(item)"><span style = "font-size:25px;">{{ item }}</span></button>',
data: function () {
return {
counter: 0
}
},
props:['item'],
methods: {
displayLanguage: function (lng) {
console.log(lng);
this.$emit('showlanguage', lng);
}
},
});
方法 displayLanguage 呼叫 this.$emit(‘showlanguage’, lng);
$emit 用於呼叫父元件方法。方法 showlanguage 是在元件上使用 v-on 給出的事件名稱。
<button-counter v-for = "(item, index) in languages" v-bind:item = "item" v-bind:index = "index" v-on:showlanguage = "languagedisp"> </button-counter>
我們正在傳遞一個引數,即點選的語言名稱,傳遞到主父 Vue 例項的方法,該方法定義如下。
var vm = new Vue({
el: '#databinding',
data: {
languageclicked: "",
languages : ["Java", "PHP", "C++", "C", "Javascript", "C#", "Python", "HTML"]
},
methods: {
languagedisp: function (a) {
this.languageclicked = a;
}
}
})
在這裡,emit 觸發 showlanguage,進而從 Vue 例項方法中呼叫 languagedisp。它將點選的語言值分配給變數 languageclicked,並在瀏覽器中顯示,如下面的螢幕截圖所示。
<p style = "font-size:25px;">Language displayed : <b>{{ languageclicked }}</b></p>
以下是我們在瀏覽器中獲得的輸出。