---
# System prepended metadata

title: Computed 運算基礎運用 ex. 搜尋 (3-2)
tags: [3. Options API, Vue]

---

# Computed 運算基礎運用 ex. 搜尋 (3-2)
###### tags: `Vue`、`3. Options API`
2022.3.3

&emsp;&emsp;Computed用來做隨時監聽動 (例如：匯率)，當Computed中的資料有變化時，系統會自動跑computed程式。


### 1. 一般模式(「預設為Gatter」 只有取值，沒有寫入)
#### 範例1 : 計算購物車總金額
```
<ul>
        <h2>商品列表</h2>
        <li v-for="item in products" :key="item.name">
            {{ item.name }} / {{ item.price}} 元
            <button @click="addcart(item)"> 加入購物車 </button>
        </li>

        <h2>購物車</h2>
        <li v-for="item in carts" :key="item.name">
            {{ item.name }} / {{ item.price}} 元
        </li>
            
        <h3>總金額: {{ total }}</h3>
</ul>

<script>
data(){
        return{
                products:[
                    {name:'商品1',price:100},
                    {name:'商品2',price:200},
                    {name:'商品2',price:300}
                    ],
                carts:[]
                }  
        },
computed:{
            total(){
                    let total = 0;
                    this.carts.forEach(function(item){
                        total+=item.price;
                    })
                    return total
                   },
            },
methods:{
            addcart(item){
                    this.carts.push(item);
                }
        }
</script>
```

#### 範例2 : 常見技巧-搜尋
```
<ul>
<h2> 搜尋 <h2>
<input type="search" v-model="search">
    <li v-for="item in productfileter" :key="item.name">
        {{ item.name }} / {{ item.price }} 元
    </li>
<ul>


<script>
data(){
    return{
        product : [
            {name:'玉米蛋餅' , price:30},
            {name:'火腿蛋餅' , price:40},
            {name:'起司蛋餅' , price:20}
        ],
        search : '',
    }
    
},
computed:{
    productfileter(){
        return this.product.filter((item)=>{
            return item.name.match(this.search)
        })
    },
}
</script>
```
### 2. Getter 與 Setter 模式
* Getter : 只有取值，沒有寫入。
* Setter : 能對數據進行更改，並寫入。
```
原價 : {{ or_price }} 元 <p>
折扣後 : {{ new_price }} 元 <p>
折扣 : <input type="number" v-model.number = "discount"> 折
<button @click="do_discount=discount">確認</button>

<script>
    data(){
            return{
                    or_price: 100,
                    new_price: 0,
                    discount : 0,
                  }
          },
    computed:{
                do_discount:{
                        get(){
                            //讀取值，並return渲染
                        },
                        set(val){ 
                            this.new_price = (val/10) * this.or_price  
                        }
                  }
                    
     }
</script>
```