草庐IT

antd级联选择器(a-cascader)动态加载和动态回显效果实现

前端小白۞ 2023-07-19 原文

文章目录

1、介绍

​ 需要实现级联选择器动态拿到每一层级的数据并显示,同时在编辑数据时弹框回显对应的层级关系。

2、效果图如下图所示:(只实现3层的)

3、实现方法

(1)层级可单独选择

​ 给组件添加 :checkStrictly="true" 这个属性就可以实现单独勾选一级、二级、三级组织关系。(官方api没有写)

(2)组件使用

​ 首先先在html里 模态框上写上a-cascader组件

 <a-modal v-model="uploadNew" :title="title" :width="800" :footer="null" @cancel="resetForm">
        <a-form-model :model="addForm" :label-col="labelCol" :wrapper-col="wrapperCol" ref="addForm" :rules="roleRules">
           
          <a-form-model-item label="所属组织" prop="orgIds">
            <a-cascader  v-model="addForm['orgIds']"
                         :options="options"
                         change-on-select
                         @change="onChange"
                         :load-data="loadData"
                         :checkStrictly="true"
                         placeholder="选择组织" />
          </a-form-model-item>
          <a-form-model-item :wrapper-col="{ span: 14, offset: 10 }">
            <span @click="onSubmit" style="cursor: pointer">
             提交
            </span>
            <span @click="resetForm" style="margin-left: 100px;cursor: pointer">
              取消
            </span>
          </a-form-model-item>
        </a-form-model>
      </a-modal>
    

(3)data数据

  data() {
    return {
      options: []
    }
  },

(4)实现动态加载数据

​ 先实现只有动态加载数据的功能(根据官网https://1x.antdv.com/components/cascader-cn/示例即可实现)

1、 提示:options的数据格式是这样的

 options: [
        {
          value: 'zhejiang',
          label: 'Zhejiang',
          isLeaf: false,//是否叶子节点
          children:[]
        },
        {
          value: 'jiangsu',
          label: 'Jiangsu',
          isLeaf: false,
        },
      ],

2、methods方法

注意:(初始化时会先获取第一层级的数据)

//获取一级组织
    async getOneList(){
      try {
        let par={
          parentId:''
        }
        const res = await getOrgOneList(par)
        this.roleOneList=res.data.data
        this.roleOneList.forEach(item=>{
          let temp={
            value:item.id,
            label:item.orgName,
            isLeaf:false,
          }
          this.options.push(temp)
        })
      } catch (error) {
        console.log(error)
      }
    }, 

3、异步加载数据方法

   async loadData(selectedOptions) {
      const targetOption = selectedOptions[selectedOptions.length - 1];
      this.levelIndex=selectedOptions.length+1 //点第几级组织,selectedOptions长度就是几,点3级时,没有叶子节点,不会进入这个方法(这里只会等于2,3)
      targetOption.loading = true;
      let parentId=targetOption.value//根据父id才能查询子数组
      await this.getOrgTwoList(parentId)//这个方法是掉接口,返回2,3级数据,下方有该方法
      targetOption.loading = false;
      if(this.levelIndex<=3){
        targetOption.children = this.roleTwoList
      }
      this.options = [...this.options];
 
    },
    onChange(value) {
      this.roleCheck=value
      console.log(value,'sel')
    },

4、获取2,3级组织列表

 
//根据父id获取2,3级组织列表
    async getOrgTwoList(id){
      try {
        let par={
          parentId:id
        }
        const res = await getOrgOneList(par)//掉接口,获取下一层级数据
        this.roleTwoList=[]
        res.data.data.forEach(item=>{
          let temp={
            value:item.id,
            label:item.orgName,
            isLeaf: this.levelIndex==3?true:false//判断是否是叶子节点
          }
          this.roleTwoList.push(temp)
        })
      } catch (error) {
        console.log(error)
      }
    },

(5)编辑回显

在上面基础上,实现编辑的时候数据回显

 //编辑用户
    async editUser(row){
   
      this.addForm=Object.assign({},row)
      this.addForm.orgIds=row.orgIds.split(',')//数据需要转成数组的格式
      for (let i = 0; i < this.addForm.orgIds.length - 1; i++) {
        await this.getNextList(this.addForm.orgIds[i])//获取下一层级的数据
      }
      this.uploadNew=true//显示弹框
    },

方法实现

//根据父id获取下一层级数据  
async getNextList (targetOption) {
      let obj = {
        parentId: targetOption
      }
          const res = await getOrgOneList(obj)//掉接口,获取下一层级数据
          const list = res.data.data.map((item) => {
            // dLevel == 3 时表示是叶子节点
            this.$set(item,'isLeaf',item.dLevel == 3)
            this.$set(item,'value',item.id)
            this.$set(item,'label',item.orgName)
            return item
          })
          //初始化时,this.options包含全部第一层级的数据
            this.options.forEach((item) => {
              if (item.children) {
                item.children.forEach((ite) => {
                  if (ite.value == targetOption ) {
                    this.$set(ite,'children',list)
                    // ite['children'] = list
                  }
                })
              }
              if (item.value == targetOption) {//数据value值等于父id
                this.$set(item,'children',list)
              }
            })
          this.options = [...this.options]
    },

以上getOrgTwoList和getNextList方法都是根据父id获取下一层级(2,3级)数据,可优化。

有关antd级联选择器(a-cascader)动态加载和动态回显效果实现的更多相关文章

  1. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  2. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  3. ruby-on-rails - 使用 config.threadsafe 时从 lib/加载模块/类的正确方法是什么!选项? - 2

    我一直致力于让我们的Rails2.3.8应用程序在JRuby下正确运行。一切正常,直到我启用config.threadsafe!以实现JRuby提供的并发性。这导致lib/中的模块和类不再自动加载。使用config.threadsafe!启用:$rubyscript/runner-eproduction'pSim::Sim200Provisioner'/Users/amchale/.rvm/gems/jruby-1.5.1@web-services/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:105:in`co

  4. ruby - Rails 3 的 RGB 颜色选择器 - 2

    状态:我正在构建一个应用程序,其中需要一个可供用户选择颜色的字段,该字段将包含RGB颜色代码字符串。我已经测试了一个看起来很漂亮但效果不佳的。它是“挑剔的颜色”,并托管在此存储库中:https://github.com/Astorsoft/picky-color.在这里我打开一个关于它的一些问题的问题。问题:请建议我在Rails3应用程序中使用一些颜色选择器。 最佳答案 也许页面上的列表jQueryUIDevelopment:ColorPicker为您提供开箱即用的产品。原因是jQuery现在包含在Rails3应用程序中,因此使用基

  5. ruby-on-rails - 从应用程序中自定义文件夹内的命名空间自动加载 - 2

    我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty

  6. ruby - 在 Ruby 中动态创建数组 - 2

    有没有办法在Ruby中动态创建数组?例如,假设我想遍历用户输入的书籍数组:books=gets.chomp用户输入:"TheGreatGatsby,CrimeandPunishment,Dracula,Fahrenheit451,PrideandPrejudice,SenseandSensibility,Slaughterhouse-Five,TheAdventuresofHuckleberryFinn"我把它变成一个数组:books_array=books.split(",")现在,对于用户输入的每一本书,我想用Ruby创建一个数组。伪代码来做到这一点:x=0books_array.

  7. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  8. ruby - 是否可以将 IRB 提示配置为动态更改? - 2

    我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO

  9. ruby-on-rails - Rails 单选按钮 - 模型中多列的一种选择 - 2

    我希望用户从一个模型的三个选项中选择一个。即我有一个模型视频,可以被评为正面/负面/未知目前我有三列bool值(pos/neg/unknown)。这是处理这种情况的最佳方式吗?为此,表单应该是什么样的?目前我有类似的东西但显然它允许多项选择,而我试图将它限制为只有一个..怎么办? 最佳答案 如果要使用字符串列,让我们说rating。然后在你的表单中:#...#...它只允许一个选择编辑完全相同但使用radio_button_tag: 关于ruby-on-rails-Rails单选按钮-模

  10. ruby-on-rails - CarrierWave - PDF - 只选择第一页 - 2

    我的Rails应用程序中安装了carrierwave。但是,当用户上传多页pdf时,我只希望应用程序获取文档中的第一页并将其转换为jpeg。这可能吗?用什么命令?这是我的uploader。#encoding:utf-8classImageUploader[200,300]##defscale(width,height)##dosomething#end#Createdifferentversionsofyouruploadedfiles:version:thumbdoprocess:resize_to_fill=>[150,210]process:convert=>:jpgdefful

随机推荐