---
# System prepended metadata

title: "\U0001F3C5Day11 - Vue.js 的黑魔法：Watch"
tags: [2024 Vue 前端新手營 - Composition API]

---

# 🏅Day11 - Vue.js 的黑魔法：Watch

## Watch

`watch` 通常用來監聽資料的變化並在資料變化時執行特定的操作，

在處理響應式資料時很常會用到，特別是當需要根據資料的變化來觸發一些操作。

例如下面的範例是一個簡單利用 `watch` 來做驗證欄位的方式，

當輸入框發生變化時，會即時的驗證輸入的內容，並且顯示出錯誤。

<iframe height="300" style="width: 100%;" scrolling="no" title="Composition API：computed 範例 (2)" src="https://codepen.io/yen-kg/embed/OJYeZzp?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true">
  See the Pen <a href="https://codepen.io/yen-kg/pen/OJYeZzp">
  Composition API：computed 範例 (2)</a> by Yen Kg (<a href="https://codepen.io/yen-kg">@yen-kg</a>)
  on <a href="https://codepen.io">CodePen</a>.
</iframe>

## 監聽多個目

這裡也可以使用一個 `watch` 搭配陣列的方式來監聽多個欄位，例如以下範例：

* 新增了 `Username`、`Phone` 的欄位，當輸入框發生變化時，會同時驗證其他的欄位。

<iframe height="300" style="width: 100%;" scrolling="no" title="Composition API：watch 範例 (1)" src="https://codepen.io/yen-kg/embed/ZENdMaj?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true">
  See the Pen <a href="https://codepen.io/yen-kg/pen/ZENdMaj">
  Composition API：watch 範例 (1)</a> by Yen Kg (<a href="https://codepen.io/yen-kg">@yen-kg</a>)
  on <a href="https://codepen.io">CodePen</a>.
</iframe>


## 深層監聽 deep

`deep` 是用來深層監聽物件內部的變化，當要監聽物件內的資料時，

就必須在結尾處加上 `deep`，例如以下範例：

<iframe height="300" style="width: 100%;" scrolling="no" title="Composition API：watch 範例 (3)" src="https://codepen.io/yen-kg/embed/PovrdeW?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true">
  See the Pen <a href="https://codepen.io/yen-kg/pen/PovrdeW">
  Composition API：watch 範例 (3)</a> by Yen Kg (<a href="https://codepen.io/yen-kg">@yen-kg</a>)
  on <a href="https://codepen.io">CodePen</a>.
</iframe>

## 即時監聽 immediate

將 `immediate` 選加入到 watch 中，這樣監聽器會在監聽對象初始化時立即執行一次，

例如下面範例，在還沒輸入觸發欄位之前，一進畫面就立即先觸發驗證功能了。

<iframe height="300" style="width: 100%;" scrolling="no" title="Composition API：watch 範例 (3)" src="https://codepen.io/yen-kg/embed/OJYeowm?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true">
  See the Pen <a href="https://codepen.io/yen-kg/pen/OJYeowm">
  Composition API：watch 範例 (3)</a> by Yen Kg (<a href="https://codepen.io/yen-kg">@yen-kg</a>)
  on <a href="https://codepen.io">CodePen</a>.
</iframe>

題目
---
操作 [這個模板](https://codepen.io/yen-kg/pen/MWdMqqP)，執行以下要求（只能操作 script 的部分）：

* 請利用 `watch` 的方式，替「**購買人姓名**」的 `input` 加上欄位驗證，需合下面條件：

**條件：名稱欄位需要剛好三個字，否則就顯示「需要正確的輸入名稱」的紅字提示。**

![image](https://hackmd.io/_uploads/SkzE3wFv0.png)


## 回報流程

將答案寫在 CodePen 並複製 CodePen 連結貼至底下回報就算完成了喔! 
解答位置請參考下圖（需打開程式碼的部分觀看）

![](https://i.imgur.com/vftL5i0.png)

<!-- 解答：  
 watch(() => user.value.username, (newVal) => {
  if (newVal.length === 3) {
    errors.value.username = '';
  } else {
    errors.value.username = '需要正確的輸入名稱';
  }
});
-->

回報區
---

|     Discord      |                           CodePen / 答案                            |
|:----------------:|:-------------------------------------------------------------------:|
| Michael | [CodePen](https://codepen.io/RenHuang-Huang/pen/GRbGKMJ) |
| anderson666 | [CodePen](https://codepen.io/goodmanbuild/pen/vYqezWX) |
| kuolun | [CodePen](https://codepen.io/kuolun/pen/yLdzxxZ) |
| Aden | [CodePen](https://codepen.io/Osases/pen/PorJdvQ) |
| 末次 | [CodePen](https://codepen.io/yunjulee/pen/jOjGvJQ) |
| Mars | [CodePen](https://codepen.io/MarsKuo/pen/ZEdXqzg) |
| mu mu | [CodePen](https://codepen.io/ishuki916/pen/XWLexRd) |
| 阿B | [CodePen](https://codepen.io/Abby-Chou/pen/ExBwdJv) |
| Shin | [CodePen](https://codepen.io/shin9626/pen/vYqeQmM) |
| Hilda | [CodePen](https://codepen.io/vwquikad-the-vuer/pen/yLdzQRP) |
| Zhu | [CodePen](https://codepen.io/codepenplayer/pen/VwJMGgP) |
| 小趴 | [Codepen](https://codepen.io/papa2415/pen/PorJXOj)|
|sandra191919| [Codepen](https://codepen.io/a0960529965/pen/JjQreqz)|
| Ariel | [CodePen](https://codepen.io/ariel0510/pen/wvLrREy) |
| Tough life | [CodePen](https://codepen.io/hakuei0115/pen/eYwGxKz) |
| Eric0823 | [CodePen](https://codepen.io/a7901477/pen/GRbMzGY) |
| Kevin Wei | [CodePen](https://codepen.io/kevin21305991/pen/BagwMOb) |
| cherylxie | [CodePen](https://codepen.io/fi7933201/pen/vYqebPz) |
| Anna | [CodePen](https://codepen.io/anna971053/pen/vYqePqE) |
|rjjq| [CodePen](https://codepen.io/rjjq/pen/OJexGrz)|
|YO| [CodePen](https://codepen.io/Y-1717/pen/oNrGRVq)|
| 蛋黃 |[CodePen](https://codepen.io/yiyun12o9/pen/oNrGRrd) |
| KK | [CodePen](https://reurl.cc/7d31Mk) |
| Letitia | [Codepen](https://codepen.io/letitia-chiu/pen/Yzormpy) |
| JC | [Codepen](https://codepen.io/jy_123/pen/rNEYBBB) |
| 皮克 | [Codepen](https://codepen.io/bad-527boy/pen/zYVPYBE) |
|HsienLu|[CodePen](https://codepen.io/Hsienlu/pen/JjQOXGK)|
| 好了啦 |[CodePen](https://codepen.io/j-z-the-flexboxer/pen/KKjyMpV)|
| Yuwen | [CodePen](https://codepen.io/Yuwen-the-reactor/pen/oNroYEe)|
| dodo | [CodePen](https://codepen.io/MissDouble/pen/NWZwjKB) |
| zaoannihao | [CodePen](https://codepen.io/ckhwdvrx-the-solid/pen/jOjawGr) |
| imsmallnew | [CodePen](https://codepen.io/imsmallnew/pen/BagmVwO) |
| SKey | [CodePen](https://codepen.io/Dale-Chien/pen/RwzjqVE) |
| Renee | [CodePen](https://codepen.io/renee_wu/pen/ExBbrXV) |
| Barry1104 | [CodePen](https://codepen.io/barry1104/pen/YzoYPpK) |
| duchi | [CodePen](https://codepen.io/sqaz0502/pen/yLdprdE) |
| anthy7154 | [CodePen](https://codepen.io/hnhmgzbw-the-sans/pen/wvLpVMK) |
| Zhen | [CodePen](https://codepen.io/yunnnz/pen/gONvwza) |
| 貢波波夫 | [CodePen](https://codepen.io/mxgrfgcr-the-bashful/pen/rNEJoyY) |
| ya_meow |[Codepen](https://codepen.io/gkfxzvcb-the-bashful/pen/ZEdrwER)| 
| CharisLai | [CodePen](https://codepen.io/charislai/pen/XWLZwXy) |
| cami | [CodePen](https://codepen.io/irisLife/pen/JjQLMJv)|
| Danny | [CodePen](https://codepen.io/irisLife/pen/JjQLMJv)|
| World | [CodePen](https://codepen.io/HexschoolVuePujols/pen/poXVdwG)|
| Tatsu | [CodePen](https://codepen.io/chindesu0207/pen/wvLjXWG) |
| Ching | [CodePen](https://codepen.io/huangching/pen/gONqmop) |
| Triple | [CodePen](https://codepen.io/riku30/pen/poXXBpX) |
| Eden | [Codepen](https://codepen.io/iseden/pen/OJKRYMr)|
| 叮咚 | [Codepen](https://codepen.io/pinchieh-lin/pen/OPJbOPa)|
<!-- 

 | user | [CodePen]() |

-->