---
# System prepended metadata

title: Vue.js - `computed`
tags: [Vue.js]

---

---
tags: Vue.js
---

# Vue.js - `computed`

## 特性

### `computed`
- 主要用來處理複雜邏輯運算
- 跟著來源資料變化
- 有暫存機制 (cache)
- 必須是 function 無法帶參數，且會 return 一個值


## 差異

### `methods` & `computed` & `watch`
- `computed`：
    - 監控資料更動後，重新運算結果呈現於畫面上
    - 一般來說不會修改資料，只會回傳用於畫面呈現的資料

- `methods`：
    - 互動的函式，需要觸發才會運作
    - 會用來修改資料內容，建議用作主動觸發時

- `watch`
    - 監控特定資料變化，當值變動的時，做某些事


## `getter` & `setter`

### `getter` (讀取)
- 要搭配 return 使用
- 內部觀察的資料有改變時會被觸發

### `setter` (設值)
- 被觀察的物件本身有改變時會被觸發

***

## 範例

### 金額轉換
```htmlembedded=
<p>1日元=0.26台幣 , 1美金=28.45台幣</p>
<v-text-field v-model="twd" label="台幣:"></v-text-field>
<v-text-field v-model="jpy" label="日元:"></v-text-field>
<v-text-field v-model="usd" label="美金:"></v-text-field>
```
```javascript=+
export default {
    data: () => ({
        twd: 100
    }),
    computed: {
        jpy: {
            get() {
                return Number.parseFloat(Number(this.twd) / 0.26).toFixed(3)
            },
            set(val) {
                this.twd = Number.parseFloat(Number(val) * 0.26).toFixed(3)
            }
        },
        usd: {
            get() {
                return Number.parseFloat(Number(this.twd) / 28.45).toFixed(3)
            },
            set(val) {
                this.twd = Number.parseFloat(Number(val) * 28.45).toFixed(3)
            }
        }
    }
}
```
![](https://i.imgur.com/qAcHY0O.gif)

### 參考文件
- [getter and setter 說明](https://pjchender.blogspot.com/2017/05/vue-computed-getter-setter.html)