- 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 方法也被刪除了。