Ant Design Vue 中cascader级联组件动态加载数据

前言

Ant Design Vue中的cascader是专门处理级联数据的组件,使用非常简单。但在动态获取数据并回显数据方面,略有不足,无法实现回显数据前加载二级数据。需要自己编写代码来实现。

如何使用组件

引入组件

默认框架没有引用Cascader组件,需要自己手动引用,引用方式:
打开/src/core/lazy_use.js

import {
  ...
  Cascader
} from 'ant-design-vue'

...

Vue.use(Cascader)

这样在Vue页面上就能直接使用<a-cascader />标签了

如何动态加载数据

需求

需要在页面上实现省市区的动态级联,并且在编辑时回显数据

具体实现

html代码:
<a-form-item label="所在地" :labelCol="labelCol" :wrapperCol="wrapperCol">
  <a-cascader
    :options="provinceOptions"
    :load-data="loadCityData"
    :field-names="{label: 'name', value: 'id', children: 'children' }"
    placeholder="请选择所在地"
    v-decorator="['bank_province', { rules: [{required: true, message: '请选择所在地'}] }]"
    change-on-select
  />
</a-form-item>
属性说明:
// 初始化省份数据
:options="provinceOptions"

// 加载数据时执行的方法
:load-data="loadCityData"

// 自定义的标题显示、对应ID、子级内容字段
:field-names="{label: 'name', value: 'id', children: 'children' }"
data代码:
// 就一个数组完事
provinceOptions: [],
script代码:

初次进入页面时需要先加载省份数据,那么我们需要在created方法中实现:

created() {
    // 初始化加载省份数据
    // getAreaList是我这边用axios调用后端接口的方法
    // 第一个参数是pid,0是指对顶层数据,即是省份数据,如果是其他值则是获取城市数据
    // 第二个参数是回调函数
    getAreaList(0, (res, status) => {
      if (status) {
        var array = []
        res.map((item, index) => {
          // level是层级,1代表省份
          array.push(Object.assign(item, { isLeaf: !(item.level == 1) }))
        })
        this.provinceOptions = array
      }
    })
}

method相关函数

    // 省市级联加载数据(第一次选择更改时会触发此函数,已加载过的不会再次触发)
    loadCityData(selectedOptions) {
      const targetOption = selectedOptions[selectedOptions.length - 1]
      // 加载标识
      targetOption.loading = true
      console.log('selectedOptions', selectedOptions)
      console.log('targetOption', targetOption)
      
      // 选择省份、城市时获取下级数据
      this.doLoadCityData(targetOption.id, (array) => {
        console.log('...targetOption', targetOption)
        // 取消加载标识
        targetOption.loading = false
        // 把下级数据存进去
        targetOption.children = array
        // 重新赋值级联数据
        this.provinceOptions = [...this.provinceOptions]
      })
    },

    // 处理加载城市下级数据(选择、编辑时可用)
    doLoadCityData(pid, callback = null) {
      getAreaList(pid, (res, status) => {
        if (status) {
          // 子级数据装到array中
          var array = []
          res.map((item, index) => {
            array.push(Object.assign(item, { isLeaf: !(item.level == 1) }))
          })
          
          // 再传给回调函数
          if (callback) {
            callback(array)
          }
        }
      })
    },

这样就完成了二级级联动态数据加载。

如何回显数据

实现思路是:
1.在获取到model数据后,对其进行监听,一级省份数据对其赋值;
2.如果二级城市数据有值的情况下,先获取一级省份的下级数据,再进行二级城市数据赋值

具体实现代码如下:

created() {
  ...javascript
  // 防止表单未注册
  fields.forEach((v) => this.form.getFieldDecorator(v))
  ...
  // 监听
  this.$watch('record', () => {
    ...
    // 开户银行所在地处理
    if (this.record.bank_province) {
      this.doLoadCityData(this.record.bank_province, (array) => {
        this.form.setFieldsValue({ bank_province: [this.record.bank_province, this.record.bank_city] })

        // 设置城市显示
        if (this.record.bank_city) {
          this.provinceOptions.forEach((value, index) => {
            if (value.id == this.record.bank_province) {
              console.log('this.record.bank_province', this.record.bank_province)
              var obj = this.provinceOptions[index]
              obj.children = array
              this.provinceOptions[index].children = array
              this.provinceOptions = [...this.provinceOptions]
              this.form.setFieldsValue({ bank_province: [this.record.bank_province, this.record.bank_city] })
              return
            }
          })
        }
      })
    }
  });
}
  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
抱歉,我不太理解您的问题。您是想在使用 Ant Design Vue 的情况下,如何使用 Diamante 实现动态加载二级菜单吗?如果是这样的话,您可以参考以下步骤: 1. 在 Ant Design Vue 使用 Cascader 组件,该组件可以实现级联选择功能。 2. 在 Cascader 组件使用 loadData 方法,该方法可以在选择某个选项时动态加载下一级菜单的数据。 3. 在 loadData 方法使用 Diamante 的 API,从后端获取下一级菜单的数据,并将其设置为 Cascader 组件的 options 属性。 您可以参考以下代码,其假设您的后端 API 地址为 http://example.com/api/menu,且返回的数据格式为: ```json [ { "label": "Option 1", "value": "1", "children": [ { "label": "Sub-option 1-1", "value": "1-1" }, { "label": "Sub-option 1-2", "value": "1-2" } ] }, { "label": "Option 2", "value": "2", "children": [ { "label": "Sub-option 2-1", "value": "2-1" }, { "label": "Sub-option 2-2", "value": "2-2" } ] } ] ``` ```vue <template> <a-cascader :options="options" :load-data="loadData" @change="handleChange" /> </template> <script> import { Cascader } from 'ant-design-vue' import axios from 'axios' export default { components: { ACascader: Cascader, }, data() { return { options: [ { label: 'Option 1', value: '1', isLeaf: false, }, { label: 'Option 2', value: '2', isLeaf: false, }, ], } }, methods: { async loadData(selectedOptions) { const targetOption = selectedOptions[selectedOptions.length - 1] targetOption.loading = true const response = await axios.get('http://example.com/api/menu', { params: { parentId: targetOption.value, }, }) targetOption.loading = false const { data } = response if (data && data.length > 0) { targetOption.children = data.map((item) => ({ label: item.label, value: item.value, isLeaf: !item.children, })) } else { targetOption.isLeaf = true } }, handleChange(value, selectedOptions) { console.log(value, selectedOptions) }, }, } </script> ``` 希望这能够回答您的问题。如果您还有疑问,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值