当前位置: 首页 > article >正文

vue+element Ui 树型组件tree懒加载+搜索框远程请求数据为平铺类型

本人之前一直是耕耘后台研发,最近接了个小需求需要接触到vue,记录一下我遇到的一些前端解决时间长的问题
需求:
1:每次动态请求接口获取下一节点数据
2:接口返回的数据是list,不带子节点,用pid来维护父子之间的关系
3:带有搜索框,搜索框为请求远程数据,数据为不带子节点数据用pid来维护
4:简单!!!
页面:
在这里插入图片描述
需要组件:
下载三方插件 使用arrayTotree插件 将扁平化数组转换为树形结构数组 并赋值给list

npm install array-to-tree --save

import arrayToTree from ‘array-to-tree’

data中的自定义数组 = arrayToTree(获取请求的数组, { parentProperty: ‘父级id’, customID: ‘二级id’});

代码:

<template>
    <el-tabs v-model="activeName">
        <el-tab-pane label="成员" name="first">
            <!--左边-->
            <el-container>
                <el-aside width="200px">
                    <el-input
                            placeholder="Search by name"
                            prefix-icon="el-icon-search"
                            v-model="inputStr"
                            class="name-email-search"
                            size="small"
                            clearable
                            @blur="initSearch"
                            @clear="initSearch">
                    </el-input>

                    <el-tree
                            :data="treeList"
                            ref="tree"
                            class="vue-tree"
                            lazy
                            :load="loadNode"
                            :highlight-current="true"
                            :node-key="nodeKey"
                            @node-click="nodeClick"
                            :expand-on-click-node="false"
                            :props="defaultProps"
                    ></el-tree>
                </el-aside>


                <!--右边-->
                <el-main>{{str}}</el-main>

            </el-container>
        </el-tab-pane>


        <el-tab-pane label="组织" name="second">组织

        </el-tab-pane>
    </el-tabs>

</template>
<script>

    import {childNodes, search} from "../api/dept";
    import  arrayToTree  from  'array-to-tree';
    import {treeList} from "../api/system/msg";

    export default {
        data() {
            return {
                activeName: 'first',
                //输入框输入的值
                inputStr: '',
                defaultProps: {
                    children: "children",
                    label: "name",
                    isLeaf: "isLeaf",
                },
                currentNodeKey: "",
                //当前树用到的list
                treeList: [],
                str: 'aaa'
            };
        },

        methods: {
        	//搜索框
            async initSearch(resolve) {
                const param = {
                    orders: [],
                    conditions: [{field: 'name', value: this.inputStr}]
                };
                const res = await search(param)
                //将搜索出来的扁平数据转换成tree树状数据
				//再将搜索出来的数据替换之前加载的tree数据
                this.treeList = arrayToTree(res.data.data,
                    {parentProperty:'pid', customID:'deptId'}) ;
            },
            // 懒加载获取树形结构
            loadNode(node, resolve) {
                //调用接口时,我们的需求是第一级传参为0,后面为当前节点的唯一表示id,可以根据需求而定
                // node.level为0时,就是tree的第一级
                const spaceParentGuid = node.level === 0 ? 0 : node.data.deptId
                childNodes(spaceParentGuid).then(({data}) => {
                    resolve(
                        data.data.map(item => {
                            return {
                                ...item,
                                leaf: !item.hasChildren // 此参数用来判断当前节点是否为叶子节点
                            }
                        })
                    )
                })
            },
            nodeClick() {
                this.str = 'changede';
            }

        },
        mounted() {
        }
    };
</script>

后端查询接口接口返回数据格式:

{
  "success": true,
  "message": null,
  "data": [
    {
      "deptId": 1,
      "pid": 0,
      "subCount": 0,
      "name": "默认组织",
      "deptSort": 0,
      "createBy": null,
      "updateBy": null,
      "createTime": 1682229715,
      "updateTime": 1682229715,
      "hasChildren": false,
      "leaf": true,
      "top": true
    },
    {
      "deptId": 1231231,
      "pid": 354122786547134460,
      "subCount": 0,
      "name": "xw部门2",
      "deptSort": 999,
      "createBy": null,
      "updateBy": null,
      "createTime": null,
      "updateTime": null,
      "hasChildren": false,
      "leaf": true,
      "top": false
    }]
    }

到上面的就结束了,下面是是笔者自己记录的,记得替换成自己的

请求的接口:dept.js

import request from '../utils/request'

const localHost = 'http://localhost:8081'

export function search(data) {
  return request({
    url: localHost+'/plugin/dept/search',
    method: 'post',
    data
  })
}

export function childNodes(data) {
  return request({
    url: localHost+'/plugin/dept/childNodes/'+data,
    method: 'post',
    data
  })
}

接口拦截器:request.js

import axios from 'axios'
import Config from '@/settings'
import { getToken } from '../utils/auth'

const TokenKey = Config.TokenKey

let service = axios.create({
    timeout: 10000
})

// request interceptor
service.interceptors.request.use(
    config => {
        console.log(getToken())
        config.headers[TokenKey] =getToken() ;
        return config
    },
    error => {
        return Promise.reject(error)
    }
)

// Response interceptor for API calls
service.interceptors.response.use(
    response => {
        return response;
    },
    error => {
        if(error.response.status == 403){
            refreshToken()
        }
    }
);


const refreshToken= ()=>{
    // gets new access token
}


export default service

http://www.kler.cn/a/15912.html

相关文章:

  • .netcore + postgis 保存地图围栏数据
  • 用pandoc工具实现ipynb,md,word,pdf之间的转化
  • STM32 串口输出调试信息
  • hive 统计各项目下排名前5的问题种类
  • 如何在 Ubuntu 上 部署 OceanBase
  • UNIX网络编程-TCP套接字编程(实战)
  • TF-IDF (BigData, Data Mining)
  • 【LeetCode: 62. 不同路径 | 暴力递归=>记忆化搜索=>动态规划 】
  • 设计模式-适配器模式
  • RabbitMQ 工作队列模式 Work Queue Demo
  • C S S
  • 制药专业转行软件测试,带我的师傅在这干了两年半,最终还是跑路了......
  • 第11届蓝桥杯省赛真题剖析-2020年6月21日Scratch编程初中级组
  • 渗透测试 | 目录扫描
  • 英语基础-名词
  • 基于Mediapipe手势识别
  • 一文吃透Http协议
  • 国民技术N32G430开发笔记(8)- 内部Flash的读写操作
  • Python程序员如何写简历容易找到好工作?分享4个制作简历的细节
  • API接口安全—webservice、Swagger、WEBpack
  • 【Hello Network】网络编程套接字(三)
  • 颜色空间转换RGB-YCbCr
  • 软考(中/高级)高频考点——进度管理
  • 【五一创作】mongoDB的应用场景以及Spring和mongodb的整合
  • 【LLM】离线部署ChatGLM-6B模型
  • 深度学习笔记之稀疏自编码器