225 lines
6.4 KiB
TypeScript
225 lines
6.4 KiB
TypeScript
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<any>()
|
|
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<any[]>([])
|
|
const choseCityArr = useRef<any>({ list: [] })
|
|
|
|
// 省数组
|
|
const [list, setlist] = useState<any[]>([])
|
|
// 区数组
|
|
const [cityList, setcityList] = useState<any[]>([])
|
|
// 获取省
|
|
const getProvince = async() => {
|
|
const res = await fetchData({ parent_id: 1 })
|
|
if (res.data) {
|
|
setlist([...res.data.list])
|
|
}
|
|
}
|
|
useEffect(() => {
|
|
getProvince()
|
|
}, [])
|
|
// 区分在哪一栏
|
|
const [currentValue, setCurrentValue] = useState<number>(1)
|
|
|
|
// 顶部栏
|
|
const [TarBarList, setTarBarList] = useState<any[]>([{ 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 (
|
|
<DropDownItem ref={DropDownItemRef} title="所有省市" value={-1} activeColor="#337fff" onCloseOverlay={props?.onCloseOverlay}>
|
|
<View className={styles.mainBox}>
|
|
<Tabs list={TarBarList} handChose={item => handChose?.(item)} handReset={() => handReset()}></Tabs>
|
|
{
|
|
currentValue == 1 && <ScrollView scrollY className={styles.scrollView}>
|
|
{
|
|
list.map((item, key) => {
|
|
return (
|
|
<View key={key} className={styles.itemBox} onClick={() => handProvince(item)}>
|
|
<View className={classnames(item.check ? styles.activeitemProvince : styles.itemProvince)}>{item.name}</View>
|
|
<IconFont name="icon-chakanquanbukehu" size={50} color="#d8d8d8"></IconFont>
|
|
</View>
|
|
)
|
|
})
|
|
}
|
|
</ScrollView>
|
|
}
|
|
{
|
|
currentValue == 2 && <ScrollView scrollY className={styles.scrollView}>
|
|
{
|
|
cityList.map((item, key) => {
|
|
return (
|
|
<View key={key} className={styles.itemBox} onClick={() => handCity(item)}>
|
|
<View className={classnames(item.check ? styles.activeitemProvince : styles.itemProvince)}>{item.name}</View>
|
|
{/* <IconFont name={'icon-chakanquanbukehu'} size={50} color={'#d8d8d8'}></IconFont> */}
|
|
</View>
|
|
)
|
|
})
|
|
}
|
|
</ScrollView>
|
|
}
|
|
</View>
|
|
</DropDownItem>
|
|
)
|
|
}
|
|
export default memo(forwardRef(ChoseCity))
|