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
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 Element UI 中的 Input 组件和 Autocomplete 组件来实现搜索框功能。 首先,需要在页面中引入 Element UI 库和 Vue.js 库: ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Vue + Element UI Search Box</title> <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css"> </head> <body> <div id="app"> <el-autocomplete v-model="keyword" :fetch-suggestions="querySearchAsync" placeholder="请输入搜索关键字"> <el-button slot="append" icon="el-icon-search" @click="search">搜索</el-button> </el-autocomplete> </div> <script src="https://unpkg.com/vue/dist/vue.js"></script> <script src="https://unpkg.com/element-ui/lib/index.js"></script> <script> new Vue({ el: '#app', data() { return { keyword: '', suggestions: [] }; }, methods: { querySearchAsync(queryString, cb) { // 在这里实现异步搜索逻辑,返回搜索结果数组 }, search() { // 在这里实现搜索操作 } } }); </script> </body> </html> ``` 然后,在 Vue 实例中定义一个 data 对象来保存搜索关键字和搜索结果,以及两个方法来实现搜索功能: - querySearchAsync:调用异步方法进行搜索,返回搜索结果数组给 Autocomplete 组件。 - search:根据搜索关键字进行具体的搜索操作。 接下来,需要在 querySearchAsync 方法中实现异步搜索逻辑,可以使用 Ajax 或者 Fetch API 发送异步请求获取搜索结果。搜索结果数组的格式需要符合 Autocomplete 组件的要求,即每个元素都是一个对象,包含 value 和 label 两个属性,分别表示搜索结果的值和显示文本。 ```javascript methods: { querySearchAsync(queryString, cb) { axios.get('/api/search', { params: { q: queryString } }).then(response => { const data = response.data; const suggestions = data.map(item => { return { value: item.id, label: item.name }; }); cb(suggestions); }).catch(error => { console.error(error); }); }, search() { // 根据 this.keyword 进行具体的搜索操作 } } ``` 以上代码使用 axios 库发送异步请求,返回的数据是一个包含多个对象的数组,每个对象包含 id 和 name 两个属性。在 querySearchAsync 方法中将数组转换成 Autocomplete 组件需要的格式,并调用 cb 方法将搜索结果返回给 Autocomplete 组件。 最后,在 search 方法中可以根据 this.keyword 属性进行具体的搜索操作,例如跳转到搜索结果页面、展示搜索结果列表等。 完成以上步骤后,就可以实现一个基于 Vue.jsElement UI 的纯前端搜索框

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值