PickerCityField.vue 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. <template>
  2. <CascaderField
  3. :modelValue="modelValue"
  4. @update:modelValue="$emit('update:modelValue', $event)"
  5. textKey="name"
  6. valueKey="code"
  7. childrenKey="children"
  8. placeholder="请选择省市区"
  9. :data="(ChinaCityData.data.value as CascaderItem[]) || []"
  10. v-bind="$attrs"
  11. />
  12. </template>
  13. <script setup lang="ts">
  14. import { useDataLoader } from '@/components/composeabe/DataLoader';
  15. import type { CascaderItem } from '@/components/form/Cascader.vue';
  16. import CascaderField from '@/components/form/CascaderField.vue';
  17. import type { PropType } from 'vue';
  18. const props = defineProps({
  19. modelValue: {
  20. type: Array as PropType<string[]>,
  21. default: () => [],
  22. },
  23. cityDataUrl: {
  24. type: String,
  25. default: 'https://mn.wenlvti.net/app_static/xiangan/city-data.json',
  26. }
  27. })
  28. defineEmits(['update:modelValue'])
  29. const ChinaCityData = useDataLoader(() => {
  30. return new Promise((resolve, reject) => {
  31. uni.request({
  32. url: props.cityDataUrl,
  33. method: 'GET',
  34. success: (res) => {
  35. resolve(res.data)
  36. },
  37. fail: (err) => {
  38. reject(err)
  39. }
  40. })
  41. })
  42. }, {
  43. immediate: true,
  44. });
  45. </script>