修复element ui级联懒加载问题,二次封装成el-cascader-plus

el-cascader-plus

经常碰到懒加载不回显的问题,使用起来很不方便,于是花了些时间二次开发了这个组件,下次遇到同样问题就能直接解决,在此开源出来,希望对遇到相同问题的人有帮助。开源互助使程序的世界更美好!

el-cascader-plus基于 element-ui 级联二次封装,弥补了原 element-ui 级联组件懒加载经常无法回显的不足,用法与原级联组件一致。

使用前请确保安装了 vue 和 element ui (或者已单独按需引入 element ui 的级联 Cascader)

版本推荐 "vue": "^2.6.11","element-ui": "^2.15.13",

配置参数同 ElementUI 的 Cascader 级联选择器,可参考其文档ElementUI 官方文档

新增的属性

参数说明类型可选值默认值
maxLevel懒加载最大层级,最小值0Number整数1000

git仓库https://github.com/fatelyh/el-cascader-plus

优化点:

1、修复原组件懒加载单选数据加载延迟的情况下不响应数据变动、不触发回显的问题   2、修复原组件懒加载多选不响应数据变动、不触发回显的问题 3、单选懒加载做了回显速度优化,比原组件单选懒加载回显速度会快一些 4、新增一个prop属性:maxLevel,可限制懒加载最大层级,整数,最小值0,默认值1000   5、props中的lazyLoad在原基础上对resolve做了一点小修改。


      props{
        lazy:true,
        lazyLoad:this.getNode
      }

      getNode(node, resolve) {
     //根据node获取子集操作
      resolve(params)
     // 其中params可为普通数据和promise(要有resolve值)
   }


效果预览

image
image

install 安装


npm i el-cascader-plus --save

使用

在 main.js 中写入下面的代码就可以全局使用


import elCascaderPlus from "el-cascader-plus";

Vue.use(elCascaderPlus);

在组件中单独使用


import elCascaderPlus from "el-cascader-plus";

export default {

  name"demo",

  components: {

    elCascaderPlus,

  },

};

代码示例


<template>

  <div class="demo">

    <div class="mg20 title">el-cascader-plus</div>

    <div class="mg20">

      <div class="mg20">el-cascader-plus单选</div>

      <el-cascader-plus

        style="width: 400px"

        ref="cascader"

        v-model="value"

        @change="change"

        :options="options"

      >
</el-cascader-plus>

    </div>

    <div class="mg20">

      <div class="mg20">el-cascader-plus单选不关联</div>

      <el-cascader-plus

        style="width: 400px"

        ref="cascader"

        v-model="value1"

        :props="{ checkStrictly: true }"

        @change="change"

        :options="options"

      >
</el-cascader-plus>

    </div>

    <div class="mg20">

      <div class="mg20">el-cascader-plus多选</div>

      <el-cascader-plus

        style="width: 400px"

        ref="cascader"

        v-model="multipleValue"

        :props="{ multiple: true }"

        @change="change"

        :options="options"

      >
</el-cascader-plus>

    </div>

    <div class="mg20">

      <div class="mg20">el-cascader-plus多选不关联</div>

      <el-cascader-plus

        style="width: 400px"

        ref="cascader"

        v-model="multipleValue1"

        :props="{ multiple: true, checkStrictly: true }"

        @change="change"

        :options="options"

      >
</el-cascader-plus>

    </div>

    <div class="mg20">

      <div class="mg20">el-cascader-plus懒加载单选</div>

      <el-cascader-plus

        style="width: 400px"

        ref="cascader"

        v-model="value"

        :props="props"

        @change="change"

      >
</el-cascader-plus>

    </div>

    <div class="mg20">

      <div class="mg20">el-cascader-plus懒加载单选不关联</div>

      <el-cascader-plus

        style="width: 400px"

        ref="cascader"

        v-model="value1"

        :props="{ ...props, checkStrictly: true }"

        @change="change"

      >
</el-cascader-plus>

    </div>

    <div class="mg20">

      <div class="mg20">el-cascader-plus懒加载多选</div>

      <el-cascader-plus

        style="width: 400px"

        ref="cascader"

        v-model="multipleValue"

        :props="{ ...props, multiple: true }"

        @change="change"

      >
</el-cascader-plus>

    </div>

    <div class="mg20">

      <div class="mg20">el-cascader-plus懒加载多选不关联</div>

      <el-cascader-plus

        style="width: 400px"

        ref="cascader"

        v-model="multipleValue1"

        :props="{ ...props, multiple: true, checkStrictly: true }"

        @change="change"

      >
</el-cascader-plus>

    </div>

    <div class="mg20">

      <div class="mg20">el-cascader-plus懒加载设置maxLevel为1</div>

      <el-cascader-plus

        :maxLevel="1"

        style="width: 400px"

        v-model="value2"

        :props="props"

      >
</el-cascader-plus>

    </div>

  </div>


</template>

<script>

import elCascaderPlus from "el-cascader-plus";

export default {

  name: "demo",

  components: {

    elCascaderPlus,

  },

  data() {

    return {

      res: [],

      /
/ 级联懒加载

      props: {

        multiple: false,

        lazy: true,

        lazyLoad: this.getNode,

      },

      value: [17, 18, 19],

      value1: [17, 18, 19],

      value2: [],

      multipleValue: [[17, 18, 19]],

      multipleValue1: [[17, 18, 19]],

      options: [

        {

          value: 1,

          label: "东南",

          children: [

            {

              value: 2,

              label: "上海",

              children: [

                {

                  value: 3,

                  label: "普陀",

                  leaf: true,

                },

                {

                  value: 4,

                  label: "黄埔",

                  leaf: true,

                },

                {

                  value: 5,

                  label: "徐汇",

                  leaf: true,

                },

              ],

            },

            {

              value: 7,

              label: "江苏",

              children: [

                {

                  value: 8,

                  label: "南京",

                  leaf: true,

                },

                {

                  value: 9,

                  label: "苏州",

                  leaf: true,

                },

                {

                  value: 10,

                  label: "无锡",

                  leaf: true,

                },

              ],

            },

            {

              value: 12,

              label: "浙江",

              children: [

                {

                  value: 13,

                  label: "杭州",

                  leaf: true,

                },

                {

                  value: 14,

                  label: "宁波",

                  leaf: true,

                },

                {

                  value: 15,

                  label: "嘉兴",

                  leaf: true,

                },

              ],

            },

          ],

        },

        {

          value: 17,

          label: "西北",

          children: [

            {

              value: 18,

              label: "陕西",

              children: [

                {

                  value: 19,

                  label: "西安",

                  leaf: true,

                },

                {

                  value: 20,

                  label: "延安",

                  leaf: true,

                },

              ],

            },

            {

              value: 21,

              label: "新疆维吾尔族自治区",

              children: [

                {

                  value: 22,

                  label: "乌鲁木齐",

                  leaf: true,

                },

                {

                  value: 23,

                  label: "克拉玛依",

                  leaf: true,

                },

              ],

            },

          ],

        },

      ],

    };

  },

  watch: {},

  methods: {

    change(e) {

      console.log(e);

    },

    /
/ 获取当前点击节点的子node,根据node数据和后端交互,此处为模拟后端请求

    async getNode(node, resolve) {

      const {

        level, /
/层级

        value,

        data,

      } = node;

      /
/ 模拟后端请求

      /
/ 0级处理

      if (level == 0) {

        let options = JSON.parse(JSON.stringify(this.options));

        let nodes = options.map((v, index) => {

          delete v.children;

          return {

            ...v,

          };

        });

        setTimeout(() => resolve(nodes), 500);

      } else {

        this.res = [];

        let options = JSON.parse(JSON.stringify(this.options));

        for (let i = 0; i < options.length; i++) {

          this.findChildren(options[i], value);

        }

        /
/ 去除子集的children

        let nodes = [];

        if (this.res.length) {

          nodes = this.res.map((v, index) => {

            delete v.children;

            return {

              ...v,

            };

          });

        }

        setTimeout(() => resolve(nodes), 500);

      }

    },

    /
/  找到某个树节点并返回子集

    findChildren(item, cid, flag = false) {

      if (item.value == cid) {

        flag = true;

      }

      if (flag && item.children && item.children.length) {

        this.res = [];

        this.res = item.children;

      }

      if (!item.children) {

        return;

      } else {

        item.children.forEach((child) => {

          this.findChildren(child, cid, false);

        });

      }

    },

  },

};

</
script>

<style>

.mg20 {

  margin-top20px;

}

.title {

  font-weight: bold;

  font-size26px;

}

</style>


本文由 mdnice 多平台发布

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 C# 中封装 jqGrid 表格搜索,可以使用 jQuery 的 AJAX 功能向后端发送请求并获取数据,然后使用 JSON 序列化和反序列化来处理数据。以下是一个简单的示例: 首先,在前端页面中,你需要定义一个 jqGrid 表格,并且在表格上方添加搜索框和搜索按钮。这里假设搜索框的 ID 为 `searchInput`,搜索按钮的 ID 为 `searchButton`,表格的 ID 为 `grid`: ``` html <div> <input type="text" id="searchInput"> <button type="button" id="searchButton">搜索</button> </div> <table id="grid"></table> ``` 接下来,在 JavaScript 中,你需要定义一个函数来处理搜索请求,并使用 AJAX 向后端发送请求。这里假设后端接口的 URL 为 `/api/search`: ``` javascript function search() { var keyword = $("#searchInput").val(); $.ajax({ url: "/api/search", data: { keyword: keyword }, success: function(data) { $("#grid").jqGrid("setGridParam", { data: data }).trigger("reloadGrid"); }, error: function(xhr, status, error) { alert("搜索错误:" + error); } }); } ``` 在上面的代码中,`search` 函数首先从搜索框中获取关键词,然后使用 AJAX 向后端发送请求,请求参数中包含关键词。如果请求功,就将返回的数据设置到 jqGrid 中,并触发表格重新加载的事件。如果请求失败,就弹出错误提示框。 最后,在 C# 后端中,你需要处理搜索请求,并返回符合搜索条件的数据。这里假设你使用 ASP.NET Web API 2 来处理请求,你可以这样编写控制器方法: ``` csharp public IHttpActionResult Search(string keyword) { var data = GetData(); // 获取原始数据 var filteredData = data.Where(d => d.Contains(keyword)); // 进行筛选 return Json(filteredData); // 返回 JSON 格式的数据 } ``` 在上面的代码中,`Search` 方法首先从数据源中获取原始数据,然后使用 LINQ 进行筛选,找出符合搜索关键词的数据。最后,将筛选后的数据以 JSON 格式返回给前端。 需要注意的是,这里的 `GetData` 方法需要根据你的具体业务逻辑来实现,它可以从数据库、文件、缓存等数据源中获取数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值