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

目录
  • element中el-cascader的使用
  • 使用el-cascader报错解决
    • 一、options为空的情况
    • 二、编辑时给cascader赋值
    • 三、点击了父节点后改变了cascader的options

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
  });
}

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

(0)

相关推荐

  • elementui中的el-cascader级联选择器的实践

    目录 一.效果 二.主要代码 一.效果 功能:使用接口调回来的数据,显示出可选的项,并开始有默认的选项值. 二.主要代码 <el-cascader ref="cascaderAddr" :options="rangeArr" :props="optionProps" v-model="plable" @change="handleChange3" style="width: 100%;&qu

  • Element Cascader 级联选择器的使用示例

    组件-级联选择器 基础用法 <div class="block"> <span class="demonstration">默认 click 触发子菜单</span> <el-cascader v-model="value" :options="options" @change="handleChange"></el-cascader> </

  • Element中的Cascader(级联列表)动态加载省\市\区数据的方法

    element中的cascader其实是有动态加载次级选项的方法. 方法的原理是利用址(引用)传递,动态修改:options. var c={name: 'bob'} var d=c d.name = 'tom' console.log(c) // {name: "tom"} http://element-cn.eleme.io/#/zh-CN/component/cascader#dong-tai-jia-zai-ci-ji-xuan-xiang 其中找到究竟需要在那层添加数据就变成

  • 详解为element-ui的Select和Cascader添加弹层底部操作按钮

    如下图这样把操作按钮放在select弹层底部是一种挺常见的设计方式 但是很遗憾element-ui没有给我们提供这个插槽,我们想实现这个功能只能重写组件或者等官方更新吗,答案当然是否定的! 花了一点时间通过一个函数实现这个功能,支持el-select和el-cascader,效果点击预览 其实逻辑很简单,把下面这段html插入到指定位置就行了 <ul class="el-cascader-menu__list" style="border-top: solid 1px

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

    目录 element中el-cascader的使用 使用el-cascader报错解决 一.options为空的情况 二.编辑时给cascader赋值 三.点击了父节点后改变了cascader的options element中el-cascader的使用 从后端拿到arr数据结构: cityList: [     {         id: 1,         name: '北京',         child: [             id: 11,             name:

  • element中form组件prop嵌套属性的问题解决

    目录 Introduction 总结 Introduction 分享今天同事问的一个问题, 下面这段代码会报错,先看代码:重点是el-form-item组件的prop属性 <template> <div id="app"> <el-form label-width="100px" :model="ruleForm" :rules="rules"> <el-form-item v-for

  • Vue引入并使用Element组件库的两种方式小结

    目录 前言 Element-ui(饿了么ui) 安装element-ui 引入element-ui 完整引入element-u 按需引入element-ui 总结 前言 在开发的时候,虽然我们可以自己写css或者js甚至一些动画特效,但是也有很多开源的组件库帮我们写好了.我们只需要下载并引入即可. vue和element-ui在开发中是比较般配的,也是我们开发中用的很多的,下面就介绍下如何在eue项目中引入element-ui组件库 Element-ui(饿了么ui) element-ui(饿了

  • 在AngularJS框架中处理数据建模的方式解析

    我们知道,AngularJS并没有自带立等可用的数据建模方案.而是以相当抽象的方式,让我们在controller中使用JSON数据作为模型.但是随着时间的推移和项目的成长,我意识到这种建模的方式不再能满足我们项目的需求.在这篇文章中我会介绍在我的AngularJS应用中处理数据建模的方式. 为Controller定义模型 让我们从一个简单的例子开始.我想要显示一个书本(book)的页面.下面是控制器(Controller): BookController app.controller('Book

  • JSP中EL表达式的用法详解(必看篇)

    EL 全名为Expression Language EL 语法很简单,它最大的特点就是使用上很方便.接下来介绍EL主要的语法结构: ${sessionScope.user.sex} 所有EL都是以${为起始.以}为结尾的.上述EL范例的意思是:从Session的范围中,取得 用户的性别.假若依照之前JSP Scriptlet的写法如下: User user =(User)session.getAttribute("user"); String sex =user.getSex( );

  • jsp页面中EL表达式被当成字符串处理不显示值问题的解决方法

    在自己练手时遇到了EL表达式被当成字符串处理而没有正确解析的现象.当时工程中使用的Javaee5, web.xml <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/

  • js中el表达式的使用和非空判断方法

    注意,这里想说的不是jsp里面嵌套的el表达式的使用,而是在js中使用. 场景: 页面跳转后,使用spring mvc向前端页面传过来一个json对象,要在js中获取后,做处理. 返回的json对象: {"nodes":[{"contactmobile":"15922208502","orderno":"XNH31918062989476864"},{"id":"12198&q

  • vue+element导航栏高亮显示的解决方式

    用导航菜单时遇到的一些问题:点击打开官网例子 问题1: 页面强制刷新,按F5时,页面如果没有好好设置的话,导航栏默认叠起来,而且无高亮显示:刷新后导航栏显示和之前不一致,如图所示 解决: html关键代码设置 :default-active="defaultUrl" 这儿的原理就是defaultUrl跟#/后面的一致,也就是说跟router.js中的path一致才行(router.js见后文) window.location.href.split('/#')[1] 获取的是"

  • Java中动态规则的实现方式示例详解

    背景 业务系统在应用过程中,有时候要处理"经常变化"的部分,这部分需求可能是"业务规则",也可能是"不同的数据处理逻辑",这部分动态规则的问题,往往需要可配置,并对性能和实时性有一定要求. Java不是解决动态层问题的理想语言,在实践中发现主要有以下几种方式可以实现: 表达式语言(expression language) 动态语言(dynamic/script language language),如Groovy 规则引擎(rule engine

随机推荐