返回

突破地域界限,三级联动选择器实现动态数据展示!

前端

小程序的开发中,Picker 组件是构建用户界面时常用的选择器组件之一。它可以很便捷地帮助我们实现省市区、日期时间、多列选择器等。今天,我们将更进一步,实现一个动态数据的多列选择器。

在这个例子中,我们将实现一个购车门店选择器,用户可以按省市区三级联动方式选择购车门店。实现步骤如下:

  1. 省级数据查询。 用户点击选择购车门店按钮,首先需要查询省级地区数据。我们可以使用 Taro 的 useRequest() 方法来发起网络请求,并将获取的省级数据存储在 state 中。
  2. 市级数据查询。 用户选择省级地区后,需要查询该省下的市级数据。同样,我们可以使用 useRequest() 方法发起网络请求,并将获取的市级数据存储在 state 中。
  3. 门店数据查询。 用户选择市级地区后,需要查询该市下的门店数据。与之前类似,我们可以使用 useRequest() 方法发起网络请求,并将获取的门店数据存储在 state 中。
  4. Picker 组件渲染。 将省级、市级、门店数据分别渲染到三个 Picker 组件中,即可实现三级联动选择器。

在实际开发中,我们可以根据具体需求对 Picker 组件进行样式调整,并添加一些额外的功能,如搜索功能、数据缓存等,以提升用户体验。

下面是实现代码示例:

import Taro, { useRequest } from '@tarojs/taro'

function StoreSelector() {
  const [provinces, setProvinces] = useState([])
  const [cities, setCities] = useState([])
  const [stores, setStores] = useState([])
  const [selectedProvince, setSelectedProvince] = useState('')
  const [selectedCity, setSelectedCity] = useState('')

  useEffect(() => {
    fetchProvinces()
  }, [])

  useEffect(() => {
    if (selectedProvince) {
      fetchCities(selectedProvince)
    }
  }, [selectedProvince])

  useEffect(() => {
    if (selectedCity) {
      fetchStores(selectedCity)
    }
  }, [selectedCity])

  const fetchProvinces = () => {
    const [res] = await useRequest('/provinces')
    if (res.code === 0) {
      setProvinces(res.data)
    }
  }

  const fetchCities = (province) => {
    const [res] = await useRequest(`/cities/${province}`)
    if (res.code === 0) {
      setCities(res.data)
    }
  }

  const fetchStores = (city) => {
    const [res] = await useRequest(`/stores/${city}`)
    if (res.code === 0) {
      setStores(res.data)
    }
  }

  const onProvinceChange = (e) => {
    setSelectedProvince(e.detail.value)
  }

  const onCityChange = (e) => {
    setSelectedCity(e.detail.value)
  }

  const onStoreChange = (e) => {
    // 选择门店后的逻辑处理
  }

  return (
    <View>
      <Picker mode="selector" range={provinces} onChange={onProvinceChange} value={selectedProvince}>
        <View className="picker"></View>
      </Picker>
      <Picker mode="selector" range={cities} onChange={onCityChange} value={selectedCity}>
        <View className="picker"></View>
      </Picker>
      <Picker mode="selector" range={stores} onChange={onStoreChange}>
        <View className="picker">门店</View>
      </Picker>
    </View>
  )
}

export default StoreSelector

通过这种方式,我们就可以在小程序中实现动态数据展示的三级联动选择器,使