行政辖区动态获取---自定义表单控件

166 阅读1分钟

行政辖区动态获取---自定义表单控件

ant-design,react相关的demo例子,vue的很少。做惯了伸手党,今天小贡献下。简单封装了个级联组件。 需求是用vuex存储状态,动态获取每一级行政辖区的编码。 引用官方文档的要求:

自定义或第三方的表单控件,也可以与 Form 组件一起使用。只要该组件遵循以下的约定:

  • 提供受控属性 value 或其它与 valuePropName-参数) 的值同名的属性。
  • 提供 onChange 事件或 trigger-参数) 的值同名的事件。
  • 不能是函数式组件。

需要注意的是必需绑定value, 要不form的resetFields方法不起作用。 以下是自定义控件代码:

<template>
  <a-cascader
    :value="value"
    :options="options"
    @change="onChange"
    :loadData="loadData"
    changeOnSelect
    :placeholder="title"
  />
</template>
<script>
/**
 *自定义需提供value和对应的change事件
 */
 // 获取各级行政区域编码,不要问我为什么字段有拼音码😂
import { getCitysBySfbh, getDistrictsByCsbh, getPolicesByXqbh } from '@/api/area' 

export default {
  name: 'AsyncCascader',
  props: {
    value: {
      type: Array,
      default: () => {
        return []
      }
    },
    title: {
      type: String,
      default: '省/市/区/派出所'
    }
  },
  data () {
    return {
      options: [
        {
          value: '33',
          label: '浙江',
          isLeaf: false
        }
      ]
    }
  },
  computed: {
    decorators () {
      return this.vDecorator
    }
  },
  methods: {
    onChange (value) {
      this.triggerChange(value)
    },
    triggerChange (changedValue) {
      // Should provide an event to pass value to Form.
      // this.$emit('change', Object.assign({}, this.$data, changedValue))
      this.$emit('change', changedValue)
    },
    async loadData (selectedOptions) {
      const targetOption = selectedOptions[selectedOptions.length - 1]
      targetOption.loading = true
      let res
      // 0: 选择第一列 1: 选择第二列 2: 选择第三列
      if (selectedOptions.length - 1 === 0) {
        res = await getCitysBySfbh()
      } else if (selectedOptions.length - 1 === 1) {
        res = await getDistrictsByCsbh()
      } else if (selectedOptions.length - 1 === 2) {
        res = await getPolicesByXqbh()
      }
      targetOption.loading = false
      targetOption.children = [...res.data]
      this.options = [...this.options]
    }
  }
}
</script>

在表单组件中引用

 <a-form-item label="所在区域">
         <async-cascader
              v-decorator="[
                'houseInspectionParam.szqy',
                {initialValue: []}
              ]"
              title="省/市/区/街道"></async-cascader>
</a-form-item>