一种基于Leaflet.Legend的图例动态更新方法
目录
前言
一、场景再现
1、需求描述
2、核心方法介绍
3、存在的问题
二、问题解决
1、重复解决办法
2、图例不展示解决办法
3、成果展示
三、总结
前言
在当今数字化时代,地理信息系统(GIS)技术已经广泛应用于各个领域,从城市规划到环境监测,从交通管理到资源勘探等。而地图可视化作为 GIS 的重要组成部分,为用户提供了直观、便捷的方式来展示和分析地理空间数据。Leaflet 作为一种轻量级、开源的地图库,因其简单易用、高度可定制化以及良好的兼容性,受到了众多开发者的青睐,被广泛应用于各种地图应用的开发中。而在地图可视化中,图例的作用不可忽视。它为用户提供了地图上各种符号、颜色和图层所代表的含义,帮助用户更好地理解和解读地图信息。
关于如何在Leaflet中进行图例生成,原博文介绍:LeafLet加载自定义Legend的设计与实现。在后面的项目当中基本都是一次性生成图例,然后在地图上展示。然而,在最近的实际开发过程中,遇到了一个棘手的问题:Leaflet 的图例无法动态更新。当地图上的数据发生变化,例如添加或移除图层、修改图层样式、更新数据源等时,图例却无法及时反映这些变化,这给用户带来了极大的不便,也影响了地图应用的用户体验和实用性。因此需要程序能根据变化或者事件响应动态更新。在实际实践中我们发现,leaflet.legend的图例动态更新存在一定的局限性。它通常是基于初始加载时的图层和样式信息来生成图例的,而当这些信息发生变化时,图例并不会自动重新生成或更新。这使得开发者在面对动态数据和交互式地图时,难以实现图例与地图的同步更新。
本篇文章将深入探讨解决 Leaflet.Legend 图例无法动态更新的一种方法。我们将从问题出发,分析现有解决方案的不足之处,然后详细介绍一种基于事件监听和动态渲染机制的方法。通过这种方法,我们可以在地图数据发生变化时,自动检测并动态更新图例,确保图例始终与地图上的数据保持一致。我们将通过实际代码示例和测试结果,展示该方法的有效性和可行性,并探讨其在不同应用场景中的适用性和优化方向。
通过本文的介绍,希望能够为广大的 Leaflet 开发者提供一种全新的思路和实用的解决方案,帮助他们在地图开发过程中更好地应对图例动态更新的挑战,提升地图应用的质量和用户体验。同时,也期待与更多开发者交流和分享经验,共同推动 Leaflet 技术的发展和创新。
一、场景再现
本节将从需求场景、核心方法介绍、存在的问题三个方面对开发过程遇到的问题进行讲解。通过本节的阐述,可以让朋友们对leaflet.legend的核心方法有更详细的认识,通过结合核心API方法和存在的问题,为下一步问题的解决奠定方向和基础。
1、需求描述
在以往的一些WebGIS应用展示中,比如展示地震的震级、风景区的等级等,这些图例信息往往都是固定的,我们可以将地震震级分成不同的震级,比如3级以下,3-5级,5-7级,7级以上等。又比如在风景区的等级中中的5A、4A、3A、2A、1A等,如下图。
这些图例在地图进行展示时基本上已经是固定的,后续需要动态变化的只是调整数据的输出,而图例基本上是不会改变的。暂且我们将这些图例成为静态图例。与这种需求不一样的是,如果在应用中,我们需要动态切换数据图层,比如从行政区划图层切换到土地利用图层,图例不仅内容也要发生变化,即维度的变化。同时在渲染的样式、具体的图例文字方面都要进行变化,内容上从行政区划名称切换成不同的土地利用类型。还有一些场景是跟随时间维度变化的,随着时间的推移,图例会新增或者移除部分老的图例。比如在在风景区分级中,需要将2A和3A级景区进行合并。从而减少图例的展示个数。这样的场景非常多,不管是基于事件驱动还是时间驱动,都会对关联的图例的有所影响。以上就是本文遇到的几个需求场景,这里只描述了其中的一两种,现实当中肯定有更多的场景,就不注意列举了。
2、核心方法介绍
与后端的OOP编程思想相类似,前端也是采用类似OOP的思想进行开发。因此对相关的对象的属性和方法进行封装。关于leaflet.legend的属性,这里不再进行赘述,但是对核心的API方法还是需要进行详细叙述。因为在进行图例内容的动态生成中,肯定需要调用leaflet.legend提供的方法来实现图例的动态生成的。这里将详细介绍其相关的方法。
除了对象的Options配置参数外,以上就是比较重要的几个API方法。 下面将对图例对象的初始化、图例容器构建、图例绘制、事件响应、重绘等几个方法进行介绍。帮助大家对组件有更深入的理解。我们来看一下在原来的代码中是如何将图例添加到地图中的,原始方法代码如下:
function updateLegend(legendData){var legend = L.control.Legend({position: "bottomright",collapsed: false,symbolWidth: 24,opacity: 1,title:"图例",column: 2,legends: legendData});legend.addTo(map);
}
在Javascript中进行代码断点来看一下将legend对象添加到地图后,会发生什么? 首先将调用的是initialize()方法,可以在参数入口处看到传入的参数。
在将图例符号进行清空后,将进行图例容器对象的创建,调用的_buildContainer()方法,以此来绑定和展示图例信息。
请注意,在这里创建用于图例展示的div容器(这个方法很重要,请注意这个方法,在这个方法里,会创建容器,在后面的问题解决过程中会涉及重复对象的创建,因此在调整时需要规避这个问题), 在这个方法中,通过循环配置参数中的不同图例信息,循环构建图例信息。构建图例元素的方法是:_buildLegendItems();
通过以上对核心方法的介绍,相信大家对于组件的相关API有了进一步的认识。在后面的问题解决阶段还会对这些方法有所涉及。
3、存在的问题
在最开始开发的时候,往往由于没有深入的研究相关的API,极容易出现一些错误。比如图例越来越多,在地图上的位置都展示不了了。又或者是事件触发后,相应的图例并没有生成,没有任何效果,当前图例没有生成,或者是产生了报错。下面我们对这几种情况分别进行说明,如最开始的代码所示,第一种情况就是图例越来越多。
function updateLegend(legendData){var legend = L.control.Legend({position: "bottomright",collapsed: false,symbolWidth: 24,opacity: 1,title:"图例",column: 2,legends: legendData});legend.addTo(map);
}
程序运行后,可以在图例的展示栏中看到图例越来越多,虽然新的产生了,但老的没有替换到。如下图所示:
第二种情况是开发的同学稍微了解组件的方法,在获得legend对象后,重新对图例数据进行赋值,然后调用重绘的方法,代码如下:
function updateLegend(legendData){if(undefined == legend){legend = L.control.Legend({position: "bottomright",collapsed: false,symbolWidth: 24,opacity: 1,title:"图例",column: 2,legends: legendData});}else{//step1、重新设置数据legend.options.legends = legendData;//step2、重新绘制legend.redraw();}legend.addTo(map);
}
咋一看起来,似乎是非常好的解决办法,但是实际运行后却是以下的情况:
不仅没有出现新的图例,老的图例都消失了。 在查看浏览器的控制台时,可以发现以下的报错:
更详细的是以下的代码行中出现问题,在这个重绘的方法中,其调用的是构建单个图例的重绘。在方法调用时需要传入容器对象和当前的图例对象。在redraw方法中,传入了空的值。类似于报了空指针异常。
以上就是在开发当中极易碰到的问题,这里先讲讲遇到的两个问题场景,如果您开发当中也遇到这种问题,不妨来这里看看。
二、问题解决
本节将重点围绕第一节中的遇到的问题,重点对发现或者产生的问题进行解决。主要是围绕图例的重复生成、图例的正确重绘方法进行介绍,在介绍的过程中又会回顾到前面的API核心接口讲解。因此这是一个动手的过程,希望你可以跟着一起来动手实践,纸上得来终觉浅,绝知此事要躬行。只有经过自己的亲自动手,才能彻底得掌握如何应对和解决。
为了模拟图例的动态生成,在Leaflet页面上,新增了一个“图例更新”的按钮,用这个按钮的模拟事件来进行模拟需要动态切换的场景。模拟的按钮及其相关处理事件如下:
<div class="center-flex"><input type="button" class="opt_button" value="更新图例" onclick="updateLegendEvent()"></input>
</div>
其处理的回调方法如下,请注意在程序中设置一个标志位,用于切换不同的图例数据对象,在真实情况中,可以通过ajax来请求服务的接口后获得:
function updateLegendEvent(){var updateLegendData;if(sign == 0 ){updateLegendData = [{label: "位置",type: "image",url: "marker/marker-red.png"}, {label: "Marker2",type: "image",url: "marker/purple.png"}];sign = 1;} else {updateLegendData = initLegendData;sign = 0;}updateLegend(updateLegendData);
}
在有了事件的驱动之后,接下来就是图例对象的定义和展示。下面将深入如何避免在上一节中遇到的问题,针对性的提出解决办法。
1、重复解决办法
为了解决在图例生成时的重复问题,我们可以在进行图例对象生成时只生成一份,后续则在之前的对象中调用方法来修改相应的参数,以此来达到相应的目的。这个代码比较简单,在前面的方法中提到过,在初始化时增加一个判断,如果为空就创建对象,否则使用原来的对象:
function updateLegend(legendData){if(undefined == legend){legend = L.control.Legend({position: "bottomright",collapsed: false,symbolWidth: 24,opacity: 1,title:"图例",column: 2,legends: legendData});}else{//step1、重新设置数据legend.options.legends = legendData;//step2、重新绘制legend.redraw();}legend.addTo(map);
}
通过以上的代码就能避免图例对象重复创建的问题。
2、图例不展示解决办法
在解决图例的重复问题之后,又迎来一个新的难题,即图例在切换后不展示了。这又是什么问题呢?其实答案在第一节中的第三小节中已经有说明。在上面的代码中,我们调用的是redraw的方法,而这个方法最终调用的是_buildLegendItems: function (legendContainer, legend) {}方法,在这个方法中,需要传入一个图例容器和一个图例对象,而在redraw方法中并没有涉及这两个对象。因此才报的错。那么如何避免这种问题呢?解铃还须系铃人,要想解决图例不展示的问题,还得找到核心的问题,在前面的核心方法中,我们知道一套完备的可视化展示流程。即initialize方法调用_buildContainer方法,同时在_buildContainer方法中又会循环调用_buildLegendItems。通过这种方法,就会传入容器和图例对象,按照这种调用思路,在设置新的数据后,程序需要做的就是重新初始化,这样就会清空当前的图例对象,同时生成最新的图例。代码如下:
function updateLegend(legendData){if(undefined == legend){legend = L.control.Legend({position: "bottomright",collapsed: false,symbolWidth: 24,opacity: 1,title:"图例",column: 2,legends: legendData});}else{//动态加载图例的实现方式//step1、重新设置数据legend.options.legends = legendData;//step2、重新初始化(重新绘制)legend.initialize();}legend.addTo(map);
}
将代码进行改造后,图例可以正常展示了,但是重复的问题又产生了。如下图:
难道这种问题没有解决办法了么?仔细再想想,在初始化的方法中,依然还会创建容器对象出来,来看看它的源代码:
可以看到这个图例容器依然会重新创建,因此还是会产生重复。最终的答案是在每次初始化前将容器移除掉。代码很简单,如下:
function updateLegend(legendData){if(undefined == legend){legend = L.control.Legend({position: "bottomright",collapsed: false,symbolWidth: 24,opacity: 1,title:"图例",column: 2,legends: legendData});}else{//动态加载图例的实现方式//step1、重新设置数据legend.options.legends = legendData;//step2、销毁图例容器,保证不重复legend.getContainer().remove();//step3、重新初始化(重新绘制)legend.initialize();}legend.addTo(map);
}
3、成果展示
经过上述的改造,就能完美的解决图例重复已经切换后不展示的问题,下面来看一下最终的成果,点击“图例更新”按钮后,图例可以进行不停的切换,基本实现我们的需求,图例不会重复生成,也不会不见,控制台也不会报错,最终效果如下图所示:
三、总结
以上就是本文的主要内容,本篇文章将深入探讨解决 Leaflet.Legend 图例无法动态更新的一种方法。我们将从问题出发,分析现有解决方案的不足之处,然后详细介绍一种基于事件监听和动态渲染机制的方法。通过这种方法,我们可以在地图数据发生变化时,自动检测并动态更新图例,确保图例始终与地图上的数据保持一致。我们将通过实际代码示例和测试结果,展示该方法的有效性和可行性,并探讨其在不同应用场景中的适用性和优化方向。
通过本文的介绍,希望能够为广大的 Leaflet 开发者提供一种全新的思路和实用的解决方案,帮助他们在地图开发过程中更好地应对图例动态更新的挑战,提升地图应用的质量和用户体验。同时,也期待与更多开发者交流和分享经验,共同推动 Leaflet 技术的发展和创新。行文仓促,定有许多不足之处,如有不足在此恳请各位专家朋友批评指正,不胜感激。
相关文章:
一种基于Leaflet.Legend的图例动态更新方法
目录 前言 一、场景再现 1、需求描述 2、核心方法介绍 3、存在的问题 二、问题解决 1、重复解决办法 2、图例不展示解决办法 3、成果展示 三、总结 前言 在当今数字化时代,地理信息系统(GIS)技术已经广泛应用于各个领域,…...
Vue Dom截图插件,截图转Base64 html2canvas
安装插件 npm install html2canvas --save插件使用 <template><div style"padding: 10px;"><div ref"imageTofile" class"box">发生什么事了</div><button click"toImage" style"margin: 10px;&quo…...
安宝特方案 | AR眼镜:远程医疗的“时空折叠者”,如何为生命争夺每一分钟?
行业痛点:当“千里求医”遇上“资源鸿沟” 20世纪50年代,远程会诊的诞生曾让医疗界为之一振——患者不必跨越山河,专家无需舟车劳顿,一根电话线、一张传真纸便能架起问诊的桥梁。然而,传统远程医疗的局限也日益凸显&a…...
【人工智能】Python中的序列到序列(Seq2Seq)模型:实现机器翻译
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 序列到序列(Seq2Seq)模型是自然语言处理(NLP)中一项核心技术,广泛应用于机器翻译、语音识别、文本摘要等任务。本文深入探讨Seq2Seq模…...
【批量获取图片信息】批量获取图片尺寸、海拔、分辨率、GPS经纬度、面积、位深度、等图片属性里的详细信息,提取出来后导出表格,基于WPF的详细解决方案
摄影工作室通常会有大量的图片素材,在进行图片整理和分类时,需要知道每张图片的尺寸、分辨率、GPS 经纬度(如果拍摄时记录了)等信息,以便更好地管理图片资源,比如根据图片尺寸和分辨率决定哪些图片适合用于…...
关于32位和64位程序的传参方法及虚拟机调试工具总结
一、传参方法对比 1. 32位程序 系统调用 (Linux) 使用int 0x80指令触发系统调用 寄存器传参顺序: eax 系统调用号 ebx 第1个参数 ecx 第2个参数 edx 第3个参数 esi 第4个参数 edi 第5个参数 普通函数调用 (C语言) 栈传递参数:参数从右向左压栈…...
【Windows】PowerShell 缓存区大小调节
PowerShell 缓存区大小调节 方式1 打开powershell 窗口属性调节方式2,修改 PowerShell 配置文件 方式1 打开powershell 窗口属性调节 打开 CMD(按 Win R,输入 cmd)。右键标题栏 → 选择 属性(Properties)…...
查看云机器的一些常用配置
云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes常…...
约克VRF|冬日舒适新标杆,温暖每一寸空间
冬天来了,谁不想窝在家里,一边温暖舒适,一边畅享清新空气? 约克VRF中央空调——用科技为你打造全方位的冬季理想生活! 地暖空调二合一,暖从足起,养生更健康~ 普通取…...
【AI学习】关于 DeepSeek-R1的几个流程图
遇见关于DeepSeek-R1的几个流程图,清晰易懂形象直观,记录于此。 流程图一 来自文章《Understanding Reasoning LLMs》, 文章链接:https://magazine.sebastianraschka.com/p/understanding-reasoning-llms?continueFlagaf07b1a0…...
CNN卷积神经网络多变量多步预测,光伏功率预测(Matlab完整源码和数据)
代码地址:CNN卷积神经网络多变量多步预测,光伏功率预测(Matlab完整源码和数据) 标题:CNN卷积神经网络多变量多步预测,光伏功率预测 一、引言 1.1 研究背景及意义 随着全球能源危机的加剧和环保意识的提升ÿ…...
mapbox进阶,添加绘图扩展插件,绘制圆形
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️MapboxDraw 绘图控件二、🍀添加绘图扩…...
学习TCL脚本基础语法的几个步骤?
文章目录 前言1. 命令和参数1.1 Tcl 命令的基本结构1.2 示例1.2.1 puts 命令1.2.2 set 命令1.2.3 if 命令1.2.4 foreach 命令 1.3 参数的类型1.3.1 字符串1.3.2 变量1.3.3 表达式1.3.4 列表1.3.5 字典 1.4 命令的嵌套 二、变量1. 声明变量2. 使用变量3. 变量类型3.1 字符串3.2 …...
move_base全局路径规划震荡之参数调优
在使用 move_base 进行导航时,如果全局路径规划在遇到障碍物时频繁在障碍物左右两侧跳变,导致机器人绕障失败,通常可以通过调整参数优化来解决。以下是具体原因分析和解决方案: 问题原因分析: 全局路径规划的震荡&…...
Could not create task ‘:mainActivity:minifyReleaseWithR8‘.
最近接收了一个老项目,把项目clone下来后,总是报错,无法运行 Build-tool 33.0.1 is missing DX at D:\Android\Sdk\build-tools\33.0.1\dx.batFAILURE: Build failed with an exception.* What went wrong: Could not determine the depende…...
保姆级教程Docker部署Zookeeper官方镜像
目录 1、安装Docker及可视化工具 2、创建挂载目录 3、运行Zookeeper容器 4、Compose运行Zookeeper容器 5、查看Zookeeper运行状态 6、验证Zookeeper是否正常运行 1、安装Docker及可视化工具 Docker及可视化工具的安装可参考:Ubuntu上安装 Docker及可视化管理…...
人工智能-A* 算法与机器学习算法结合
以下将为你展示如何将 A* 算法与机器学习算法(这里以简单的神经网络为例)结合实现路径规划。我们会先使用 A* 算法生成一些路径规划数据,然后用这些数据训练一个简单的神经网络,让神经网络学习如何预测路径。最后,将训…...
如何在Python中使用Requests库?
在Python中,网络请求处理是很多应用开发中的常见需求。Requests库作为Python中最常用的第三方库之一,它能够简化HTTP请求的发送和响应的处理。无论是获取网页内容、与API接口交互,还是提交表单数据,Requests都可以帮助开发者轻松实…...
通过命令行运行py文件与通过ide运行py文件,对文件中模块的引用方式的影响
通过命令行运行 Python 文件和通过 IDE 运行 Python 文件时,模块的引用方式 会受到一些影响,主要体现在 工作目录 和 模块导入路径(sys.path)的设置上。下面详细介绍这两种方式的区别和它们如何影响模块引用。 1. 通过命令行运行…...
如何避免大语言模型中涉及丢番图方程的问题
希尔伯特第十问题是一个著名的数学问题,涉及不定方程(又称为丢番图方程)的可解答性。然而在大模型中,我们希望问题都是确定的可解的,或者说要尽可能的想办法避免不确定的不可解问题。由于丢番图方程问题是不可判定问题(即不存在一个有效的算法能够解决该类问题的所有实例…...
重新刷题求职2-DAY7
1.454. 四数相加 II 给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1: 输入&#…...
Day 32 卡玛笔记
这是基于代码随想录的每日打卡 455. 分发饼干 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸ÿ…...
android studio无痛入门
在Android Studio中创建和管理项目主要涉及以下几个步骤: 1. 创建新项目 打开Android Studio,点击“Start a new Android Studio project”或者“File” > “New” > “New Project”。 选择一个模板,例如“Empty Activity”࿰…...
flutter安卓打包签名
flutter安卓打包签名 1.创建签名文件 keytool -genkeypair -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-key-aliaskeytool 是一个用于管理密钥和证书的命令行工具,通常与 Java 开发工具包 (JDK) 一起使用。my-release-…...
Windows编程:下载与安装 Visual Studio 2019
本节前言 在写作本节的时候,本来呢,我正在写的专栏,是 MFC 专栏。而 VS2010 和 VS2019,正是 MFC 学习与开发中,可以使用的两款软件。然而呢,如果你去学习 Windows API 知识的话,那么࿰…...
ElementUI的<el-image>组件引用网络图片加载失败
1. 验证图片 URL 是否有效 直接访问图片链接,确保 URL 正确且可公开访问 如果浏览器无法加载图片,可能是图片服务器限制了外链或已失效。 解决方法:更换为可用的图片 URL。 2. 检查浏览器开发者工具 打开浏览器开发者工具(F12…...
GitHub Pages + Jekyll 博客搭建指南(静态网站)
目录 🚀 静态网站及其生成工具指南🌍 什么是静态网站?📌 静态网站的优势⚖️ 静态网站 VS 动态网站 🚀 常见的静态网站生成器对比🛠️ 使用 GitHub Pages Jekyll 搭建个人博客📌 1. 创建 GitHu…...
idea项目列表不出现,展示loading
2025年02月08 11:23:36 星期六 发生在webstorm中,跟其他idea类似 原因是将 ignore 插件升级到 4.5.5 版本 https://github.com/JetBrains/idea-gitignore/pull/933 解决方案:将ignore版本将为 4.5.4 我是将 4.5.5 降低为 4.5.4 正常显示文件夹了。...
多智能体协作架构模式:驱动传统公司向AI智能公司转型
前言 在数字化浪潮的席卷下,传统公司的运营模式正面临着前所未有的挑战。随着市场竞争的日益激烈,客户需求的快速变化以及业务复杂度的不断攀升,传统公司在缺乏 AI 技术支撑的情况下,暴露出诸多痛点。在决策层面,由于…...
新增md、html压缩文档上传,开放接口访问密钥改为多个,zyplayer-doc 2.4.7 发布啦!
zyplayer-doc是一款适合企业和个人使用的WIKI知识库管理工具,支持在线编辑富文本、Markdown、表格、Office文档、API接口、思维导图、Drawio以及任意的文本文件,专为私有化部署而设计,最大程度上保证企业或个人的数据安全,支持以内…...
w~Transformer~合集5
我自己的原文哦~ https://blog.51cto.com/whaosoft/12406495 #transformer~x1 太可怕了都到6了 太强~~ DeepMind 表示,他们提出的算法蒸馏(AD)是首个通过对具有模仿损失的离线数据进行顺序建模以展示上下文强化学习的方法。同时基于观察…...
Dubbo 3.x源码(29)—Dubbo Consumer服务调用源码(1)服务调用入口
基于Dubbo 3.1,详细介绍了Dubbo Consumer服务调用源码。 此前我们学习了Dubbo服务的导出和引入的源码,现在我们来学习Dubbo服务调用的源码。 此前的文章中我们讲过了最上层代理的调用逻辑(服务引用bean的获取以及懒加载原理):业务引入的接口…...
Linux内核同步机制:确保系统稳定与高效
在复杂而庞大的 Linux 系统世界中,内核就如同一位有条不紊的指挥官,协调着各种任务和资源的分配。而其中,内核同步机制则是确保整个系统稳定与高效运行的关键要素。想象一下,众多的进程和线程在 Linux 内核的舞台上同时登场&#…...
firebase简介
Firebase 是一个由 Google 提供的移动应用开发平台,旨在帮助开发者快速构建和管理应用程序。它提供了一系列强大的工具和服务,特别适合用于开发和管理 Web 和移动应用。以下是 Firebase 的一些核心功能: 实时数据库:Firebase 提供…...
利用Termux在安卓手机中安装 PostgreSQL
利用Termux在安卓手机中安装 PostgreSQL ⬇️Termux下载 点击下载 在 Termux 中安装 PostgreSQL 可以按照以下步骤进行: 1. 更新 Termux 包管理器 先更新软件包列表和已安装的软件包: pkg update && pkg upgrade -y2. 安装 PostgreSQL 使…...
windows安装WSL完整指南
本文首先介绍WSL,然后一步一步安装WSL及Ubuntu系统,最后讲解如何在两个系统之间访问和共享文件信息。通过学习该完整指南,能帮助你快速安装WSL,解决安装和使用过程中的常见问题。 理解WSL(Windows Subsystem for Linux…...
Windows Docker笔记-安装docker
安装环境 操作系统:Windows 11 家庭中文版 docker版本:Docker Desktop version: 4.36.0 (175267) 注意: Docker Desktop 支持以下Windows操作系统: 支持的版本:Windows 10(家庭版、专业版、企业版、教育…...
ReactNative进阶(五十九):存量 react-native 项目适配 HarmonyOS NEXT
文章目录 一、前言二、ohos_react_native2.1 Fabric2.2 TurboModule2.2.1 ArkTSTurboModule2.2.2 cxxTurboModule: 三、拓展阅读 一、前言 2024年10月22日19:00,华为在深圳举办“原生鸿蒙之夜暨华为全场景新品发布会”,主题为“星河璀璨&…...
[x86 ubuntu22.04]进入S4失败
目录 1 问题描述 2 解决过程 2.1 查看内核日志 2.2 新建一个交换分区 2.3 指定交换分区的位置 1 问题描述 CPU:G6900E OS:ubuntu22.04 Kernel:6.8.0-49-generic 使用“echo disk > /sys/power/state”命令进入 S4,但是无法…...
Java面试题-MySQL数据库
文章目录 1.事务1.事务的特性 ACID2.并发事务问题3.undo log 和redo log的区别?4.事务的隔离性是如何保证的呢?解释一下MVCC? 2.索引1.如何定位慢查询?2.explain3.了解过索引吗?索引的底层数据结构B树和B树对比4.什么是…...
为什么Vue的data属性是函数而不是对象
Vue中data属性设计为函数而非对象的原因是解决组件复用时的数据隔离问题。确保每个实例维护独立的数据副本,避免数据共享导致的状态污染。 而根实例因为只会被创建一次(不会被复用),所以可以直接用对象,不会有这个问题。 组件一般都会被多个实…...
网络工程师 (26)TCP/IP体系结构
一、层次 四层: 网络接口层:TCP/IP协议的最底层,负责网络层与硬件设备间的联系。该层协议非常多,包括逻辑链路和媒体访问控制,负责与物理传输的连接媒介打交道,主要功能是接收数据报,并把接收到…...
MySQL部署基于二进制日志文件位置的主从复制集群
MySQL主从复制介绍 MySQL 主从复制(Master-Slave Replication) 作为一种经典的数据库复制方案,被广泛应用于企业生产环境,尤其是在提升数据库性能、实现数据备份和分布式扩展方面具有重要作用。 官方文档:https://de…...
【系统设计】Spring、SpringMVC 与 Spring Boot 技术选型指南:人群、场景与实战建议
在 Java 开发领域,Spring 生态的技术选型直接影响项目的开发效率、维护成本和长期扩展性。然而,面对 Spring、SpringMVC 和 Spring Boot 这三个紧密关联的框架,开发者常常陷入纠结:该从何入手?如何根据团队能力和业务需…...
【CAPL实战】LIN调度表操作
文章目录 前言1、linChangeSchedTable切换调度表2、linStartScheduler开启调度表3、linStopScheduler停止调度表 前言 在LIN调度表Schedule Table文章中,详细介绍了LIN调度表的信息,那么如何在CAPL脚本测试中进行LIN调度表的操作呢? 1、linC…...
「vue3-element-admin」告别 vite-plugin-svg-icons!用 @unocss/preset-icons 加载本地 SVG 图标
🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template 🌺 仓库主页: GitCode︱ Gitee ︱ Github 💖 欢迎点赞 👍 收藏 ⭐评论 …...
[图文]课程讲解片段-Fowler分析模式的剖析和实现01
解说: GJJ-004-1,分析模式高阶Fowler分析模式的剖析和实现,这个课是针对Martin Fowler的《分析模式》那本书里面的模式来讲解,对里面的模式来剖析,然后用代码来实现。 做到这一步的,我们这个是世界上独…...
element-plus el-tree-select 修改 value 字段
element-plus el-tree-select 修改 value 字段 ,不显示label 需要注意两个地方: <el-tree-select v-model"value" :data"data" multiple :render-after-expand"false" show-checkbox style"width: 240px" …...
软件测评实验室CNAS认证能力验证什么时机做?如何查询能力验证相关信息?
能力验证是软件测评实验室申请CNAS认证前必须要做的一类质量活动。CNAS软件测评实验室初次认可和扩大认可范围时,申请认可的每个子领域应至少参加过一次相关领域的能力验证且获得满意结果。通过认定认可后,只要存在可获得的能力验证,不同类目…...
Spring Boot 3.4 中 MockMvcTester 的新特性解析
引言 在 Spring Boot 3.4 版本中,引入了一个全新的 MockMvcTester 类,使 MockMvc 测试可以直接支持 AssertJ 断言。本文将深入探讨这一新特性,分析它如何优化 MockMvc 测试并提升测试的可读性。 Spring MVC 示例 为了演示 MockMvcTester 的…...