【sgLazyCascader】自定义组件:基于el-cascader的懒加载级联菜单,支持异步加载子级菜单

这篇具有很好参考价值的文章主要介绍了【sgLazyCascader】自定义组件:基于el-cascader的懒加载级联菜单,支持异步加载子级菜单。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【sgLazyCascader】自定义组件:基于el-cascader的懒加载级联菜单,支持异步加载子级菜单,Vue.js,vue.js,elementui,javascript

sgLazyCascader源码

<template>
  <el-cascader
    :class="$options.name"
    style="width: 100%"
    :props="props"
    v-model="model"
    :placeholder="placeholder || '请选择'"
    :clearable="clearable === '' || clearable"
    @change="change"
    @expand-change="expandChange"
    @blur="blur"
    @focus="focus"
    @visible-change="visibleChange"
    @remove-tag="removeTag"
  ></el-cascader>
</template>
<script>
export default {
  name: "sgLazyCascader",
  data() {
    return {
      model: null,
      mainKey: "id", //默认主键
      defaultRootId: "root", //默认根节点ID就是root
      form: {},
      props: {
        lazy: true,
        expandTrigger: "hover",
        multiple: false,
        checkStrictly: this.checkStrictly === "" || this.checkStrictly, //是否支持选中非叶子节点(是否严格的遵守父子节点不互相关联	)
        lazyLoad: (node, resolve) => {
          this.loadNodeData(
            node.level === 0 ? { [this.mainKey]: this.defaultRootId } : node.data,
            (d) => resolve(d)
          );
        },
      },
    };
  },
  props: [
    "value",
    "oldValue", //回显上次的数据(当级联菜单数据是懒加载模式的时候使用,这里是显示值不是实际ID,提供给用户观察的值)
    "data",
    "placeholder",
    "clearable",
    "checkStrictly", //是否允许选中非叶子节点
  ],
  watch: {
    value: {
      handler(d) {
        this.model = d;
      },
      deep: true,
      immediate: true,
    },
    model(d) {
      this.$emit("input", d);
    },
    data: {
      handler(d) {
        d.nodeKey && (this.mainKey = d.nodeKey); //主键
        d.rootId && (this.defaultRootId = d.rootId); //根节点ID
        d.value && (this.props.value = d.value); //指定选项的值为选项对象的某个属性值
        d.label && (this.props.label = d.label); //指定选项标签为选项对象的某个属性值
        d.children && (this.props.children = d.children); //指定选项的子选项为选项对象的某个属性值
        d.expandTrigger && (this.props.expandTrigger = d.expandTrigger); //次级菜单的展开方式click / hover
        d.hasOwnProperty("multiple") && (this.props.multiple = d.multiple); //是否多选
        d.hasOwnProperty("lazy") && (this.props.lazy = d.lazy); //是否动态加载子节点,需与 lazyLoad 方法结合使用
      },
      deep: true,
      immediate: true,
    },
    oldValue(d) {
      this.showOldValue(d);
    },
  },
  mounted() {
    this.oldValue && this.showOldValue(this.oldValue);
  },
  methods: {
    // 回显级联菜单上次的数据
    showOldValue(d) {
      let input = this.$el.querySelector(`input`);
      input && (input.value = d);
    },
    // 加载节点数据(通过接口向后台获取数据)
    loadNodeData(data, cb) {
      let resolve = (d) => {
        cb && cb(d);
      };
      this.$emit(`loadNode`, { data, resolve });
    },
    // 当选中节点变化时触发	[回调参数]选中节点的值
    change(d) {
      this.$emit(`change`, d);
    },
    // 当展开节点发生变化时触发	[回调参数]各父级选项值组成的数组
    expandChange(d) {
      this.$emit(`expandChange`, d);
    },
    // 	当失去焦点时触发	[回调参数](event: Event)
    blur(d) {
      this.$emit(`blur`, d);
    },
    // 当获得焦点时触发	[回调参数](event: Event)
    focus(d) {
      this.$emit(`focus`, d);
    },
    // 下拉框出现/隐藏时触发	[回调参数]出现则为 true,隐藏则为 false
    visibleChange(d) {
      this.$emit(`visibleChange`, d);
    },
    // 在多选模式下,移除Tag时触发	[回调参数]移除的Tag对应的节点的值
    removeTag(d) {
      this.$emit(`removeTag`, d);
    },
  },
};
</script>

用例

<template>
  <div :class="$options.name">
    <sgLazyCascader
      :oldValue="sgLazyCascader_oldValue"
      v-model="value"
      :data="{
        nodeKey: `ID`, //主键
        value: `ID`,
        label: 'MC',
      }"
      placeholder="请选择"
      @loadNode="loadNode"
    />
  </div>
</template>

<script>
import sgLazyCascader from "@/vue/components/admin/sgLazyCascader";
export default {
  components: {
    sgLazyCascader,
  },
  data() {
    return {
      sgLazyCascader_oldValue: null,
      value: [],
    };
  },
  methods: {
    // 加载节点数据
    loadNode({ data, resolve }) {
      this.$d.column_queryByPid({
        data: { PID: data.ID },
        doing: { s: (d) => resolve(d) },
      });
    },
    // 回显级联菜单上次的数据
    initSgLazyCascadeOldValue(d) {
      this.sgLazyCascader_oldValue = "回显信息1 / 回显信息2";
    },
  },
};
</script>

文章来源地址https://www.toymoban.com/news/detail-702714.html

到了这里,关于【sgLazyCascader】自定义组件:基于el-cascader的懒加载级联菜单,支持异步加载子级菜单的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • el-cascader级联选择器那些事

    el-cascader级联选择器那些事

    vue3+element-plus+ts 使用cascader组件提供的getCheckedNodes()

    2024年02月16日
    浏览(9)
  • 更改el-cascade默认的value和label的键值

    更改el-cascade默认的value和label的键值

      后端返回的树结构中,label的key不是el-cascade默认的label,我需要改成对应的字段,但是一直没有成功,我也在文档中找到了说明,但是我没注意这是在props中改,导致一直不成功 这是我一开始错误的写法: 这是正确的写法: 

    2024年04月17日
    浏览(12)
  • vue+element UI 使用el-cascader实现全选功能

    vue+element UI 使用el-cascader实现全选功能

    实现效果图     使用el-cascader代码片段 js代码 data数据设置: // 这里是处理成自己需要的数据格式, 需要把全选的这一选项过滤掉 // 原始选择的数据格式 [[\\\'全选\\\'], [1, 2], [1, 3], [1, 4],[5, 6], [5, 7, 8],5, 7, 9],[10]] //因为我自己需要的数据是“2,3,4,5”的格式,做了以下处理 注:本文是

    2024年02月12日
    浏览(10)
  • element ui 层级选择器el-cascader只能选最后一级多选

    element ui 层级选择器el-cascader只能选最后一级多选

    在element ui 中el-cascader多选: 每个层级都可以选择,但并不是我需要的,我需要多选只能选最后一级,在网上找了很久都复杂的,最终自己选择用css样式对checkbox进行隐藏。 实现方法: 在css 中加入 关键点在于利用属性选择器,遇到属性是 aria-haspopup (表示点击的时候是否会

    2024年02月11日
    浏览(8)
  • [element-ui] 级联选择器el-cascader不触发change事件

    [element-ui] 级联选择器el-cascader不触发change事件

    el-cascader 使用官网的数据是可以的 官网数据中最后一级没有children 就可以了 参考: elementui级联选择器Cascader不触发change事件

    2024年01月23日
    浏览(13)
  • ElementPlus el-cascader级联选择器 实现一级菜单单选,二级菜单多选

    ElementPlus el-cascader级联选择器 实现一级菜单单选,二级菜单多选

    需求: 利用el-cascader级联实现一级菜单单选,二级菜单多选的功能,如下图所示: 思路: 使用了多选multiply属性,这个属性下,选中的数据结构为:一级为length1的数组,二级为length2的数组。利用标识符,把最后选中的一级菜单的值与标识符做对比,如不同,则让标识符的值

    2024年02月11日
    浏览(12)
  • element-ui el-cascader级联选择器设置指定层级不能选中(示例代码)

    本文为转载原地址:https://www.136.la/shida/show-396330.html 有时候用element-ui el-cascader级联选择器添加分类时会遇到最多添加几级的限定.看了文档,只要给需要禁止选择的选项添加disabled属性就可以.但是使用一层一层循环遍历数据感觉很麻烦,自己写了个遍历的方法,纪录下,方便以后使

    2024年02月11日
    浏览(11)
  • vue element UI el-cascader 级联选择器 获取当前选择值的整个对象

    vue element UI el-cascader 级联选择器 获取当前选择值的整个对象

    要使用到cascader组件选中的数据的所有部分,并没有类似于select组件中的value可以指定,查看官方文档提供了新的方法,官方地址https://element.eleme.cn/#/zh-CN/component/cascader html部分 可以正常获取到该节点的全部数据,如下图所示: 如有问题请联系我~ 欢迎加入QQ群:

    2024年02月15日
    浏览(10)
  • el-cascader级联选择器加载远程数据、默认开始加载固定条、可以根据搜索加载远程数据。

    el-cascader级联选择器加载远程数据、默认开始加载固定条、可以根据搜索加载远程数据。

    加载用户列表分页请求、默认请求20条数据。想添加远程搜索用户功能。原有的方法 filter-method 不能监听到输入清空数据的时候。这样搜索完无法返回默认的20条数据。 直接监听级联选择的 v-model 绑定的值是无法检测到用户自己输入的。 解决思路: el-cascader 没有提供监听用户

    2024年02月14日
    浏览(8)
  • Vue+element-ui的el-cascader实现动态添加删除级联地点输入框

    实现省市区三级地点级联选择,可联想; 包括始发地点、途径地点、终止地点,始发地点、终止地点均为一个,途径地点可以没有也可以是多个; 用户可以动态添加/删除途径地点。 使用级联选择器Cascader需要的树形数据,前端请求到后端获取省市区数据并处理为elementui官网

    2024年02月04日
    浏览(10)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包