¶Ô±ÈÐÂÎļþ |
| | |
| | | import { ref, reactive, computed } from 'vue'; |
| | | import { onShow } from '@dcloudio/uni-app'; |
| | | |
| | | /** |
| | | * å°åä¿¡æ¯æ¥å£ |
| | | */ |
| | | export interface AddressInfo { |
| | | id: string; // å°åID |
| | | name: string; // æ¶è´§äººå§å |
| | | phone: string; // ææºå·ç (å·²è±æ) |
| | | region: string; // å°åº(å¦: 广ä¸çæ·±å³å¸åå±±åº) |
| | | address: string; // 详ç»å°å |
| | | tag: string; // å°åæ ç¾(å¦: å®¶ãå
¬å¸ã妿 ¡) |
| | | isDefault: boolean; // æ¯å¦ä¸ºé»è®¤å°å |
| | | } |
| | | |
| | | /** |
| | | * 示ä¾å°åæ°æ® |
| | | */ |
| | | const sampleAddresses: AddressInfo[] = [ |
| | | { |
| | | id: '1', |
| | | name: 'å¼ ä¸', |
| | | phone: '13712348888', |
| | | region: '广ä¸çæ·±å³å¸åå±±åº', |
| | | address: 'ç§æååè·¯888å·åæ°å¤§å¦A座10楼', |
| | | tag: 'å
¬å¸', |
| | | isDefault: true |
| | | }, |
| | | { |
| | | id: '2', |
| | | name: 'æå', |
| | | phone: '13912345678', |
| | | region: '广ä¸çæ·±å³å¸ç¦ç°åº', |
| | | address: 'ç¦ä¸è·¯1000å·æµ·å大å¦B座20楼2001室', |
| | | tag: 'å®¶', |
| | | isDefault: false |
| | | }, |
| | | { |
| | | id: '3', |
| | | name: 'çäº', |
| | | phone: '15812342233', |
| | | region: '广ä¸ç广å·å¸å¤©æ²³åº', |
| | | address: '天河路100å·å¤©æ²³åè´ç©ä¸å¿éè¿å°åºAæ 3åå
701室', |
| | | tag: '妿 ¡', |
| | | isDefault: false |
| | | } |
| | | ]; |
| | | |
| | | // å
±äº«çå°åæ°æ® |
| | | const addressStore = { |
| | | list: ref<AddressInfo[]>([]), |
| | | tags: ref(['å®¶', 'å
¬å¸', '妿 ¡']) |
| | | }; |
| | | |
| | | /** |
| | | * æ ¼å¼åææºå·ï¼ä¸é´4ä½ç¨æå·ä»£æ¿ |
| | | */ |
| | | export function formatPhoneNumber(phone: string): string { |
| | | return phone.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2'); |
| | | } |
| | | |
| | | /** |
| | | * å°åå表页é¢Hook |
| | | * @description æä¾å°ååè¡¨é¡µé¢æéçç¶æåæ¹æ³ |
| | | */ |
| | | export function useAddressListPage() { |
| | | // ä»å
±äº«storeè·åååºå¼æ°æ® |
| | | const addressList = addressStore.list; |
| | | |
| | | // 使ç¨è®¡ç®å±æ§è®¡ç®æ¯å¦ä¸ºç©ºç¶æ |
| | | const emptyStatus = computed(() => addressList.value.length === 0); |
| | | |
| | | // æ´æ°å°åå表 |
| | | function refreshAddressList() { |
| | | addressList.value = sampleAddresses |
| | | // å®é
项ç®ä¸ï¼è¿éåºè¯¥è°ç¨APIè·åææ°çå°åå表 |
| | | // const response = await api.getAddressList(); |
| | | // addressList.value = response.data; |
| | | } |
| | | |
| | | // 设置é»è®¤å°å |
| | | function setDefaultAddress(id: string): boolean { |
| | | const index = addressList.value.findIndex(item => item.id === id); |
| | | |
| | | if (index === -1) return false; |
| | | |
| | | // æ´æ°ææå°åçé»è®¤ç¶æ |
| | | addressList.value = addressList.value.map(item => ({ |
| | | ...item, |
| | | isDefault: item.id === id |
| | | })); |
| | | |
| | | return true; |
| | | } |
| | | |
| | | // å é¤å°å |
| | | function deleteAddress(id: string): boolean { |
| | | const initialLength = addressList.value.length; |
| | | addressList.value = addressList.value.filter(item => item.id !== id); |
| | | return addressList.value.length !== initialLength; |
| | | } |
| | | |
| | | // 页颿¾ç¤ºæ¶å·æ°æ°æ® |
| | | onShow(() => { |
| | | refreshAddressList(); |
| | | }); |
| | | |
| | | return { |
| | | // ååºå¼ç¶æ |
| | | addressList, |
| | | emptyStatus, |
| | | // æ¹æ³ |
| | | setDefaultAddress, |
| | | deleteAddress, |
| | | refreshAddressList |
| | | }; |
| | | } |
| | | |
| | | /** |
| | | * å°åç¼è¾é¡µé¢Hook |
| | | * @description æä¾å°åç¼è¾é¡µé¢æéçç¶æåæ¹æ³ |
| | | */ |
| | | export function useAddressEditPage() { |
| | | // ä»å
±äº«storeè·åååºå¼æ°æ® |
| | | const addressList = addressStore.list; |
| | | const addressTags = addressStore.tags; |
| | | |
| | | // 页é¢ç¶æ |
| | | const isEdit = ref(false); |
| | | const editId = ref(''); |
| | | const defaultAddress = ref(false); |
| | | const selectedTag = ref('å®¶'); |
| | | |
| | | // è¡¨åæ°æ® |
| | | const form = reactive({ |
| | | name: '', |
| | | phone: '', |
| | | region: '', |
| | | address: '' |
| | | }); |
| | | |
| | | // å è½½ç¼è¾æ°æ® |
| | | function loadAddressData(id: string): boolean { |
| | | const address = addressList.value.find(item => item.id === id); |
| | | |
| | | if (!address) return false; |
| | | |
| | | // å¡«å
è¡¨åæ°æ® |
| | | form.name = address.name; |
| | | form.phone = address.phone; |
| | | form.region = address.region; |
| | | form.address = address.address; |
| | | selectedTag.value = address.tag; |
| | | defaultAddress.value = address.isDefault; |
| | | |
| | | return true; |
| | | } |
| | | |
| | | // åå§åé¡µé¢ |
| | | function initEditPage(id?: string) { |
| | | // éç½®ç¶æ |
| | | isEdit.value = !!id; |
| | | editId.value = id || ''; |
| | | defaultAddress.value = false; |
| | | selectedTag.value = 'å®¶'; |
| | | |
| | | form.name = ''; |
| | | form.phone = ''; |
| | | form.region = ''; |
| | | form.address = ''; |
| | | |
| | | // 妿æ¯ç¼è¾æ¨¡å¼ï¼å è½½å°åæ°æ® |
| | | if (id) { |
| | | loadAddressData(id); |
| | | } |
| | | } |
| | | |
| | | // ä¿åå°å |
| | | function saveAddress(): boolean { |
| | | if (isEdit.value) { |
| | | // ç¼è¾ç°æå°å |
| | | const index = addressList.value.findIndex(item => item.id === editId.value); |
| | | if (index === -1) return false; |
| | | |
| | | // å¦æè®¾ä¸ºé»è®¤ï¼æ´æ°å
¶ä»å°å |
| | | if (defaultAddress.value) { |
| | | addressList.value = addressList.value.map(item => { |
| | | if (item.id !== editId.value) { |
| | | return { ...item, isDefault: false }; |
| | | } |
| | | return item; |
| | | }); |
| | | } |
| | | |
| | | // æ´æ°å½åå°å |
| | | addressList.value[index] = { |
| | | ...addressList.value[index], |
| | | name: form.name, |
| | | phone: form.phone, |
| | | region: form.region, |
| | | address: form.address, |
| | | tag: selectedTag.value, |
| | | isDefault: defaultAddress.value |
| | | }; |
| | | } else { |
| | | // æ·»å æ°å°å |
| | | const newId = Date.now().toString(); |
| | | |
| | | // å¦æè®¾ä¸ºé»è®¤ï¼æ´æ°å
¶ä»å°å |
| | | if (defaultAddress.value) { |
| | | addressList.value = addressList.value.map(item => ({ |
| | | ...item, |
| | | isDefault: false |
| | | })); |
| | | } |
| | | |
| | | // æ·»å æ°å°å |
| | | addressList.value.push({ |
| | | id: newId, |
| | | name: form.name, |
| | | phone: form.phone, |
| | | region: form.region, |
| | | address: form.address, |
| | | tag: selectedTag.value, |
| | | isDefault: defaultAddress.value |
| | | }); |
| | | } |
| | | |
| | | return true; |
| | | } |
| | | |
| | | // å é¤å°å |
| | | function deleteAddress(): boolean { |
| | | if (!isEdit.value) return false; |
| | | |
| | | const initialLength = addressList.value.length; |
| | | addressList.value = addressList.value.filter(item => item.id !== editId.value); |
| | | |
| | | return addressList.value.length !== initialLength; |
| | | } |
| | | |
| | | return { |
| | | // ååºå¼ç¶æ |
| | | isEdit, |
| | | editId, |
| | | form, |
| | | defaultAddress, |
| | | selectedTag, |
| | | addressTags, |
| | | // æ¹æ³ |
| | | initEditPage, |
| | | saveAddress, |
| | | deleteAddress |
| | | }; |
| | | } |