components/address/pcaSelect.vuecss
<template> <div class="pca-select-wrapper"> <x-address title="選擇地區" popup-title="選擇地區" style="display:none;" v-model="chooseAddr" :list="addressData" :show.sync="showAddress" @on-hide="getChoose"> </x-address> </div> </template> <script> import { XAddress, Group } from 'vux' import addrApi from '@/api/order/address.js' // 接口文件,地址數據也能夠從網上查找 export default { components: { XAddress, Group }, props: { // 彈框關閉後是否清除已選擇數據 clearAddrData: { default: false, type: Boolean, require: false } }, data() { return { showAddress: false, // 是否顯示選擇地址彈框 resultPostcode: '', // 郵編 resultAddr: [], // 數據作了處理 最終結果須要處理 省前+0 市前+ 00 區前+ 000 -- 接口返回數據未處理區分省、市、區 chooseAddr: [], // 選擇的地址 addressData: [], // 地址數據列表 ADDR_PRO: [], // 地址-省-數據列表 ADDR_CI: [], // 地址-市-數據列表 ADDR_DIS: [], // 地址-區-數據列表 } }, mounted() { this.getAddrList() }, methods: { // 肯定或取消以後,重置數據 clearAddr() { this.resultPostcode = '' this.resultAddr = [] this.chooseAddr = [] }, // 重置省市區數據 實際數據與最終數據有出入 省前+0 市前+ 00 區前+ 000 最終數據需去掉 initAddrList(provinces, cities, districts) { let _newArry = [] provinces.map(pro => { _newArry.push({ name: pro.provinceName, value: '0' + pro.id, parent: null, postcode: pro.postcode }) }) cities.map(ci => { _newArry.push({ name: ci.cityName, value: '00' + ci.id, parent: '0' + ci.provinceId, postcode: ci.postcode }) }) districts.map(dis => { _newArry.push({ name: dis.districtName, value: '000' + dis.id, parent: '00' + dis.cityId, postcode: dis.postcode }) }) this.addressData = JSON.parse(JSON.stringify(_newArry)) }, // 從本地存儲/接口獲取地址數據 getAddrList() { if (window.localStorage.getItem('ADDR_PRO')) { this.ADDR_PRO = JSON.parse(window.localStorage.getItem('ADDR_PRO')) this.ADDR_CI = JSON.parse(window.localStorage.getItem('ADDR_CI')) this.ADDR_DIS = JSON.parse(window.localStorage.getItem('ADDR_DI')) this.initAddrList(this.ADDR_PRO, this.ADDR_CI, this.ADDR_DIS) return } // 調用接口,返回地址數據信息 addrApi.getAddresses() .then((res)=>{ console.log(res) if(res.data.code == 200) { this.ADDR_PRO = res.data.content.provinces this.ADDR_CI = res.data.content.cities this.ADDR_DIS = res.data.content.districts window.localStorage.setItem('ADDR_PRO', JSON.stringify(this.ADDR_PRO)) window.localStorage.setItem('ADDR_CI', JSON.stringify(this.ADDR_CI)) window.localStorage.setItem('ADDR_DI', JSON.stringify(this.ADDR_DIS)) this.initAddrList(res.data.content.provinces, res.data.content.cities, res.data.content.districts) } else { this.$Message.message(res.data.message) } }) .catch(err => { console.log(err) }) }, // 顯示地址組件 showAddr() { this.showAddress = true }, // 獲取結果 getChoose() { if(this.chooseAddr.length) { this.resultAddr = [] let _arr = JSON.parse(JSON.stringify(this.chooseAddr)) _arr.map((item, idx) => { this.resultAddr.push(item.substr(idx+1)) }) this.resultPostcode = this.ADDR_DIS.filter(item => item.id == this.resultAddr[2])[0].postcode let addrPro = this.ADDR_PRO.filter(item => item.id == this.resultAddr[0])[0].provinceName let addrCity = this.ADDR_CI.filter(item => item.id == this.resultAddr[1])[0].cityName let addrDis = this.ADDR_DIS.filter(item => item.id == this.resultAddr[2])[0].districtName let addrObj = { province: addrPro, city: addrCity, district: addrDis, postcode: this.resultPostcode } //⚠️ 點擊肯定輸出選中的數據信息--addrObj this.$emit('getPostCode', addrObj) if(this.clearAddrData) { this.clearAddr() } } } } } </script>
⚠️ 使用地址組件的vue頁面須要在entry-js文件引入該樣式文件
assets/address/address.scssvue
.vux-cell-box{ background: #20a3ff !important; } .vux-popup-dialog{ background: #fff !important; } // 選擇頭部背景顏色 .vux-popup-header{ background-color: #e8f6ff !important; } // 取消-完成按鈕顏色更改 .vux-popup-header-left, .vux-popup-header-right{ color: #20a3ff !important; } // 選擇頭部底部border顏色更改 .vux-1px-b:after{ border-color: transparent !important; } input::-webkit-input-placeholder { /* WebKit browsers */ color:#999; } input:-moz-placeholder { /* Mozilla Firefox 4 to 18 */ color:#999; } input::-moz-placeholder { /* Mozilla Firefox 19+ */ color:#999; } input:-ms-input-placeholder { /* Internet Explorer 10+ */ color:#999; } textarea::-webkit-input-placeholder { /* WebKit browsers */ color:#999; } textarea:-moz-placeholder { /* Mozilla Firefox 4 to 18 */ color:#999; } textarea::-moz-placeholder { /* Mozilla Firefox 19+ */ color:#999; } textarea:-ms-input-placeholder { /* Internet Explorer 10+ */ color:#999; }
home.vueweb
<template> <div class="edit-address-wrapper">``` <div class="eac-ipt-box" @click="$refs.pcaSel.showAddr()">選擇地址</div> <pca-sel :clearAddrData="true" ref="pcaSel" @getPostCode="getPostCode"></pca-sel> </div> </template> <script> import pcaSel from '@/components/address/pcaSelect' export default { components: { pcaSel }, data() { return {} }, methods: { // 獲取選擇地址結果 getPostCode(val) { if(val) { this.addr = val.province + ' '+ val.city + ' ' + val.district this.province = val.province this.city = val.city this.region = val.district this.postcode = val.postcode } } } } </script>
entry-> jsapi
import '@/assets/address/address.scss';