【Vue3】用watch監聽data資料

Vue3

【Vue3】用watch監聽data資料

Vue3


watch新舊值介紹

1
2
3
4
<div id="app">
  <input type="text" v-model="tempName">
  <p>{{ tempName }}</p>
</div>

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
Vue.createApp({
  data(){
    return{
      tempName: "",
    }
  },
  watch:{
    //n = 新輸入的值
    //o = 上一次輸入的值
    tempName(n,o){
      console.log(n,o)
    }
  }
}).mount("#app");

當輸入第一次值的時候,watch


watch監看,textarea字數

1
2
3
4
<div id="app">
  <textarea v-model="tempName" cols="30" rows="5"></textarea>
  <p>您已經輸入了{{ textLength }}個字元</p>
</div>

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
Vue.createApp({
  data(){
    return{
      tempName: "",
      textLength: 0,
    }
  },
  watch:{
    tempName(n,o){
      this.textLength = `${n.length}`
    }
  }
}).mount("#app");


computed監看data值有無更動

1
2
3
4
5
6
7
8
<div id="app">
  <label>商品名稱</label>
  <input type="text" v-model="productName">
  <br>
  <label>缺貨</label>
  <input type="checkbox" v-model="productStock">
  <p>{{ resultText }}</p>
</div>

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
Vue.createApp({
  data(){
    return{
      productName: "",
      productStock: false
    }
  },
  computed:{
    resultText(){
      return `${this.productName}目前${this.productStock?"沒":""}有庫存`
    }
  }
}).mount("#app");


watch監看data值有無更動

1
2
3
4
5
6
7
8
<div id="app">
  <label>商品名稱</label>
  <input type="text" v-model="productName">
  <br>
  <label>缺貨</label>
  <input type="checkbox" v-model="productStock">
  <p>{{ resultText }}</p>
</div>

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
Vue.createApp({
  data(){
    return{
      productName: "",
      productStock: false,
      resultText: ""
    }
  },
  watch:{
    productName(){
      this.resultText = `${this.productName}目前${this.productStock?"沒":""}有庫存`
    },
    productStock(){
      this.resultText = `${this.productName}目前${this.productStock?"沒":""}有庫存`
    }
  }
}).mount("#app");


watch監看data物件有無更動(深層監聽)

1
2
3
4
5
6
7
8
<div id="app">
  <label>商品名稱</label>
  <input type="text" v-model="product.name">
  <br>
  <label>缺貨</label>
  <input type="checkbox" v-model="product.stock">
  <p>{{ resultText }}</p>
</div>

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
Vue.createApp({
  data(){
    return{
      product:{
        name: "",
        stock: false
      },
      resultText: ""
    }
  },
  watch:{
    product:{
      handler(n,o){
        this.resultText = `${this.product.name}目前${this.product.stock?"沒":""}有庫存`
      },
      deep: true
    }
  }
}).mount("#app");

handler(n,o){},deep: true是固定寫法,n是新物件;o是舊物件

Vue3 

其他相關