import { ScrollView, View } from '@tarojs/components' import Taro, { useDidShow, usePullDownRefresh, useRouter } from '@tarojs/taro' import React, { ReactNode, forwardRef, memo, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react' import classnames from 'classnames' import Tabs from '../tabs' import styles from './index.module.scss' import { alert } from '@/common/common' import { formatDateTime, formatPriceDiv, formatWeightDiv } from '@/common/format' import DropDownItem from '@/components/dropDown-item' import { GetAddressListApi } from '@/api/addressList' import IconFont from '@/components/iconfont/iconfont' interface Props { handCity?: (province: any, city: any) => void value?: any onCloseOverlay?: () => void } const ChoseCity = (props: Props, ref) => { const DropDownItemRef = useRef() const close = () => { DropDownItemRef.current.closePopup() } useImperativeHandle( ref, () => { return { show: DropDownItemRef?.current?.show, showPopup: DropDownItemRef?.current.showPopup, closePopup: DropDownItemRef?.current?.closePopup, } }, [DropDownItemRef?.current], ) // 获取地址 const { fetchData } = GetAddressListApi() // 已选的集合市 // const [choseCityArr, setchoseCityArr] = useState([]) const choseCityArr = useRef({ list: [] }) // 省数组 const [list, setlist] = useState([]) // 区数组 const [cityList, setcityList] = useState([]) // 获取省 const getProvince = async() => { const res = await fetchData({ parent_id: 1 }) if (res.data) { setlist([...res.data.list]) } } useEffect(() => { getProvince() }, []) // 区分在哪一栏 const [currentValue, setCurrentValue] = useState(1) // 顶部栏 const [TarBarList, setTarBarList] = useState([{ id: 1, name: '选择省', showBorder: true }, { id: 2, name: '选择市', showBorder: false }]) const handChose = (item) => { TarBarList.forEach((it) => { if (it.id === item.id) { it.showBorder = true } else { it.showBorder = false } setTarBarList([...TarBarList]) setCurrentValue(item.id) }) } // 获取市 const getCity = async(id) => { const res = await fetchData({ parent_id: id }) if (res.data) { res.data.list.map((item) => { choseCityArr.current.list.forEach((it) => { if (item.id == it.id) { item.check = true } }) return item }) setcityList([...res.data.list]) } const provinceArr = list.filter((next) => { return next.check }) props.handCity?.(provinceArr, choseCityArr.current.list) } // 选择省 const handProvince = (item) => { list.map((it) => { if (item.id == it.id) { it.check = true } return it }) setlist([...list]) getCity(item.id) setCurrentValue(2) TarBarList.map((it) => { if (it.id == currentValue) { it.name = item.name it.showBorder = false } else { it.showBorder = true } return it }) setTarBarList([...TarBarList]) } // 选择市 const handCity = (item) => { cityList.map((it) => { if (item.id == it.id) { it.check = !it.check } return it }) setcityList([...cityList]) const cityArr = cityList.filter((next) => { return next.check }) if (item.check) { choseCityArr.current.list.push(item) } else { deleteById(item.id, choseCityArr.current.list) } // 将市区的全部不选后,该省的颜色不高亮 if (cityArr.length == 0) { list.map((item) => { if (cityList[0]?.parent_id == item.id) { item.check = false } return item }) setlist([...list]) } const provinceArr = list.filter((next) => { return next.check }) props.handCity?.(provinceArr, choseCityArr.current.list) } /** * 根据id删除数组项 * @param {Number} id 需要删除的id * @param {Array} list 目标数组 * * @return {Array} */ function deleteById(id, list) { for (let index = list.length - 1; index >= 0; index--) { if (list[index] && list[index].id === id) { list.splice(index, 1) } } return list } // 重置 const handReset = () => { TarBarList.map((item, index) => { if (index == 0) { item.name = '选择省' item.showBorder = true } else { item.showBorder = false } return item }) setTarBarList([...TarBarList]) setCurrentValue(1) choseCityArr.current.list = [] list.map((item) => { item.check = false return item }) setlist([...list]) cityList.map((item) => { item.check = false return item }) setcityList([...cityList]) props.handCity?.('', '') } return ( handChose?.(item)} handReset={() => handReset()}> { currentValue == 1 && { list.map((item, key) => { return ( handProvince(item)}> {item.name} ) }) } } { currentValue == 2 && { cityList.map((item, key) => { return ( handCity(item)}> {item.name} {/* */} ) }) } } ) } export default memo(forwardRef(ChoseCity))