---
# System prepended metadata

title: Vue3 購物車-3地址

---

# Vue3 購物車-3地址
## 多層下拉式地址
select、option 寫的參數比較不一樣
select 除了要綁定使用者選了哪個值，還要根據選的值影響其他內容，所以還有綁事件@change。
option 則是單純的把縣市清單跑迴圈。
```html=
<div>
  <div>
    <input placeholder="郵遞區號" readonly type="text" :value="order.pay.zip">
  </div>
  <div>
    <select @change="pcity($event.target.value)" v-model="order.pay.city">
      <option value="">選擇縣市</option>
      <option v-for="city in order.pay.citys" :value="city">{{city}}</option>
    </select>
  </div>
  <div>
    <select @change="pcounty($event.target.value)" v-model="order.pay.county">
      <option v-for="country in order.pay.countys" :value="country">{{country}}</option>
    </select>
  </div>
</div>
```
## vue 方法
data的設定，縣市的部份有另一份縣市陣列的js
把pay, receive 各自設定是有原因的。後面要做資料copy時，就不用一個個設定，會是整個覆蓋，包括了清單與選的值
```javascript=
data() {
  return {
    order: {
      pay: {
        citys: area.counties,
        city: '',
        countys: [],
        county: '',
        zip: '',
      },
      receive: {
        citys: area.counties,
        city: '',
        countys: [],
        county: '',
        zip: '',
      }
    },
  }
}
```
methods 的方法會比較多
當我選了哪個縣市，找到index，會載入該縣市的區域清單
```javascript=
methods: {
  pcity(city) {
    this.order.pay.zip = '';
    if (city == '') {
      this.order.pay.countys = [];
      return;
    }
    this.order.pay.citys.forEach((v, k) => {
      if (v == city) {
        let districts = area.districts[k];
        this.order.pay.countys = districts[0];
      }
    });
  },
  pcounty(country) {
    this.order.pay.zip = '';
    if (country == '') return;
    this.order.pay.citys.forEach((v, k) => {
      if (v == this.order.pay.city) {
        this.order.pay.countys.forEach((cv, ck) => {
          if (country == cv) this.order.pay.zip = area.districts[k][1][ck];
        })
      }
    });
  },
  rcity(city) {
    this.order.receive.zip = '';
    if (city == '') {
      this.order.receive.countys = [];
      return;
    }
    this.order.receive.citys.forEach((v, k) => {
      if (v == city) {
        let districts = area.districts[k];
        this.order.receive.countys = districts[0];
      }
    });
  },
  rcounty(country) {
    this.order.receive.zip = '';
    if (country == '') return;
    this.order.receive.citys.forEach((v, k) => {
      if (v == this.order.receive.city) {
        this.order.receive.countys.forEach((cv, ck) => {
          if (country == cv) this.order.receive.zip = area.districts[k][1][ck];
        })
      }
    });
  },
},
```

## 資料copy(不是同步)
一般確認資料時，在收件人都會有一個「與訂購人資料相同請勾」的選項！
```html=
<input type="checkbox" value="1" @click="same_addr($event.target.checked)">同訂購人資訊請打勾。
```
會把寄件人key的所有資料，copy一份覆蓋收件人。
一般我們都會用 a = b 的方式，把b的資料丟給a就結束了
像這樣非常簡單
```javascript=
$('#a').val($('#b').val());
```

但如果在vue裡面寫這樣，可是會把pay與receive做資料同步哦
相當於v-model的感覺
```javascript=
this.order.receive = this.order.pay;
```
之後不管寄件人怎麼打，收件人都會一模一樣，並且無法取消綁定!!!
這時methods same_addr(copy)，前面設定是以勾選才copy，所以要這樣設定，就會覆蓋過去，且兩邊資料互不影響
```javascript=
same_addr(copy) {
  if (!copy) return;
  this.order.receive = Object.assign({}, this.order.pay);
}
```
