# 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); } ```