watch
監聽器監聽data
裡面的值,當值有變化時,就會觸發事件。
watch
監聽一個變數:
<div id="app">
<h3>watch 監聽單一變數</h3>
<label for="name">監聽變數:</label>
<input type="text" id="name" v-model="tempName">
<P>大於五個字: {{ big }}</P>
<p>小於五個字: {{ small }}</p>
</div>
wacth
監聽tempName
裡面的值。
const App = {
data() {
return {
small: "",
tempName: "",
};
},
watch: {
tempName(a, b) {
console.log(a, b);
if(a.length > 5 ){
this.big = `文字超過${b.length}個字`;
}else {
this.small = `文字未超過${a.length}個字`;
}
},
}
};
Vue.createApp(App).mount("#app");
觀察console.log,參數a
為新的值,b
為舊的值,一開始還沒輸入input框,b
會是一個空值。
watch
與computed
不同的地方watch
computed
<div id="app">
<label for="store">店家名稱</label>
<input type="text" v-model="store">
<br>
<label for="productName">商品名稱</label>
<input type="text" v-model="productName">
<br>
<label for="productPrice">商品價格</label>
<input type="number" v-model.number="productPrice">
<p>computed: {{ comVale }}</p>
<p>watch: {{ watchValue }}</p>
</div>
const App = {
data() {
return {
watchValue: "",
// 單一產品
store:"高雄",
productName: "褲子",
productPrice: 500,
};
},
computed: {
comVale() {
return `${this.store},${this.productName},${this.productPrice}`
}
},
watch: {
store() {
this.watchValue = `${this.store},${this.productName},${this.productPrice}`
},
productName() {
this.watchValue = `${this.store},${this.productName},${this.productPrice}`
},
productPrice() {
this.watchValue = `${this.store},${this.productName},${this.productPrice}`
},
}
};
Vue.createApp(App).mount("#app");
第一次進入畫面computed
會先執行一次,而watch
則是等待被觸發。watch
一次只能監聽一個變數,所以這邊就必須寫三個函式來使用,如果變數有更動,就會觸發函式。如果要監聽多個變數產生一個值建議使用computed
,會比較適合。
watch
監聽多個變數<div id="app">
<label for="store">店家名稱:</label>
<input type="text" v-model="product.store"><br>
<label for="productName">商品名稱:</label>
<input type="text" v-model="product.name"><br>
<label for="productPrice">商品價格:</label>
<input type="number" v-model.number="product.price">
<p>value: {{ value }}</p>
</div>
const App = {
data() {
return {
product: {
store:"高雄",
name: "褲子",
price: 500,
},
};
},
watch: {
product: {
handler(n, o) {
console.log(n, o);
this.value = `${this.product.store},${this.product.name},${this.product.price}`
},
deep: true,
}
}
};
Vue.createApp(App).mount("#app");
使用watch
做到多個變數的監聽,data
就要改為物件,watch
裡面改為handler
函式來做觸發,deep
也要改為true
,才會正常運行。