vue3+element-plus el-tree 懒加载

本文展示了如何在Vue3项目中结合Element-Plus库,使用el-tree组件实现懒加载功能。通过设置lazy属性和load方法,动态加载树形结构数据。同时,文章还提及了自定义节点模板、节点点击事件处理以及滚动条的CSS样式调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 <!-- 结构树 -->

        <div class="down-tree">

          <el-tree :style="{height:tableHeight+90+ 'px'}" class="f-mt-10 treeStyle" lazy node-  key="positionId" ref="tree" :default-expand-all="false" :current-node-key="defaultExpandedKeys"

            :highlight-current="true" :default-expanded-keys="[1]" :data="dataSource" render-after-expand :load="loadTreeNode" :props="defaultProps" @node-click="handleNodeClick"

            :filter-node-method="filterNode">

            <template #default="{node,  data}">

              <section class="custom-node-tree">

                <el-dropdown>

                  <div class="g-flex-ct f-warp">

                    <p>{{ node.label }} </p>

                    <p>( {{  data.positionCode  }} )</p>

                  </div>

                  <template #dropdown>

                    <el-dropdown-menu v-show="data.positionId!=1">

                      <el-dropdown-item @click="editHandle(3,data)">

                        <el-icon :size=" 15">

                          <Edit />

                        </el-icon>

                        <span>编辑</span>

                      </el-dropdown-item>

                      <el-dropdown-item @click="opretion('delSingle',data)">

                        <el-icon :size="15" color='#F54A45'>

                          <Delete />

                        </el-icon>

                        <span style="color:#F54A45;">删除</span>

                      </el-dropdown-item>

                    </el-dropdown-menu>

                  </template>

                </el-dropdown>

              </section>

            </template>

          </el-tree>

// load函数与 lazy 一起在html出现

// js懒加载方法-loadTreeNode

function loadTreeNode(node, resolve) {

      if (node.level == 0) {

        return resolve(node.data)

      }

      setTimeout(() => {

        resolve(node.data.children)

      }, 1000)

    }

// css添加滚动条-down-tree

// 滚动条

.down-tree {

  overflow: auto;

  &::-webkit-scrollbar {

    /*滚动条整体样式*/

    width: 3px; /*高宽分别对应横竖滚动条的尺寸*/

    height: 3px;

  }

  &::-webkit-scrollbar-thumb {

    /*滚动条里面小方块*/

    background-color: rgb(255, 255, 255);

    border-radius: 3px;

  }

  &::-webkit-scrollbar-track {

    background-color: rgb(255, 255, 255);

    box-shadow: inset 0 0 3px rgb(255, 255, 255);

    border-radius: 5px;

  }

  &::-webkit-scrollbar-button {

    background-color: rgb(255, 255, 255);

    display: none;

  }

  &:hover {

    &::-webkit-scrollbar-thumb {

      /*滚动条里面小方块*/

      background-color: rgba(0, 0, 0, 0.2);

      border-radius: 5px;

    }

    &::-webkit-scrollbar-track {

      background-color: #f5f5f5;

      box-shadow: inset 0 0 3px rgba(253, 249, 249, 0.1);

      border-radius: 5px;

    }

    &::-webkit-scrollbar-button {

      background-color: #eee;

      display: none;

    }

  }

}

<think>我们正在使用Vue3Element-Plus框架,并集成高德地图来实现电子围栏功能。电子围栏通常指在地图上绘制一个封闭区域(多边形),并判断某个点是否在该区域内。我们将使用高德地图的JavaScriptAPI,特别是多边形绘制和编辑功能。步骤概述:1.在项目中引入高德地图JavaScriptAPI。2.Vue组件中创建地图容器。3.初始化地图。4.使用高德地图的插件(如Polygon,PolyEditor)来绘制和编辑多边形(电子围栏)。5.保存围栏的坐标数据,以便后续使用(比如判断点是否在围栏内)。根据引用[2],我们需要先在项目中注册高德地图,可以使用`vue-amap`库,但注意该库是为Vue2设计的,对于Vue3,我们可以使用官方JSAPI或者寻找Vue3的封装(如`@vuemap/vue-amap`)。不过,为了更直接的控制,我们将直接使用高德地图的JavaScript API。因此,我们选择不使用`vue-amap`,而是直接通过`<script>`标签引入高德地图API,或者使用npm包`@amap/amap-jsapi-loader`。这里我们使用`@amap/amap-jsapi-loader`来加载高德地图API。实现步骤:步骤1:安装依赖首先,安装`@amap/amap-jsapi-loader`:```bashnpminstall @amap/amap-jsapi-loader --save```步骤2:在Vue组件中初始化地图在组件的`<template>`中创建地图容器:```html<template><div class="map-container"><div id="map-container"style="width:100%;height:500px;"></div></div></template> ```步骤3:在组件的`<script>`部分初始化地图并添加电子围栏功能我们将使用Composition API。注意:高德地图要求先申请key,并在初始化时使用。步骤4:绘制多边形(电子围栏)并启用编辑功能步骤5:保存绘制的围栏数据具体代码实现:我们将创建一个Vue组件,组件加载时初始化地图,并添加绘制多边形的功能。同时,我们使用ElementPlus的按钮来控制绘制和保存。参考引用[4]中的代码片段,我们可以知道如何构造多边形的路径。另外,引用[3]提到使用`GeneralPath`类来判断点是否在多边形内,但这在JavaScript中不适用。高德地图提供了`AMap.GeometryUtil`类,其中包含`isPointInRing`等方法,可以用来判断点是否在多边形内。不过,我们这里主要实现绘制和编辑功能,判断点是否在围栏内可以在需要时使用高德地图的工具方法。代码示例:注意:由于高德地图JS API的安全要求,我们可能需要设置安全密钥(在2021年12月02日后,需要同时设置key和安全密钥)。具体请参考高德地图官网。以下是组件的示例代码:</think>在 Vue3Element-Plus 框架中集成高德地图实现电子围栏功能,可通过以下步骤实现: ### 实现步骤 1. **初始化高德地图** ```vue <template> <div id="map-container" style="width:100%; height:500px"></div> </template> <script setup> import { onMounted } from &#39;vue&#39;; import AMapLoader from &#39;@amap/amap-jsapi-loader&#39;; let map = null; let polygonEditor = null; let fencePolygon = null; onMounted(async () => { await AMapLoader.load({ key: &#39;您的高德地图Key&#39;, version: &#39;2.0&#39;, plugins: [&#39;AMap.Polygon&#39;, &#39;AMap.PolyEditor&#39;] }); map = new AMap.Map(&#39;map-container&#39;, { zoom: 13, center: [116.397428, 39.90923] // 默认中心点 }); }); </script> ``` 2. **绘制电子围栏** ```javascript const drawFence = () => { // 创建多边形围栏 fencePolygon = new AMap.Polygon({ path: [ [116.368904, 39.913423], [116.382122, 39.901176], [116.387271, 39.922501] ], strokeColor: "#FF33FF", fillColor: "#1791fc", fillOpacity: 0.2 }); map.add(fencePolygon); // 启用编辑功能 polygonEditor = new AMap.PolyEditor(map, fencePolygon); polygonEditor.open(); }; ``` 3. **实现围栏判断功能** ```javascript const checkInFence = (lnglat) => { if (!fencePolygon) return false; return fencePolygon.contains(lnglat); }; // 示例:检查坐标点是否在围栏内 const point = [116.378028, 39.907192]; console.log(checkInFence(point)); // 返回 true/false ``` 4. **集成 Element-Plus UI 控件** ```vue <template> <el-button @click="drawFence">绘制围栏</el-button> <el-button @click="saveFence">保存围栏</el-button> <div id="map-container" ...></div> </template> ``` 5. **保存围栏数据** ```javascript const saveFence = () => { if (!fencePolygon) return; const path = fencePolygon.getPath(); console.log(&#39;围栏坐标:&#39;, path); // 发送到后端保存 }; ``` ### 关键配置说明 1. **高德 Key 申请** - 前往[高德开放平台](https://lbs.amap.com/)申请 JavaScript API Key - 安全密钥配置(2021年后必需): ```javascript window._AMapSecurityConfig = { securityJsCode: &#39;您的安全密钥&#39; }; ``` 2. **插件依赖** - 必需插件:`AMap.Polygon`(多边形)、`AMap.PolyEditor`(多边形编辑器) - 推荐插件:`AMap.MouseTool`(绘图工具) ### 注意事项 1. 使用 `@amap/amap-jsapi-loader` 替代旧版 `vue-amap`(Vue2专用) 2. 围栏路径需闭合:首尾坐标点相同 3. 编辑状态管理:通过 `polygonEditor.open()`/`.close()` 控制编辑模式 4. 性能优化:复杂围栏建议使用 `WebWorker` 进行计算[^3] ### 效果增强建议 - 添加围栏顶点拖拽提示(Element Plus 的 `el-tooltip`) - 实现围栏层级管理(使用 `el-tree` 展示多围栏结构) - 添加围栏区域面积计算 - 集成地理围栏报警功能(监听 `map.on(&#39;moveend&#39;)` 事件) > 电子围栏的核心是判断点与多边形的位置关系,高德地图的 `Polygon.contains()` 方法使用射线法算法实现此功能[^3]。对于复杂场景,建议后端使用 JTS 库进行精确地理计算。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值