关于element中el-cascader的使用方式

 更新时间:2022年08月11日 09:55:21   作者:高级前端工程师全栈方向  
这篇文章主要介绍了关于element中el-cascader的使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

element中el-cascader的使用

从后端拿到arr数据结构:

cityList: [
    {
        id: 1,
        name: '北京',
        child: [
            id: 11,
            name: '大兴区',
            child: [
                id: 111,
                name: '亦庄'
            ]
        ]
    }
]

vue文件代码

<template>
<el-cascader
    :options="cityList"
    :props="optionProps"
    v-model="selectedOptions"
    @change="handleChange">
</el-cascader>
</template>
<script>
data: {
    optionProps: {
        value: 'id',
        label: 'name',
        children: 'child'
    }
}
</script>

使用el-cascader报错解决

项目中使用到了element-ui中的cascader级联选择器,组件下拉列表是动态的,根据用户选择的类型来从后台请求数据

  <el-select v-model="type" @change="getCascader" placeholder="请选择类型">
    <el-option
      v-for="item in type"
      :key="item.typeValue"
      :label="item.typeName"
      :value="item.typeValue"
    />
  </el-select>
  <el-cascader
    :options="cascaderOption"
    :props="props"
    v-model="cascaderValue"
    collapse-tags
    :placeholder="请先选择类型"
  />

再根据后台获取的数据,加载级联选择器

getCascader() {
  this.cascaderValue= []      
  getCascader(this.type).then(response => {
    this.cascaderOption = response.data.data
  });
}

于是就出现bug了

一、options为空的情况

场景:有的类型没有数据,这时cascader的options是[ ],下拉框是空的。

如果选择了一个类型,根据类型获取了cascader的数据,在cascader中选择了一条数据,再更换类型,没有这条数据了就会报错

[Vue warn]: Error in callback for watcher "options": "TypeError: Cannot read property 'level' of null

TypeError: Cannot read property 'level' of null

根据报错信息点进去看了一下,发现cascader有选中项的绑定值checkedValue和点击的父节点(高亮)activePath , 即便设置了this.cascaderValue= [] ,cascader中的activePath还是有值,也就是点击的父节点会被记录下来,再次加载cascader找不到就会报错。

解决:如果没有数据就将cascader设置为不可编辑

<el-cascader
   :options="cascaderOption"
   :props="props"
   :disabled="optionsChanged"
   v-model="cascaderValue"
   collapse-tags
   :placeholder="showPlaceholder"
 />

并且直接return,不加载下拉节点

getCascader() {
  this.cascaderValue= []      
  getCascader(this.type).then(response => {
  if(response.data.data.length === 0){
      this.optionsChanged = true
      this.showPlaceholder = '暂无范围'
      return
    }
    this.cascaderOption = response.data.data
  });
}

二、编辑时给cascader赋值

场景:cascader下拉节点的数据由后台提供,编辑时的显示值依然让后台提供,将后台返回的信息直接赋值给cascaderthis.type = row.type //row为后台返回的数据。

这样赋值是可以显示的,但是改变类型后,cascader的options又动态改变,这就导致了cascader的value在下拉节点中不存在,又跟一options为空的情况报了同样的错误

[Vue warn]: Error in callback for watcher "options": "TypeError: Cannot read property 'level' of null

TypeError: Cannot read property 'level' of null

刚开始以为是后台返回的数据有问题,将后台返回的数组直接写死赋值给cascader就不会报错,只要数据写死就不会报错,动态赋值就报错。

this.type = ['1','2']

真让人摸不着头脑。 

解决:叫上后台一起排查后发现将返回的options中的value从string改成了int就可以了

三、点击了父节点后改变了cascader的options

场景:后面又发现了一个bug,就是点击了父节点但是并没有选中的时候,改变了类型,options也动态改变了,改变后没有这个父节点就会报错。

当然,选中了节点同样会报错,只要有activePath 就会报错。

[Vue warn]: Error in callback for watcher "options": "TypeError: Cannot read property 'level' of null

TypeError: Cannot read property 'level' of null

解决:与一options为空的bug类似,重新渲染cascader都可以解决。

改变类型,cascader的options改变后,将cascader重新渲染。

重新渲染组件的方法有两种:

  • 1、给cascader设置v-if,改变类型后,赋值options前将v-if设置为true就可以重新渲染cascader,但是这样有个缺陷就是不流畅,v-if设置为false时cascader的位置会空白,影响用户体验。
  • 2、给cascader设置一个key,改变类型时也改变key值,key值改变了,cascader就会重新渲染
<el-cascader
	:key="isResouceShow"
   :options="cascaderOption"
   :props="props"
   :disabled="optionsChanged"
   v-model="cascaderValue"
   collapse-tags
   :placeholder="showPlaceholder"
 />
getCascader() {
  this.cascaderValue= []
  ++this.isResouceShow      
  this.showPlaceholder = '请先选择所属范围'
  getCascader(this.type).then(response => {
	  if(response.data.data.length === 0){
	      this.optionsChanged = true
	      this.showPlaceholder = '暂无范围'
	      return
	    }
  this.cascaderOption = response.data.data
  });
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Vue如何获取下拉框中选中的value值和label值

    Vue如何获取下拉框中选中的value值和label值

    这篇文章主要介绍了Vue如何获取下拉框中选中的value值和label值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • 快速掌握Vue Router使用方法

    快速掌握Vue Router使用方法

    Vue Router是Vue.js官方的路由管理器。它和Vue.js的核心深度集成,让构建单页面应用变得易如反掌。路由实际上就是可以理解为指向,就是我在页面上点击一个按钮需要跳转到对应的页面,这就是路由跳转
    2023-01-01
  • vue中使用axios post上传头像/图片并实时显示到页面的方法

    vue中使用axios post上传头像/图片并实时显示到页面的方法

    今天小编就为大家分享一篇vue中使用axios post上传头像/图片并实时显示到页面的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • Vue中判断语句与循环语句基础用法及v-if和v-for的注意事项详解

    Vue中判断语句与循环语句基础用法及v-if和v-for的注意事项详解

    在Vue指令中,最经常被用于做逻辑操作的指令,下面这篇文章主要给大家介绍了关于Vue中判断语句与循环语句基础用法及v-if和v-for注意事项的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • Vite中使用Ant Design Vue3.x框架教程示例

    Vite中使用Ant Design Vue3.x框架教程示例

    这篇文章主要为大家介绍了Vite中使用Ant Design Vue3.x框架教程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • vue中watch和computed的区别详解

    vue中watch和computed的区别详解

    这篇文章主要给大家介绍了关于vue中watch和computed区别的相关资料,computed和watch都是vue框架中的用于监听数据变化的属性,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • vue router2.0二级路由的简单使用

    vue router2.0二级路由的简单使用

    这篇文章主要为大家详细介绍了vue router2.0二级路由的简单使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • Vue+Router+Element实现简易导航栏

    Vue+Router+Element实现简易导航栏

    这篇文章主要为大家详细介绍了Vue+Router+Element实现简易导航栏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • vue实现动态表格提交参数动态生成控件的操作

    vue实现动态表格提交参数动态生成控件的操作

    这篇文章主要介绍了vue实现动态表格提交参数动态生成控件的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • vue通过cookie获取用户登录信息的思路详解

    vue通过cookie获取用户登录信息的思路详解

    这篇文章主要介绍了vue通过cookie获取用户登录信息的思路详解,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-10-10

最新评论