Cesium+Vue3学习系列(3)--- UI框架搭建

 本学习系列将以Cesium + Vue3 + Vite +Typescript+elementplus作为主要技术栈展开,后续会循序渐进,持续探索Cesium的高级功能,相关源码全部免费公开。 请关注微信公众号 “webgis学习”或扫描下方二维码,关注后,在公众号里输入“Cesium学习系列源码”,即可看到全部代码。

本篇介绍如何当前系统UI框架搭建过程。

1、前端框架采用ElementPlus,因此需要提前安装好 ElementPlus。安装过程及配置请自行百度;

2、UI界面结构。分为搜索功能区、菜单区、菜单对应的功能区以及鼠标位置显示区。详情见下图。

3、具体实现

3.1 菜单区域,定义菜单数据结构,componentCode为每个菜单叶子节点对应的功能组件编码。

/**菜单树 */
export interface IMenuTree {
  id: string | number
  label: string
  children?: IMenuTree[]
  componentCode?: MenuEnum
}

设置具体显示的菜单数据

import { IMenuTree } from "../Common/interfaces"
import { MenuEnum } from "../Common/enums"
const menuTreeData: IMenuTree[] = [
    {
        id: 1,
        label: '图层管理',
        children: [
            {
                id: '1-1',
                label: '底图',
                componentCode: MenuEnum.EarthDataLayers,
                children: []              
            },
            {
                id: '1-2',
                label: '自定义数据',
                componentCode: MenuEnum.CustomDataLayer,
                children: []              
            },
            
        ],         
    },
    {
        id: 1,
        label: '特效',
        children: [
            {
                id: '1-1',
                label: '特效1',
                componentCode: MenuEnum.EarthDataLayers,
                children: []              
            },
            
        ],
    }    
]
export default menuTreeData

菜单前端页面代码

<template>
  <el-input v-model="filterText" style="width: 240px" placeholder="请输入功能名称" />
  <el-tree ref="treeRef" style="max-width: 600px" class="filter-tree" default-expand-all :data="menuTreeData"
    :filter-node-method="filterNode" @node-click="HandNodeClick">
  </el-tree>
</template>
<script lang="ts" setup>
import menuTreeData from '@/system/Config/MenuTreeConfig'
import { ElTree } from 'element-plus'
const emits = defineEmits(['targetComponentCode'])
const filterText = ref('')
const treeRef = ref<InstanceType<typeof ElTree>>()
watch(filterText, (val) => {
  treeRef.value!.filter(val)
})
const filterNode = (value: string, data: any) => {
  if (!value) return true
  return data.label.includes(value)
}
const HandNodeClick = (_clickNode: any, node: any) => {
  //只显示叶子节点的功能
  if (node.isLeaf) {
    emits("targetComponentCode", node.data.componentCode)
  }
}
</script>
<style lang="scss" scoped>
.el-tree {
  background: #333541ab;
  color: #e9edf5;
  padding: 10px;
  border-bottom-left-radius: 5px;
  border-bottom-right-radius: 5px;
  --el-tree-node-hover-bg-color: #868c96;
  :deep(.el-text){
    color:white;
  }
 
}
.el-input {
  --el-input-bg-color: #594545;
  color: white;
}
</style>

3.2 当用户点击菜单树的叶子节点是触发targetComponentCode,将对应的功能组件传给父级组件,父级组件响应HandleClickMenuNode函数将对应组件填入即可。

 <MenuTree @targetComponentCode="HandleClickMenuNode"></MenuTree>
<component :is="currentComponent"></component>
 let currentComponent = ref<Component | null>(null);
 const HandleClickMenuNode = (componentCode: number) => {
    currentComponent.value = menuComponentMap[componentCode as MenuEnum];
}

3.3 搜索功能区通过Elementplus提供的方法实现。


watch(filterText, (val) => {
  treeRef.value!.filter(val)
})

3.4 鼠标位置显示区

鼠标位置显示区是纯前端css方式实现,实时获取鼠标的经纬度及高度信息的实现方式后续会单独介绍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值