vant Cascader 级联选择 异步加载

2023-10-27

<template>
  <div class="cascader">
    <van-field v-model="fieldValue"
      is-link
      readonly
      :label="label"
      :required="required"
      :rules="rules"
      :placeholder="placeholder"
      @click="show = true" />
    <van-popup v-model="show"
      round
      position="bottom">
      <van-cascader v-model="cascaderValue"
        :title="label"
        :options="options"
        @change="selectChange"
        active-color="#1989fa"
        :field-names="fieldNames"
        @close="show = false"
        @finish="onFinish" />
    </van-popup>
  </div>
</template>

<script>
export default {
  props: {
    value: {
      type: String,
      default: () => ''
    },
    isCode: {
      type: Boolean,
      default: () => false
    },
    name: {
      type: String,
      default: () => '默认'
    },
    valueKey: {
      type: String,
      default: () => 'value'
    },
    labelKey: {
      type: String,
      default: () => 'label'
    },
    label: {
      type: String,
      default: () => '默认'
    },
    prop: {
      type: String,
      default: () => ''
    },
    url: {
      type: String,
      default: () => ''
    },
    superCodeVal: {
      type: String,
      default: () => ''
    },
    required: {
      type: Boolean,
      default: () => false
    },
    rules: {
      type: Array,
      default: () => []
    },
    placeholder: {
      type: String,
      default: ''
    },
    lastLevel: {
      type: Number,
      default: () => 3
    }
  },
  data() {
    return {
      show: false,
      fieldValue: '',
      cascaderValue: '',
      fieldNames: {
        text: 'dictName',
        value: 'dictCode'
      },
      options: [],
      isExecute: 1,
      tileArr: []
    }
  },
  methods: {
    // 全部选项选择完毕后,会触发 finish 事件
    onFinish({ selectedOptions }) {
      // this.show = false
      if (this.level > 0) {
        this.show = false
      }

      if (this.isCode) {
        this.fieldValue = selectedOptions.map((option) => `${option.dictName}${option.dictCode})`).join('/')
      } else {
        const fieldValue = selectedOptions.map((option) => option.dictName).join(',')
        if (fieldValue.split('/').length) {
          this.fieldValue = fieldValue
          this.$emit('input', fieldValue)
          return
        }
        this.fieldValue = fieldValue.split(',').join('/')
      }
      this.$emit('input', this.fieldValue.split('/') + '')
    },
    selectChange({ value, selectedOptions, tabIndex, index }) {
      this.level = tabIndex > 0 ? tabIndex - 1 : 0
      // 判断循环了多少次 并且是回显还是重新选择
      if (this.isExecute >= this.lastLevel + 1 && !selectedOptions) {
        return
      }
      // 判断重新选择的个数是否大于传入的lastLevel
      if (selectedOptions && selectedOptions.length >= this.lastLevel) {
        return
      }
      if (this.url) {
        this.$http.post(this.url, { level: this.level, parentCode: value }).then((res) => {
          // 检查重复项
          if (!this.deWeightFour(this.tileArr, res.data)) {
            this.tileArr.push(...res.data)
          }
          if (res.data && res.data.length) {
            this.isExecute++
            this.getDicData(index++)
          }
          this.$set(this, 'options', this.setTreeData(this.tileArr))
        })
      } else {
        console.error('请配置Url地址')
      }
    },
    // 遍历数据并添加children
    setTreeData(source) {
      const cloneData = JSON.parse(JSON.stringify(source)) // 对源数据深度克隆
      return cloneData.filter((father) => {
        // 循环所有项,并添加children属性
        const branchArr = cloneData.filter((child) => father.dictCode === child.parentCode) // 返回每一项的子级数组
        branchArr.length > 0 && (father.children = branchArr) // 给父级添加一个children属性,并赋值
        return father.parentCode === this.superCodeVal // 返回第一层
      })
    },
    // 判断要添加的值是否在这个数组李是否有重复
    deWeightFour(sourceData, inspectData) {
      const source = sourceData.map((item) => item.id)
      return inspectData.map((item) => source.includes(item.id)).includes(true)
    },
    getDicData(tabIndex = 0) {
      // eslint-disable-next-line no-useless-escape
      const str = this.value.split(',').map((item) => item.replace(/\([^\)]*\)/g, ''))
      const items = str[tabIndex]
      this.tileArr.forEach((item) => {
        if (item.dictName === items) {
          console.log(item.dictCode)
          this.cascaderValue = item.dictCode
          this.selectChange({ value: item.dictCode, tabIndex: 0, index: ++tabIndex })
        }
      })
    }
  },
  created() {
    this.fieldValue = this.value.split(',').join('/')
    this.selectChange({ value: this.superCodeVal, tabIndex: 1 })
  },
  watch: {
    value: {
      handler(v) {
        this.fieldValue = this.value.split(',').join('/')
      }
    },
    show: {
      handler(v) {
        if (v && this.fieldValue && this.isExecute) {
          this.getDicData()
        }
      }
    }
  }
}
</script>

<style>
</style>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vant Cascader 级联选择 异步加载 的相关文章

  • vue中使用Echarts地理地图并结合高德地图实现一个国、省、市、区的地图下钻功能

    vue中使用Echarts地理地图并结合高德地图实现一个国 省 市 区的地图下钻功能 一 需求 按不同的层级展示不同的内容 1 中国地图 2 省级地图 3 市级地图 4 县和区以下的地图 二 开发 1 Echarts和地图容器的设置 相关代
  • Vue如何将数据显示在页面中

    如何将data的数据显示在页面中 1 文本插值 div msg div 渲染结果 div hello world div 2 原始HTML插值 v html v text 区别 v text不会对标签进行转义而v html会对标签进行一次转
  • Vue (三) 生命周期--钩子函数

    生命周期 Vue官网生命周期的描述 钩子函数 1 beforeCreate 创建Vue实例化之前所调用的函数 div h1 message h1 div
  • Vue js引用警告 “export ‘default‘ (imported as ‘xxx‘) was not found

    问题原因 ES6 编译器识别问题 如果在public js这样写会有警告export default imported as xxx was not found export const myMixin 解决办法 修改组件中引用js的地方
  • 包管理工具那么多,怎么选?npm、yarn 和 pnpm 三者比较及使用详解!

    1 简介 在 Vue 项目中 我们需要使用许多第三方依赖库 如 Vue Router Vuex Axios Element UI 等等 这些依赖库通常以 NPM 包的形式提供 而且在使用时需要进行版本管理 因此 我们需要使用一个包管理工具来
  • 前端大屏常用的适配方案

    假设我们正在开发一个可视化拖拽的搭建平台 可以拖拽生成工作台或可视化大屏 或者直接就是开发一个大屏 首先必须要考虑的一个问题就是页面如何适应屏幕 因为我们在搭建或开发时一般都会基于一个固定的宽高 但是实际的屏幕可能大小不一 接下来我们就尝试
  • mapState的使用(常用)

    mapState作用 可以辅助获取到多个state的值 怎么使用 1 在 vue组件中引入 在js块中引入 import mapState from vuex 2 在 vue组件中computed下定义一个对象 computed mapSt
  • vue 表格表头内容居中

    放入
  • vue 子父组件间的那些事儿——搭建项目(一)

    一 搭建vue项目 1 环境准备 基于nodejs vue cli cnpm 搭建vue项目 由于本博主已经具备以上环境 现在直接进行项目搭建 环境准备可参考这篇博客 https blog csdn net xcymorningsun ar
  • ant-design-vue 全局和局部引入组件

    1 全局引入 在main js里面引入 import Vue from vue import ant design vue dist antd css import Antd from ant design vue Vue use Antd
  • Vue项目的部署(服务器)

    Vue项目的部署 服务器 前几天帮朋友写了一个可以动态查看地点温度的前端项目 目前已经部署上线了 访问链接点这里 服务器是朋友的 倒时候打不开会很正常 说不定又使用服务器玩大数据项目去了 效果图 图一 图二 当然 温度也都是实时跟新的 而且
  • vue element select下拉框树形多选

    components 文件下新建 SelectTree文件 index vue SelectTree index vue
  • 滚动条样式

    一 在div中的滚动条样式 div webkit scrollbar width 5px 滚动条宽度 div webkit scrollbar thumb border radius 10px 滚动条圆角 webkit box shadow
  • 大数据毕业设计之前端02:架构布局和aside的设计

    前言 上一篇主要讲了我学习前端的一个经历 以及为什么选择BuildAdmin作为深入前端学习的原因 同事也大致聊了一下学习前端需要使用哪些技术栈 本篇文章来拆解一下BuildAdmin的前端代码结构 和布局实现的细节 前端代码结构 必须先了
  • 大事件项目07----10,11,12未录

    1 如果三方jar包对应的对象 2 来自第三方 是无法用 Component及衍生注解生命bean的 3 使用Maven命令 引入jar包 4 这里我们准备了jar包 也提前准备好了jar包的脚本 5 通过本地的方式来安装maven的坐标
  • vue中使用echarts实现省市地图绘制,根据数据在地图上显示柱状图信息,增加涟漪特效动画效果

    一 实现效果 使用echarts实现省市地图绘制 根据数据在地图显示柱状图 根据数据显示数据 涟漪效果 二 实现方法 1 安装echarts插件 npm install echarts save 2 获取省市json数据 https dat
  • vue项目日期处理day.js

    dayjs安装 1 npm 安装 npm install dayjs save 2 项目使用 import dayjs from dayjs ES 2015 dayjs format 使用介绍 1 秒 获取或设置秒 接受0到59的数字 如果
  • 基于springboot+vue实现位置的多分馆图书馆推荐系统演示【附项目源码+论文说明】

    基于springboot实现位置的多分馆图书馆推荐系统演示 摘要 时代的变化速度实在超出人类的所料 21世纪 计算机已经发展到各行各业 各个地区 它的载体媒介 计算机 大众称之为的电脑 是一种特高速的科学仪器 比人类的脑袋要灵光无数倍 什么
  • vue的组件

    在Vue中 组件是可复用的代码块 用于构建用户界面 Vue的组件系统允许您将界面拆分为独立的 可重复使用的部件 提供了更好的代码组织和复用性 以下是在Vue中创建组件的基本步骤 创建一个组件实例 可以使用Vue extend 方法创建一个V
  • ❤ Vue3 使用

    Vue3 使用 Vue3之toRefs的使用 作用 toRefs 可以将一个响应式的对象 转换成普通对象 但是转换后的普通对象的每一个属性值都是响应式的 这样我们可以使用es6的对象解构或者三点运算符等操作 代码

随机推荐

  • msvcp110.dll丢失的解决方法,大家最常用的三个解决方法【教程】

    win10是一款非常优秀的电脑系统 但有时候也会出现文件错误 比如msvcp110 dll丢失 这个问题可能会导致一些应用程序无法正常运行 甚至可能影响到系统的稳定性 那么 面对这样一个问题 我们应该如何解决呢 今天小编为大家带来的就是ms
  • 程序员如何优雅地转行?35岁老程序员告诉你

    在程序员的圈子里 网上经常热议的话题 比如 什么大龄IT公司职员被劝退 35岁程序员必须得转行 这些话题我觉得还是比较片面的 都是在一定的背景之下才有的个别情况 但是有一部分的程序员想转行这是可观存在的事实 我就是其中的一员 而且我已经通过
  • Pytorch入门教程

    作者简介 大数据专业硕士在读 CSDN人工智能领域博客专家 阿里云专家博主 专注大数据与人工智能知识分享 公众号 GoAI的学习小屋 免费分享书籍 简历 导图等资料 更有交流群分享AI和大数据 加群方式公众号回复 加群 或 点击链接 专栏推
  • 命令行打开TotoiseGit工具界面

    直接在左下角开始中打开它时 会提示 lortoiseGit is a shell extension That means it is integrated into the Windows explorer To use Tortoise
  • 【嵌入式】STM32利用arm-dsp库进行PID调节控制

    目录 一 实验简介 1 原理 2 所用外设 二 代码 1 PWM输出配置 2 定时器触发的DMA传输的ADC 3 主体代码 三 实验结果 在工程实际中 应用最为广泛的调节器控制规律为比例 积分 微分控制 简称 PID 控制 又称 PID调节
  • 重回csdn

    前段时间csdn帐号被盗 后来帐号被封 今刚找回来 所有博文付之一炬
  • Windows与Centos下的深度学习部署

    文章介绍2种深度学习部署思路 1 Windows下部署深度学习 确保只用本地机器也可以跑深度学习 GPU版本 2 Centos下部署深度学习 Windows作为可视化界面 利用Centos的CPU跑深度学习 CPU版本 一 Windows1
  • 程序设计综合实习(C语言):学生成绩文件管理

    一 目的 1 掌握文件指针的概念和运用 2 掌握文件的相关操作 打开 读 写 关闭 3 掌握文件的定位操作 二 实习环境 Visual Stdio 2022 三 实习内容与步骤 1 定义一个结构体数组 存放10个学生的学号 姓名 三门课的成
  • 转:人生比努力更重要的是选择,与时俱进是成功的源泉。

    如果有一天你隔壁开火锅店的张三 卖手机卖得比你好 你不用觉得惊讶 因为 这是一个跨界的时代 每一个行业都在整合 都在交叉 都在相互渗透 移动互联网改变生活 未来我们的生活会是什么样子呢 我们设想一下 晚上带着家人去吃饭 拿出手机点击附近餐厅
  • 汇编语言程序设计的实验环境及上机步骤

    汇编语言源程序编制完成后 在计算机上的操作过程分为四个阶段 编辑 汇编 连接 运行调试 如图1 一 实验环境 汇编语言程序设计的实验环境如下 硬件环境 微型计算机 Intel x86系列CPU 一台 软件环境 Windows98 2000
  • 类和对象

    一 类 每个类都定义了自己的作用域 每个类的成员函数和成员变量都在这个作用域内 成员函数可以任意访问所在类的其他函数和成员变量 C 的封装特性是对外的 在类内是可以任意调用和使用的 类似于C中的结构体 要访问类定义的对象的成员 类定义的对象
  • 通过css实现对勾(√)和叉号(×)

    通过css实现对勾 和叉号 第一种方式 HTML span class status correct span span class status incorrect span CSS correct display inline bloc
  • 字符编码和字符集

    编码和解码 按照某种规则 将字符存储到计算机中 称为 编码 那么 将计算机中的二进制数据按照某种规则解析显示出来 称为 解码 字符编码 就是一套自然语言的字符和二进制数据之间的对应规则 把这种对应规则 写成一张表 就是 编码表 也叫字符集
  • kv遍历

    var builder var builderKey var builderValue for var i 0 i lt message length i var c message charAt i var nextStr message
  • 互联网高可用架构探讨

    高可用指标与问题 高可用 英文单词High Availability 缩写HA 它是分布式系统架构设计中一个重要的度量 业界通常用多个9来衡量系统的可用性 如下表 既然有可用率 有一定会存在不可用的情况 系统宕机一般分为有计划的和无计划的
  • 数码管:3位6脚的数码管分析和编码

    基本简介 一个1位数码管共有8段 ABCDEFG 小数点 如下图 按照我们常规的设计方案一个 IO 口控制一个段 一个1位数码管那么就需要8个IO 当然我们也可以使用扩展 IO 芯片 例如 74HC164 74HC595 那么这种方案就占用
  • Linux 中卷组不真实存在情况下,强制删除卷组及其PV信息

    由于手误删除lVm顺序不对 导致真实pV 已经不存在 但是卷组信息及其PV信息还存在系统中 pvdisplay和vgdisplay都能看到信息 这时候可以到 dev 目录下手动rm 掉 pv 再查看卷组 就真的不存在了
  • Android取消点击效果,Android中如何取消listview的点击效果

    Android中如何取消listview的点击效果 在xml文件里面有listselecter的属性引用 android layout width match parent android layout height wrap conten
  • 【3D游戏基础】蒙皮骨骼动画与骨架

    效果 目标 画出蒙皮动画的骨架 视频 https www bilibili com video BV1pM411m7Yw PPT https zfxdvouj61 feishu cn file boxcnwgESO6zdQetO7oNhKb
  • vant Cascader 级联选择 异步加载