vue2使用element ui实现树形控件懒加载、单选、选择节点后取消默认记录上一次确定结果

需求描述:点击按钮弹出弹窗,数据量较大,所以为懒加载树形控件(可搜索)

                 1.  节点只可进行单选

                 2. 添加和编辑共用一个弹窗(编辑页面进入弹窗:选中节点后点取消回到编辑页面,再次进入编辑默认选中的应该是上一次点击确定后的节点)

lazy 控制懒加载;node-key 树节点用来作为唯一标识的属性(做单选必须要用)

具体实现: 

<el-tree
          ref="departTree"
          :props="props"
          :load="loadNode"
          node-key="id"
          lazy
          show-checkbox
          check-strictly
          :filter-node-method="filterNode"
          :default-checked-keys="checkedKey"
          :default-expanded-keys="expandKey"
          @check="checkJoint" 
        ></el-tree>

checkedKeyexpandKey分别是默认选中节点和默认展开节点(都是数组)

注意如果测试中使用的不是用变量进行props传参,那需要手动清除该值,否则会出现再次打开页面编辑会显示两个默认选中节点。一个是写死的默认节点值,一个是组件提供的

该数据可以和后端沟通,让后端处理好返回给你。否则就要通过默认节点来遍历查询需要展开的节点(数据量大,渲染效率低)

// 假数据
list: [
        {
          id: 0,
          label: '江苏省',
          children: [
            {
              id: 11,
              label: '省本级',
              children: [
                {
                  id: 12,
                  label: '1'
                },
                {
                  id: 13,
                  label: '2'
                },
                {
                  id: 14,
                  label: '3'
                }
              ]
            },
            {
              id: 21,
              label: '南京市',
              children: [
                {
                  id: 22,
                  label: '南京市市本级',
                  children: [
                    {
                      id: 221,
                      label: '1'
                    },
                    {
                      id: 222,
                      label: '2'
                    }
                  ]
                },
                {
                  id: 23,
                  label: '南京市建邺区'
                },
                {
                  id: 24,
                  label: '南京市鼓楼区'
                }
              ]
            }
          ]
        }
      ],

实现单选:

element UI 中树型控件提供方法不唯一,只要能实现设置选中节点即可

 checkJoint (data) {
      this.$refs.departTree.setCheckedNodes([data])
      this.selectData = data   //有需要可以记录选中节点的数据
    },

实现编辑页面选中节点后点击取消,再次进入默认选中节点为上一次点击确定节点:

// 取消
    cancel () {
      // 将默认选中节点设为上一次点击确定选中的节点
      this.$refs.departTree.setCheckedKeys(this.checkedKey)  
      this.$emit('input', false)  //关闭弹窗
    }

实现懒加载: 

(懒加载具体实现和提供的数据是相关联的,请注意数据格式)

// 我造的数据是将结果一次性都给你了,如果格式不同,需要修改
loadNode (node, resolve) {
      if (node.level === 0) {
        return resolve([this.list[0]] || [])
      }
      // 其余节点处理
      if (node.level >= 1) {
        return resolve(node.data.children || [])
      }
    },

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3 中使用 Element Plus 的树形控件进行懒加载,可以通过在 `lazy` 属性上设置为 `true` 来实现。具体步骤如下: 1. 创建一个树形组件,在组件中使用 `el-tree` 标签引入 Element Plus 的树形控件,并设置 `lazy` 属性为 `true`。 2. 在 `el-tree` 标签中,设置 `load` 属性为一个函数,该函数接收一个节点对象作为参数,返回一个 Promise 对象。在该函数中,根据节点的 id 请求子节点数据,并将子节点数据作为 Promise 对象的返回值。 3. 在父组件中,使用 `el-tree` 标签引入树形组件,并传递根节点数据。在需要加载子节点数据时,点击节点即可触发 `load` 函数,异步加载子节点数据。 下面是一个简单的示例代码: ``` // Tree.vue <template> <el-tree :lazy="true" :load="loadChildren" :data="data"></el-tree> </template> <script> export default { data() { return { data: [] } }, methods: { async loadChildren(node) { // 异步请求子节点数据 const response = await fetch(`/api/nodes/${node.id}`) const children = await response.json() // 将子节点数据添加节点对象中 node.children = children // 返回 Promise 对象,传递子节点数据 return children } } } </script> // Parent.vue <template> <div> <tree :data="data"></tree> </div> </template> <script> import Tree from './Tree.vue' export default { components: { Tree }, data() { return { data: [] } }, async mounted() { // 异步请求根节点数据 const response = await fetch('/api/nodes/1') const root = await response.json() // 设置根节点数据 this.data.push(root) } } </script> ``` 在 Tree.vue 中,使用 `el-tree` 标签引入 Element Plus 的树形控件,并设置 `lazy` 属性为 `true`,`load` 属性为一个异步函数 `loadChildren`。在 `loadChildren` 函数中,根据节点的 id 请求子节点数据,并将子节点数据添加节点对象中,然后返回一个 Promise 对象,传递子节点数据。 在 Parent.vue 中,使用 `tree` 标签引入树形组件,并传递根节点数据。在 `mounted` 钩子函数中,异步请求根节点数据,并将根节点数据添加到 `data` 数组中,然后在模板中通过 `data` 属性传递给树形组件。在需要加载子节点数据时,点击节点即可触发 `load` 函数,异步加载子节点数据

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值