首页 > 其他分享 >【element UI】el-cascader 组件使用过程踩坑记录

【element UI】el-cascader 组件使用过程踩坑记录

时间:2022-09-29 00:33:49浏览次数:47  
标签:el false 回显 value element isParent UI leaf true

前言

项目中使用到 el-cascader 组件,记录下遇到的一些问题以及解决方法,方便后续回顾查看。

样式问题

我是使用按需引入的 element UI,当使用到 el-cascader 组件时,下拉框里的布局有问题,如下图所示:

image

【解决方法】引入下面的 css

import 'element-ui/lib/theme-chalk/index.css'

最终效果:
image

布局错乱

在项目我是使用弹窗表单的形式展示,使用到了 el-cascader ,在选择某级数据的时候,选中后,发现下拉面板跑到左上角去了,如下图:
image

【解决方法】在 el-cascader 加上 :append-to-body="false"

<el-cascader
   :props="props"
   :append-to-body="false"
   v-model="cascaderValue"
   @change="lastChange"
></el-cascader>

懒加载数据+回显

由于数据太多使用了懒加载的形式,下面是记录测试使用过的回显两种方法,都可以实现回显。

注意:数据回显的时候,一定要在最后一层的数据加上 leaf: true 这个字段,不然回显下拉框的数据是对应上了,但是会发现 input 输入框不显示回显的数据 !!!!

使用 key

组件绑定 key 值,当 el-cascader 使用 v-model 绑定的值改变时,也修改下 key 值,达到回显效果。
部分代码:

<el-cascader
   :props="props"
   :key="cascaderKey"
   v-model="cascaderValue"
   @change="lastChange"
></el-cascader>
<el-button @click="btn2">回显["zhinan", "shejiyuanze"]</el-button>
export default{
  data() {
    return {
      props: {
        lazy: true,
        lazyLoad: this.lazyLoad
      },
      cascaderValue: [],
      cascaderKey: 0, // 回显使用
    };
  },
  methods:{
    btn2(){
      this.cascaderValue = ["zhinan", "shejiyuanze"];
      this.cascaderKey++;
    }
  }
}

完整代码:(完整代码是根据项目需求实现的小demo,仅演示回显使用)

<template>
  <div class="main">
    <el-button @click="btn2">回显["zhinan", "shejiyuanze"]</el-button>
    <div class="Cascader">
      <el-cascader
        :props="props"
        :key="cascaderKey"
        v-model="cascaderValue"
      ></el-cascader>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      props: {
        lazy: true,
        lazyLoad: this.lazyLoad,
      },
      cascaderValue: [],
      cascaderKey: 0, // 回显使用
    };
  },

  methods: {
    btn2() {
      this.cascaderValue = ["zhinan", "shejiyuanze"];
      this.cascaderKey++;
    },

    lazyLoad(node, resolve) {
      const { level, value } = node;
      let option =
        level === 0 ? this.getData(false, node) : this.getData(value, node);
      console.log(`${level}-`, option);
      setTimeout(() => {
        resolve(option);
      }, 500);
    },

    // 模拟后端数据
    getData(value = false, node) {
      let result = [];
      if (!value) {
        let list = [
          {
            value: "zhinan",
            label: "指南",
            isParent: true,
            type: "folder",
            leaf: false,
          },
          {
            value: "zujian",
            label: "组件",
            isParent: true,
            type: "folder",
            leaf: false,
          },
        ];
       
        result = list;
      } else {
        let obj = {
          zhinan: [
            {
              value: "shejiyuanze",
              label: "设计原则",
              isParent: true,
              type: "folder",
              leaf: false,
            },
          ],
          shejiyuanze: [
            {
              value: "tag",
              label: "Tag 标签",
              isParent: false,
              type: "file",
              leaf: false,
            },
          ],
          zujian: [
            {
              value: "layout",
              label: "Layout 布局",
              isParent: true,
              type: "folder",
            },
          ],
          layout: [
            {
              value: "table",
              label: "Table 表格",
              isParent: false,
              type: "file",
              leaf: false,
            },
          ],
        };
        let arr = obj[value];
        let newArr = [];
        arr.forEach((element) => {
          if (element.isParent) {
            newArr.push(element);
          }
        });
        // 类型为 文件夹的 type: "folder" 输出
        // 【回显重要步骤离不开 leaf,没有这个回显一直不生效,要在这里赋值判断是否是叶子最后节点,是的话赋值,然后才可以回显】
        if (newArr.length === 0) {
          node.data.leaf = true;
          result = [];
        } else {
          result = newArr;
        }
      }

      return result;
    },
  },
};
</script>

使用 lazyLoad() 方法

这个需要 el-cascader 需要绑定 ref,然后调用方法:

this.$refs.cascader.panel.lazyLoad();

部分代码:

<el-button @click="btn2">回显["zhinan", "shejiyuanze"]</el-button>
<el-cascader
   ref="cascader"
   :props="props"
   v-model="cascaderValue"
></el-cascader>
  data() {
    return {
      props: {
        lazy: true,
        lazyLoad: this.lazyLoad,
      },
      cascaderValue: [],
      cascaderKey: 0, // 回显使用
    };
  },
  methods:{
    btn2() {
      this.cascaderValue = ["zhinan", "shejiyuanze"];
      this.$refs.cascader.panel.lazyLoad();
    },
  }

完整代码:(完整代码是根据项目需求实现的小demo,仅演示回显使用)

<template>
  <div class="main">
    <el-button @click="btn2">回显["zhinan", "shejiyuanze"]</el-button>
    <div class="Cascader">
      <el-cascader
        ref="cascader"
        :props="props"
        v-model="cascaderValue"
      ></el-cascader>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      props: {
        lazy: true,
        lazyLoad: this.lazyLoad,
      },
      cascaderValue: [],
      cascaderKey: 0, // 回显使用
    };
  },

  methods: {
    btn2() {
      this.cascaderValue = ["zhinan", "shejiyuanze"];
      this.$refs.cascader.panel.lazyLoad();
    },

    lazyLoad(node, resolve) {
      const { level, value } = node;
      let option =
        level === 0 ? this.getData(false, node) : this.getData(value, node);
      console.log(`${level}-`, option);
      setTimeout(() => {
        resolve(option);
      }, 500);
    },

    // 模拟后端数据
    getData(value = false, node) {
      console.log("getData:", this.cascaderValue);
      let result = [];
      if (!value) {
        let list = [
          {
            value: "zhinan",
            label: "指南",
            isParent: true,
            type: "folder",
            leaf: false,
          },
          {
            value: "zujian",
            label: "组件",
            isParent: true,
            type: "folder",
            leaf: false,
          },
        ];
        
        result = list;
      } else {
        let obj = {
          zhinan: [
            {
              value: "shejiyuanze",
              label: "设计原则",
              isParent: true,
              type: "folder",
              leaf: false,
            },
          ],
          shejiyuanze: [
            {
              value: "tag",
              label: "Tag 标签",
              isParent: false,
              type: "file",
              leaf: false,
            },
          ],
          zujian: [
            {
              value: "layout",
              label: "Layout 布局",
              isParent: true,
              type: "folder",
            },
          ],
          layout: [
            {
              value: "table",
              label: "Table 表格",
              isParent: false,
              type: "file",
              leaf: false,
            },
          ],
        };
        let arr = obj[value];
        let newArr = [];
        arr.forEach((element) => {
          if (element.isParent) {
            newArr.push(element);
          }
        });
        // 类型为 文件夹的 type: "folder" 输出
        // 【回显重要步骤离不开 leaf,没有这个回显一直不生效,要在这里赋值判断是否是叶子最后节点,是的话赋值,然后才可以回显】
        if (newArr.length === 0) {
          node.data.leaf = true;
          result = [];
        } else {
          result = newArr;
        }
      }

      return result;
    },
  },
};
</script>

最终实现回显效果:
image

标签:el,false,回显,value,element,isParent,UI,leaf,true
From: https://www.cnblogs.com/clownblogs/p/16740011.html

相关文章

  • MainActivity 与 Fragment 之间使用 ViewModel 通信
    创建ViewModel类日期选择器的结果保存到ViewModel,在MainActivity中获取ViewModel更新之后的值,再把值重新渲染到UI上。publicclassTimePickerViewModelextend......
  • maui仿真器安卓虚机该位置
    vs2022maui安卓模拟器打开安卓设备管理器,新建设备1.先要安装hyper-v.否则虚拟机很慢,见不到桌面,总是在启动中2.pixel5,安卓api32.这个虚拟机安装好之后有近9G,尝试移......
  • 【WPF 】ItemTemplateSelector模板选择器
    WPF的ItemsControl数据绑定中,有时会遇到绑定的数据源是多种类型,并且需要对不同类型使用不同的模板。这个时候就需要用到 ItemTemplateSelector。ItemTemplateSelector......
  • element-ui 上传文件后点击图片实现预览效果
    背景在我们上传文件后我们希望点击文件实现预览效果进行确认或者其他操作。方式1:可以使用element-ui的upload组件+dialog+image组件解决,示例代码如下:<el-uploada......
  • burpsuite intruder 小技巧之 自动token验证
    第一步:标记爆破点,及爆破方式:爆破方式选择:pitch-fork:可以在每个爆破点载入不同的字典,但是在过程中多个字典均顺序执行。 第二步:配置payloads 针对token配置迭代调用;第三步:......
  • Powershell ExecutionPolicy 执行策略
    简单说明:powershell对于脚本的执行有着严格的安全限制Get-ExecutionPolicy-List#查看当前的执行策略Set-ExecutionPolicy-ScopeCurrentUserRemoteSigned#设置执行策略......
  • shell特殊符号下
    ####$变量前缀,正则里面表示行尾#!$是一个组合#~用户家目录,正则表达式表示匹配符#&放到命令后面,会把命令丢到后台#[指定字符中的一个,[0-9],[a-zA-Z],[abc]#;多条命令写......
  • Python办公实战!​按姓名拆分Excel为单独文件,微信自动发给相应联系人
    大家好,这里是Python程序员晚枫,今天给大家分享一篇读者的来稿:Python+Excel自动化办公,在工作中的实际应用。欢迎大家总结pipinstallpython-office的使用经验,联系我投稿......
  • Python之telnetlib模块
    telnetlib是python标准库中的一员,我们可以使用该模块以telnet的方式与服务器交互。请观察下面示例了解它的用法:importtelnetlibdefrun_telnet(host,username,password,......
  • Exception in thread "main" java.util.NoSuchElementException
    Exceptioninthread"main"java.util.NoSuchElementException用了两个scanner的时候,执行程序发生报错:Exceptioninthread"main"java.util.NoSuchElementExceptionat......