
- VueJS 教程
- VueJS - 首頁
- VueJS - 概述
- VueJS - 環境搭建
- VueJS - 簡介
- VueJS - 例項
- VueJS - 模板
- VueJS - 元件
- VueJS - 計算屬性
- VueJS - 偵聽器
- VueJS - 資料繫結
- VueJS - 事件
- VueJS - 渲染
- VueJS - 過渡與動畫
- VueJS - 指令
- VueJS - 路由
- VueJS - Mixins
- VueJS - 渲染函式
- VueJS - 響應式介面
- VueJS - 例子
- VueJS 有用資源
- VueJS - 快速指南
- VueJS - 有用資源
- VueJS - 討論
VueJS - 響應式介面
VueJS 提供了向動態新增的屬性新增響應性的選項。假設我們已經建立了 Vue 例項,並且需要新增 watch 屬性。可以按如下方式操作:
示例
<html> <head> <title>VueJs Instance</title> <script type = "text/javascript" src = "js/vue.js"></script> </head> <body> <div id = "app"> <p style = "font-size:25px;">Counter: {{ counter }}</p> <button @click = "counter++" style = "font-size:25px;">Click Me</button> </div> <script type = "text/javascript"> var vm = new Vue({ el: '#app', data: { counter: 1 } }); vm.$watch('counter', function(nval, oval) { alert('Counter is incremented :' + oval + ' to ' + nval + '!'); }); setTimeout( function(){ vm.counter = 20; },2000 ); </script> </body> </html>
在 data 物件中定義了一個名為 counter 的屬性,其值為 1。單擊按鈕時,計數器會遞增。
Vue 例項已建立。要向其新增 watch,需要執行以下操作:
vm.$watch('counter', function(nval, oval) { alert('Counter is incremented :' + oval + ' to ' + nval + '!'); });
我們需要使用 `$watch` 在 Vue 例項外部新增 watch。添加了一個警報,顯示計數器屬性的值變化。還添加了一個計時器函式,即 `setTimeout`,它將計數器值設定為 20。
setTimeout( function(){ vm.counter = 20; },2000 );
每當計數器發生更改時,watch 方法中的警報都會觸發,如下面的螢幕截圖所示。

VueJS 無法檢測屬性的新增和刪除。最好的方法是在 Vue 例項中預先宣告所有需要響應性的屬性。如果需要在執行時新增屬性,可以使用 Vue 全域性方法 `Vue.set` 和 `Vue.delete`。
Vue.set
此方法用於在物件上設定屬性。它用於解決 Vue 無法檢測屬性新增的限制。
語法
Vue.set( target, key, value )
其中:
target:可以是物件或陣列
key:可以是字串或數字
value:可以是任何型別
讓我們來看一個例子。
示例
<html> <head> <title>VueJs Instance</title> <script type = "text/javascript" src = "js/vue.js"></script> </head> <body> <div id = "app"> <p style = "font-size:25px;">Counter: {{ products.id }}</p> <button @click = "products.id++" style = "font-size:25px;">Click Me</button> </div> <script type = "text/javascript"> var myproduct = {"id":1, name:"book", "price":"20.00"}; var vm = new Vue({ el: '#app', data: { counter: 1, products: myproduct } }); vm.products.qty = "1"; console.log(vm); vm.$watch('counter', function(nval, oval) { alert('Counter is incremented :' + oval + ' to ' + nval + '!'); }); </script> </body> </html>
在上面的例子中,使用以下程式碼段在開始時建立了一個名為 myproduct 的變數。
var myproduct = {"id":1, name:"book", "price":"20.00"};
它在 Vue 例項中作為 data 物件的一部分:
var vm = new Vue({ el: '#app', data: { counter: 1, products: myproduct } });
假設我們想要在建立 Vue 例項後向 myproduct 陣列新增另一個屬性。可以按如下方式操作:
vm.products.qty = "1";
讓我們看看控制檯中的輸出。

如上所示,在 products 中添加了數量。基本新增響應性的 get/set 方法適用於 id、name 和 price,而不適用於 qty。
我們不能僅僅透過新增 Vue 物件來實現響應性。VueJS 主要希望所有屬性都在開始時建立。但是,如果需要稍後新增,可以使用 `Vue.set`。為此,我們需要使用 Vue 全域性方法 `Vue.set`。
示例
<html> <head> <title>VueJs Instance</title> <script type = "text/javascript" src = "js/vue.js"></script> </head> <body> <div id = "app"> <p style = "font-size:25px;">Counter: {{ products.id }}</p> <button @click = "products.id++" style = "font-size:25px;">Click Me</button> </div> <script type = "text/javascript"> var myproduct = {"id":1, name:"book", "price":"20.00"}; var vm = new Vue({ el: '#app', data: { counter: 1, products: myproduct } }); Vue.set(myproduct, 'qty', 1); console.log(vm); vm.$watch('counter', function(nval, oval) { alert('Counter is incremented :' + oval + ' to ' + nval + '!'); }); </script> </body> </html>
我們使用 `Vue.set` 使用以下程式碼段將 qty 新增到陣列中:
Vue.set(myproduct, 'qty', 1);
我們在控制檯中輸出了 Vue 物件,以下是輸出結果:

現在,我們可以看到使用 `Vue.set` 新增的 qty 的 get/set 方法。
Vue.delete
此函式用於動態刪除屬性。
示例
Vue.delete( target, key )
其中:
target:可以是物件或陣列
key:可以是字串或數字
要刪除任何屬性,可以使用 `Vue.delete`,如下面的程式碼所示。
示例
<html> <head> <title>VueJs Instance</title> <script type = "text/javascript" src = "js/vue.js"></script> </head> <body> <div id = "app"> <p style = "font-size:25px;">Counter: {{ products.id }}</p> <button @click = "products.id++" style = "font-size:25px;">Click Me</button> </div> <script type = "text/javascript"> var myproduct = {"id":1, name:"book", "price":"20.00"}; var vm = new Vue({ el: '#app', data: { counter: 1, products: myproduct } }); Vue.delete(myproduct, 'price'); console.log(vm); vm.$watch('counter', function(nval, oval) { alert('Counter is incremented :' + oval + ' to ' + nval + '!'); }); </script> </body> </html>
在上面的例子中,我們使用 `Vue.delete` 使用以下程式碼段從陣列中刪除 price:
Vue.delete(myproduct, 'price');
以下是我們在控制檯中看到的輸出。

刪除後,我們只能看到 id 和 name,因為 price 已被刪除。我們還可以注意到 get/set 方法也被刪除了。