Vue 中的nextTick函数的原理、作用及使用场景。
大白话Vue 中的nextTick函数的原理、作用及使用场景
在 Vue 里,nextTick
函数是个超实用的工具,它能让你在 DOM 更新完成之后再执行代码。为了能更好地理解 nextTick
函数的原理,咱们就来深入剖析一下。
核心思路
Vue 里的数据更新是异步执行的。当你修改了数据之后,Vue 并不会马上就更新 DOM,而是把这些更新操作先放进一个队列里,等这一轮事件循环结束之后,再统一去更新 DOM。nextTick
函数就是用来在 DOM 更新完成之后再执行你想要的代码。
代码实现与原理
以下是使用 JavaScript 实现的简化版 nextTick 函数:
// 用于存储回调函数的数组
let callbacks = [];
// 标记是否有任务正在等待执行
let pending = false;// 执行回调函数的函数
function flushCallbacks() {// 标记为没有任务正在等待执行pending = false;// 复制一份当前的回调函数数组const copies = callbacks.slice(0);// 清空回调函数数组callbacks.length = 0;// 遍历复制的回调函数数组并依次执行for (let i = 0; i < copies.length; i++) {copies[i]();}
}// 定义一个变量用于存储异步执行函数
let timerFunc;// 检查是否支持 Promise
if (typeof Promise !== 'undefined') {// 如果支持 Promise,使用 Promise 来异步执行回调const p = Promise.resolve();timerFunc = () => {p.then(flushCallbacks);};
} else if (typeof MutationObserver !== 'undefined') {// 如果不支持 Promise,但支持 MutationObserverlet counter = 1;// 创建一个 MutationObserver 实例,当观察到变化时执行 flushCallbacksconst observer = new MutationObserver(flushCallbacks);// 创建一个文本节点const textNode = document.createTextNode(String(counter));// 开始观察文本节点的字符数据变化observer.observe(textNode, {characterData: true});timerFunc = () => {counter = (counter + 1) % 2;// 修改文本节点的数据,触发 MutationObservertextNode.data = String(counter);};
} else if (typeof setImmediate !== 'undefined') {// 如果不支持 Promise 和 MutationObserver,但支持 setImmediatetimerFunc = () => {// 使用 setImmediate 异步执行 flushCallbackssetImmediate(flushCallbacks);};
} else {// 如果以上都不支持,使用 setTimeouttimerFunc = () => {// 使用 setTimeout 异步执行 flushCallbacks,延迟时间为 0setTimeout(flushCallbacks, 0);};
}// 实现 nextTick 函数
function nextTick(cb) {// 将回调函数添加到回调数组中callbacks.push(cb);// 如果当前没有任务正在等待执行if (!pending) {// 标记为有任务正在等待执行pending = true;// 调用异步执行函数timerFunc();}
}// 模拟 Vue 实例
class Vue {constructor(options) {this.data = options.data();this.methods = options.methods;// 将 methods 中的方法绑定到当前实例Object.keys(this.methods).forEach(method => {this.methods[method] = this.methods[method].bind(this);});}
}// 创建一个 Vue 实例
const vm = new Vue({data() {return {message: 'Hello'};},methods: {updateMessage() {// 修改数据this.data.message = 'World';// 在 DOM 更新完成后执行回调函数nextTick(() => {console.log('DOM 已经更新');});}}
});// 调用更新消息的方法
vm.methods.updateMessage();
原理说明
- 异步更新队列:当你修改了 Vue 实例的数据时,Vue 会把 DOM 更新操作放进一个队列里,而不是马上更新 DOM。
nextTick
函数:当你调用nextTick
函数时,它会把你传入的回调函数添加到一个回调函数队列里。- 异步执行:
nextTick
函数会根据当前环境选择合适的异步方法(像Promise
、MutationObserver
、setImmediate
或者setTimeout
)来异步执行回调函数队列里的所有回调函数。 - DOM 更新完成后执行:当回调函数被执行的时候,DOM 已经更新完成了,这样你就可以在回调函数里访问到最新的 DOM 元素。
通过这种方式,nextTick
函数保证了在 DOM 更新完成之后再执行你的代码,避免了因为 DOM 还没更新就去访问而出现的问题。
nextTick
函数的作用
Vue更新DOM是异步执行的。啥意思呢?就是当你修改了Vue实例里的数据之后,Vue不会马上就去更新页面上对应的DOM元素,而是会等这一轮的数据变化全部处理完了,再一次性地去更新DOM。这样做是为了提高性能,避免频繁地更新DOM。
但有时候你可能就想在数据更新之后,马上就对更新后的DOM进行一些操作,这时候nextTick
就派上用场了。nextTick
可以让你在DOM更新完成之后再执行回调函数,这样你就能确保操作的是最新的DOM。
使用场景
- 在修改数据后立即操作DOM:比如你修改了某个元素的显示状态,然后想马上获取这个元素的尺寸信息。
- 在动态创建组件后访问组件实例:当你动态创建了一个组件,想在组件渲染完成后调用它的方法。
代码示例
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Vue nextTick Example</title><!-- 引入Vue.js --><script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
</head><body><div id="app"><!-- 显示message数据 --><p id="message">{{ message }}</p><!-- 点击按钮修改message数据 --><button @click="updateMessage">Update Message</button></div><script>new Vue({el: '#app',data: {// 定义message数据message: 'Hello, Vue!'},methods: {updateMessage() {// 修改message数据this.message = 'Message updated!';// 尝试直接获取更新后的DOM文本内容,此时DOM还未更新console.log('Before nextTick:', document.getElementById('message').textContent);// 使用nextTick在DOM更新后执行回调函数this.$nextTick(() => {// 在DOM更新后获取文本内容console.log('After nextTick:', document.getElementById('message').textContent);// 这里可以进行更多的DOM操作});}}});</script>
</body></html>
代码解释
- HTML部分:
- 有一个
p
标签用来显示message
数据。 - 有一个按钮,点击按钮会调用
updateMessage
方法。
- 有一个
- JavaScript部分:
- 创建了一个Vue实例,包含
data
和methods
。 updateMessage
方法里,先修改了message
数据。- 直接打印
p
标签的文本内容,这时候DOM还没更新,所以打印的还是旧的内容。 - 使用
this.$nextTick
传入一个回调函数,在回调函数里再次打印p
标签的文本内容,这时候DOM已经更新了,打印的就是新的内容。
- 创建了一个Vue实例,包含
通过这个例子,你就能清楚地看到nextTick
的作用啦,它能让你在DOM更新完成之后再去操作DOM,避免因为DOM还没更新而出现问题。
在Vue中使用nextTick函数的好处有哪些?
在Vue里使用nextTick
函数能带来诸多好处,下面详细介绍:
1. 确保操作最新的DOM
Vue更新DOM是异步执行的,当你修改了数据,Vue不会立刻更新DOM,而是将这些更新操作放入一个队列,等这一轮的数据变化处理完后,再统一更新DOM。如果在修改数据后马上操作DOM,可能会得到旧的DOM状态。使用nextTick
,可以确保回调函数在DOM更新完成后执行,这样就能操作到最新的DOM。
比如,你在点击按钮时修改了一个元素的显示状态,并且想马上获取该元素的尺寸信息。要是不使用nextTick
,获取到的可能是元素更新前的尺寸;而使用nextTick
,就能获取到更新后的准确尺寸。
2. 提高性能
Vue的异步更新机制本身就是为了提升性能,通过将多次DOM更新合并为一次,减少了重排和重绘的次数。而nextTick
和这种异步更新机制配合得很好,能让你在DOM更新后再执行操作,避免了不必要的重复操作,进一步提高了性能。
假设你有一个复杂的组件,在数据更新时会触发多个DOM变化。如果在每次数据修改后都立即操作DOM,会导致频繁的重排和重绘,影响性能。使用nextTick
,可以在所有DOM更新完成后再进行操作,减少了性能开销。
3. 避免闪烁问题
在一些情况下,如果你在数据更新后马上修改DOM样式,可能会出现闪烁现象。这是因为DOM更新和样式修改不同步,用户会看到页面先显示旧的样式,再切换到新的样式。使用nextTick
,可以确保在DOM更新完成后再修改样式,避免了闪烁问题。
例如,你要在数据更新后给某个元素添加动画效果。如果不使用nextTick
,动画可能会在元素还没完全更新时就开始,导致动画效果异常。而使用nextTick
,可以保证动画在元素更新完成后再开始,呈现出流畅的效果。
4. 便于组件交互和数据同步
在开发组件时,可能会遇到需要在组件渲染完成后与其他组件进行交互的情况。使用nextTick
可以确保在组件渲染完成后再进行交互,保证数据的同步性。
比如,一个父组件动态创建了一个子组件,想在子组件渲染完成后调用子组件的方法。使用nextTick
,可以在子组件DOM更新完成后再调用方法,避免因为子组件还没渲染好而导致的错误。
下面是一个简单的代码示例,展示了nextTick
确保操作最新DOM的作用:
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Vue nextTick Example</title><!-- 引入Vue.js --><script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
</head><body><div id="app"><!-- 显示message数据 --><p id="message">{{ message }}</p><!-- 点击按钮修改message数据 --><button @click="updateMessage">Update Message</button></div><script>new Vue({el: '#app',data: {// 定义message数据message: 'Hello, Vue!'},methods: {updateMessage() {// 修改message数据this.message = 'Message updated!';// 尝试直接获取更新后的DOM文本内容,此时DOM还未更新console.log('Before nextTick:', document.getElementById('message').textContent);// 使用nextTick在DOM更新后执行回调函数this.$nextTick(() => {// 在DOM更新后获取文本内容console.log('After nextTick:', document.getElementById('message').textContent);// 这里可以进行更多的DOM操作});}}});</script>
</body></html>
在这个示例中,点击按钮修改message
数据后,直接获取p
标签的文本内容,会得到旧的内容;而在nextTick
的回调函数里获取,就能得到更新后的内容。
除了上面提到的场景,Vue中nextTick函数还可以用在哪些地方?
除了前面提到的场景,nextTick
函数在Vue开发中还有不少其他实用的应用场景,下面详细介绍:
1. 表单验证与交互
在表单交互里,有时需要在表单数据更新之后,立刻对表单元素进行验证或者其他操作。由于Vue更新DOM是异步的,这时就可以使用nextTick
确保在DOM更新完成后再进行相关操作。
例如,当用户输入内容后,你想要获取输入框的值并进行验证。若不使用nextTick
,可能获取到的是旧的值。以下是一个简单的示例:
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Form Validation with nextTick</title><script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
</head><body><div id="app"><input v-model="inputValue" @input="validateInput" placeholder="请输入内容"><p v-if="errorMessage">{{ errorMessage }}</p></div><script>new Vue({el: '#app',data: {inputValue: '',errorMessage: ''},methods: {validateInput() {this.$nextTick(() => {if (this.inputValue.length < 3) {this.errorMessage = '输入内容至少需要3个字符';} else {this.errorMessage = '';}});}}});</script>
</body></html>
在这个例子中,当用户输入内容触发validateInput
方法时,使用nextTick
确保在inputValue
更新到DOM之后再进行验证,这样就能获取到最新的输入值。
2. 第三方插件初始化
当在Vue项目里使用第三方插件时,有时候需要在DOM更新完成之后再对插件进行初始化。比如,使用一些图表插件或者富文本编辑器插件,这些插件通常需要操作具体的DOM元素,所以要保证DOM已经更新完毕。
以下是一个使用ECharts
图表插件的示例:
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>ECharts with nextTick</title><script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script><script src="https://cdn.jsdelivr.net/npm/echarts@5.4.2/dist/echarts.min.js"></script>
</head><body><div id="app"><div id="chart" style="width: 600px; height: 400px;"></div><button @click="updateChartData">更新图表数据</button></div><script>new Vue({el: '#app',data: {chartData: [10, 20, 30, 40, 50]},methods: {updateChartData() {this.chartData = [20, 30, 40, 50, 60];this.$nextTick(() => {const chartDom = document.getElementById('chart');const myChart = echarts.init(chartDom);const option = {xAxis: {type: 'category',data: ['A', 'B', 'C', 'D', 'E']},yAxis: {type: 'value'},series: [{data: this.chartData,type: 'bar'}]};myChart.setOption(option);});}}});</script>
</body></html>
在这个示例中,点击按钮更新图表数据后,使用nextTick
确保在DOM更新完成后再初始化ECharts
图表,这样就能正确显示更新后的数据。
3. 动画过渡
在实现动画过渡效果时,有时需要在DOM更新完成之后再开始动画。因为动画通常依赖于元素的初始状态和最终状态,而这些状态需要在DOM更新后才能准确获取。
例如,使用CSS动画实现元素的淡入效果:
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Animation with nextTick</title><script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script><style>.fade-in {opacity: 0;transition: opacity 1s;}.fade-in.show {opacity: 1;}</style>
</head><body><div id="app"><button @click="showElement">显示元素</button><div :class="{ 'fade-in': true, 'show': isVisible }" v-if="isVisible">这是一个淡入的元素</div></div><script>new Vue({el: '#app',data: {isVisible: false},methods: {showElement() {this.isVisible = true;this.$nextTick(() => {// 可以在这里添加更多动画控制逻辑});}}});</script>
</body></html>
在这个例子中,点击按钮显示元素后,使用nextTick
确保在元素插入到DOM之后再开始淡入动画,这样能保证动画效果的正常显示。
在Vue组件的生命周期中,nextTick应该在哪个阶段调用?
在Vue组件的生命周期里,nextTick
可以在多个阶段调用,不过具体要依据需求和场景来选择合适的阶段,下面详细介绍在不同生命周期阶段调用nextTick
的情况:
1. mounted
钩子函数
mounted
钩子函数在组件挂载完成后调用,此时组件的DOM已经渲染到页面上。不过由于Vue的DOM更新是异步的,在mounted
里直接操作DOM可能获取到的是旧的状态,这时可以使用nextTick
确保在DOM更新完成后再进行操作。
使用场景:在组件初次渲染完成后,需要对DOM进行一些初始化操作,比如初始化第三方插件、获取DOM元素的尺寸等。
示例代码:
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>nextTick in mounted</title><script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
</head><body><div id="app"><p ref="myParagraph">{{ message }}</p></div><script>new Vue({el: '#app',data: {message: 'Hello, Vue!'},mounted() {// 在mounted里直接访问ref可能获取到旧的DOM状态console.log('Before nextTick in mounted:', this.$refs.myParagraph.textContent);this.$nextTick(() => {// 在DOM更新后访问refconsole.log('After nextTick in mounted:', this.$refs.myParagraph.textContent);// 可以在这里进行更多DOM操作});}});</script>
</body></html>
在这个示例中,mounted
钩子函数里使用nextTick
确保在DOM更新完成后再获取p
元素的文本内容,这样就能得到最新的内容。
2. updated
钩子函数
updated
钩子函数在组件的数据更新导致DOM更新完成后调用。不过在updated
里,可能会存在多次触发的情况,而且由于DOM更新是异步的,也可以使用nextTick
确保在所有DOM更新完成后再进行操作。
使用场景:当组件的数据更新后,需要根据最新的DOM状态进行一些计算或者交互操作。
示例代码:
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>nextTick in updated</title><script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
</head><body><div id="app"><p ref="myParagraph">{{ message }}</p><button @click="updateMessage">更新消息</button></div><script>new Vue({el: '#app',data: {message: '初始消息'},methods: {updateMessage() {this.message = '更新后的消息';}},updated() {// 在updated里直接访问ref可能获取到旧的DOM状态console.log('Before nextTick in updated:', this.$refs.myParagraph.textContent);this.$nextTick(() => {// 在DOM更新后访问refconsole.log('After nextTick in updated:', this.$refs.myParagraph.textContent);// 可以在这里进行更多DOM操作});}});</script>
</body></html>
在这个示例中,点击按钮更新message
数据后,updated
钩子函数会被触发,使用nextTick
确保在DOM更新完成后再获取p
元素的文本内容,避免获取到旧的内容。
3. 自定义方法中
除了生命周期钩子函数,在组件的自定义方法里也可以使用nextTick
。当在自定义方法中修改了组件的数据,并且需要在DOM更新后进行操作时,就可以使用nextTick
。
使用场景:比如在点击事件处理函数中修改数据后,需要对更新后的DOM进行操作。
示例代码:
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>nextTick in custom method</title><script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
</head><body><div id="app"><p ref="myParagraph">{{ message }}</p><button @click="changeMessage">改变消息</button></div><script>new Vue({el: '#app',data: {message: '原始消息'},methods: {changeMessage() {this.message = '新消息';// 在修改数据后使用nextTickthis.$nextTick(() => {console.log('After nextTick in custom method:', this.$refs.myParagraph.textContent);// 可以在这里进行更多DOM操作});}}});</script>
</body></html>
在这个示例中,点击按钮调用changeMessage
方法修改message
数据后,使用nextTick
确保在DOM更新完成后再获取p
元素的文本内容,从而得到最新的内容。
相关文章:
Vue 中的nextTick函数的原理、作用及使用场景。
大白话Vue 中的nextTick函数的原理、作用及使用场景 在 Vue 里,nextTick 函数是个超实用的工具,它能让你在 DOM 更新完成之后再执行代码。为了能更好地理解 nextTick 函数的原理,咱们就来深入剖析一下。 核心思路 Vue 里的数据更新是异步执…...
详细讲解css的穿透方法
样式穿透(CSS穿透)的几种方法,包括在Vue中使用::v-deep、>>>、/deep/,还有pointer-events属性。还有关于Shadow DOM和::part伪元素的内容。接下来我会把这些方法分类,并详细说明每种方法的适用场景和注意事项…...
深入理解 tree 命令行工具:目录结构可视化的利器
文章目录 前言1. 什么是 tree 命令?安装 tree 2. tree 的基本用法显示当前目录的树状结构显示指定目录的树状结构 3. tree 的常用选项3.1 显示隐藏文件3.2 排除特定目录或文件3.3 限制递归深度3.4 显示文件大小3.5 显示文件的权限信息3.6 将输出保存到文件 4. 实际应…...
【QA】QT中事件和信号的区别以及联系是什么?
在 Qt 中,事件(Event) 和 信号与槽(Signals & Slots) 是 GUI 编程的核心机制,它们既有联系又有本质区别。以下从底层原理、触发流程、代码实现、适用场景四个维度展开对比,并通过大量示例说…...
C++实用函数:find与find_if
本篇来介绍C++中find和find_if函数的使用,通过多个实例来演示。 find用于基础的查找功能,find_if可以实现更复杂的匹配查找条件。 1 find 1.1 函数原型 template <class InputIterator, class T> InputIterator find ( InputIterator first, InputIterator last, c…...
全面了解 Cookies、Session 和 Token
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
酷淘商场项目【从零到一详解】Web端
✨博客主页: https://blog.csdn.net/m0_63815035?typeblog 💗《博客内容》:.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 📢博客专栏: https://blog.csdn.net/m0_63815035/cat…...
如何转移虚拟主机?最新虚拟主机迁移方法
转移网站并不困难,但选择正确的选项和最佳程序才是关键。网站托管服务被视为当今数字世界的基石,全球有18 亿个网站。网站所有者可以通过下载备份、将其上传到新服务器并指向域名来手动转移网站。他们还可以通过新网站托管商的助手请求来移动网站。对于初…...
JVM 核心知识点总结
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
无人机数据链技术详解,无人机图传数传技术,无人机数据传输技术原理
以下是对无人机数据链技术、无人机图传数传技术以及无人机数据传输技术原理的详细解释: 无人机数据链技术 无人机数据链是任务机、地面控制站之间,以及任务机与中继机、武器系统或其它操作平台之间,按照约定的通信协议和信息传输方式&#…...
【Linux】同步原理剖析及模拟BlockQueue生产消费模型
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
【AVRCP】GOEP互操作性深度解析:蓝牙封面艺术传输的技术实现与演进
目录 一、技术基础:协议架构与核心概念 1.1 GOEP协议体系解析 1.2 IrOBEX协议关键技术 1.3 版本强制性要求 1.4 关键特性对比(GOEP v2.0 vs v1.1) 1.5 关键技术实现细节 1.6 GOEP v2.0互操作性要求 1.7 IrOBEX v1.5互操作性要求 二、…...
三分钟读懂微服务
一、什么是微服务 微服务,简单来说,就是把一个庞大复杂的软件系统,拆分成一个个小型的、独立的服务模块。打个比方,一个大型商场就如同传统的单体架构软件系统,里面所有的店铺、设施都紧密关联在一起。而微服务架构下…...
《Oracle DBA入门实战:十大高频问题详解与避坑指南》
Oracle DBA 入门作业十问十答 本文为 Oracle DBA 入门作业整理,涵盖工具使用、配置管理及权限控制等核心知识点,适合新手快速上手。 如有疑问或补充,欢迎评论区交流! 1. DBA 常用工具有哪些? Oracle Universal Instal…...
深入剖析 Android Compose 框架的自动动画:AnimatedVisibility 与 AnimatedContent(二十四)
深入剖析 Android Compose 框架的自动动画:AnimatedVisibility 与 AnimatedContent 引言 在 Android 应用开发中,动画是提升用户体验的重要手段。它能够让界面元素的显示与隐藏、状态的切换变得更加自然和流畅,避免生硬的变化给用户带来不佳…...
【线程安全问题的原因和方法】【java形式】【图片详解】
在本章节中采用实例图片的方式,以一个学习者的姿态进行描述问题解决问题,更加清晰明了,以及过程中会发问的问题都会一一进行呈现 目录 线程安全演示线程不安全情况图片解释: 将上述代码进行修改【从并行转化成穿行的方式】不会出…...
Cocos Creator Shader入门实战(六):使用setProperty动态设置材质属性,以及材质常用接口
引擎:3.8.5 您好,我是鹤九日! 回顾 上篇文章,我们主要讲解了关于材质的使用,主要有这么几点: 一、没有Effect资源,材质无从说起。 二、材质的构建,支持编译器和代码的动态构建 三…...
编程题记录3
九宫幻方 题目链接:https://www.lanqiao.cn/problems/100/learning/?page1&first_category_id1&second_category_id3&tags%E7%9C%81%E8%B5%9B&tag_relationintersection 先旋转、镜像得到所有的情况,可以发现情况是可以暴力得出的。…...
Geotools自动识别SLD并生成图例图片实战-以Polygon数据为例
目录 前言 一、Geotools与SLD制图基础 1、SLD是什么 2、SLD有什么用 二、SLD文件的解析与读取 1、SLD结构介绍 2、SLD实例展示 3、SLD读取方法 三、图例生成与展示 1、图例生成流程 2、图例生成实战 3、图例生成展示 四、结论 前言 在地理信息系统(GIS&…...
windows docker如何修改 默认的Container memory usage
参考:https://forums.docker.com/t/docker-on-windows-11-with-wsl2-does-not-use-the-memory-i-set-in-wslconfig/144404/3 参考:https://learn.microsoft.com/en-us/windows/wsl/wsl-config...
LabVIEW液压传动系统教学仿真平台
本文介绍了一种基于LabVIEW的液压传动系统教学仿真平台,该平台采用“老师讲解、线上仿真、线下操作”的复合实验模式,旨在提高实验教学的效率与安全性。通过实例验证,展示了该平台在教学和实际操作中的应用效果,同时也为液压传动系…...
Java实习生面试题(2025.3.23 be)
一、v-if与v-show的区别 v-show 和 v-if 都是 Vue 中的条件渲染指令,它们的主要区别在于渲染策略:v-if 会根据条件决定是否编译元素,而 v-show 则始终编译元素,只是通过改变 CSS 的 display 属性来控制显示与隐藏。 二、mybatis-…...
OpenCV第2课 OpenCV的组成结构与图片/视频的加载及展示
1.OpenCV 的组成结构 2.OpenCV 的具体模块 3. 图像的读取 4. 视频的读取 1.OpenCV 的组成结构 OpenCV 是由很多模块组成的,这些模块可以分成很多层: 最底层是基于硬件加速层(HAL)的各种硬件优化。再上一层是opencv_contrib 模块所包含的OpenCV 由其他开发人员所贡献的代…...
Blender导出fbx到Unity找不到贴图的问题
fbx导入Unity材质能不能找到贴图是一件玄学的事情。常见的情况是有些材质能找到,有些找不到: 可能有用的方法 解决方法1:把贴图文件复制过去,模型reimport; 解决方法2:导出时路径模式选复制,内…...
kafka的文章
1.面试的问题 要点 至多一次、恰好一次数据一致性超时重试、幂等消息顺序消息挤压延时消息 1.1 kafaka 生产消息的过程。 在消息发送的过程中,涉及到了两个线程,一个是main 线程,一个是sender 线程。在main 线程中创建了一个双端队列 Reco…...
Go常见问题与回答(下)
文章目录 1、通过指针变量 p 访问其成员变量 name,有哪几种方式?2、代码,说出结果3、扩容提,代码,说出结果4、指出下面这段代码的错误之处5、是否通过编译6、关于字符串连接,下面语法正确的是7、关于iota&a…...
vue3中如何缓存路由组件
在 Vue3 中缓存路由组件,主要借助<keep-alive>组件来实现,具体方法如下: 1. 全局缓存路由组件 在 App.vue 等根组件中,直接将<router-view>包裹在<keep-alive>标签内,这样所有的路由组件都会被缓存…...
云服务器怎么防御ddos攻击呢?
防御DDoS攻击是保障云服务器稳定运行的关键措施,以下是综合多种防护策略的详细方案: 1. 启用云服务商提供的DDoS防护服务 高防IP/流量清洗: 将业务流量接入云服务商的高防IP,由专业清洗中心过滤恶意流量,仅放行正常请求…...
Log4j2 的核心实现和源码分析
Log4j2 的核心实现和源码分析 1. 核心组件 1.1 Logger 功能:负责记录日志信息。实现:org.apache.logging.log4j.Logger 接口,org.apache.logging.log4j.core.Logger 类。1.2 Appender 功能:负责将日志信息输出到不同的目的地,如文件、控制台等。实现:org.apache.loggin…...
【深度学习】【目标检测】【OnnxRuntime】【C++】YOLOV3模型部署
【深度学习】【目标检测】【OnnxRuntime】【C】YOLOV3模型部署 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】【目标检测】【OnnxRuntime】【C】YOLOV3模型部署前言Windows平台搭建依赖环境模型转换--pytorch转onnxONNXRuntime推…...
四种跨模态行人重识别可视化方法
1.Gradcam 2.检索可视化 3.tsne图 4.距离分布 需要的私聊,代码需要付费...
8个DeepSeek文章润色指令
今天道叔给各位文字工作者安利DeepSeek的8个神仙级润色指令(附真实案例拆解),建议搭配冰美式食用更佳↓↓↓ 一、【学术黑话翻译器】 适用场景:给投资人看的BP/行业白皮书/专家访谈实录 指令公式:"将以下内容转化为通俗易懂的行业洞察…...
解决PowerShell下Git中文乱码问题
解决PowerShell下Git中文乱码问题 在使用Git进行版本控制时,许多开发者可能会遇到中文乱码的问题,尤其是在Windows环境下使用PowerShell时。这不仅影响代码的阅读和提交,还可能导致一些不可预见的错误。本文将详细探讨如何在PowerShell下解决…...
oracle数据库(数据库启动关闭/sqlplus登录及基本操作/设置字符集/distinct去重)
目录 1. Oracle数据库启动 2. Oracle数据库关闭 3. sqlplus登录Oracle数据库 3.1 使用sqlplus登录Oracle数据库 3.2 使用sqlplus登录Oracle数据库 3.3 远程登录 3.4 解锁用户 3.5 修改用户密码 3.6 查看当前语言环境 4. sqlplus基本操作 4.1 显示当前用户 4.2 查看当前用户…...
mapreduce时,客户端做哪些事
在MapReduce过程中,客户端(Client)是用户提交作业的入口,负责作业的初始化、配置、资源提交和作业监控。以下是客户端在整个流程中的具体职责和操作步骤: 1. 作业配置与参数解析 设置作业属性: 定义MapRed…...
DeepBI:重构流量逻辑,助力亚马逊广告实现高效流量增长
在日益激烈的跨境电商竞争环境中,广告投放早已从“粗放撒网”走向“精细化运营”。尤其是在亚马逊这样一个成熟且竞争白热化的平台,如何在广告预算有限的前提下实现高效曝光、精准触达、稳定转化,成为众多卖家和运营团队面临的核心挑战。 De…...
Linux内核的页面错误:原因与解决方案
当程序访问虚拟内存中的一个页面时,如果该页面当前不在物理内存中,就会触发一个称为"page fault"(页异常)的异常。操作系统需要处理这个异常,并将所需页面从磁盘加载到内存中。实现虚存管理的一个关键是page…...
LORA 中的 梯度外积是什么意思; 方差和协方差的实际含义:衡量变量的离散程度和变量间的线性相关性
LORA 中的 梯度外积是什么意思 目录 LORA 中的 梯度外积是什么意思**一、梯度外积的定义****二、示例说明****步骤1:计算单样本梯度****步骤2:计算梯度外积****三、梯度外积的作用****四、总结**方差和协方差的实际含义:衡量变量的离散程度和变量间的线性相关性**一、方差(…...
XSS复现漏洞简单前八关靶场
靶场不需要安装任意环境 链接如下:XSS Game - Learning XSS Made Simple! | Created by PwnFunction 目录 XSS Game 第一关:Ma Spaghet! 第二关:Jefff 第三关:Ugandan Knuckles 第四关:Ricardo Milos 第五关&am…...
3.24-3 接口测试断言
一.postman 断言 1.断言再test中 #状态码是否等于200 tests["Status code is 200"] responseCode.code 200; #断言响应时间小于200ms tests["Response time is less than 200ms"] responseTime < 200; #断言响应体包含内容 tests["Body…...
《鸿蒙携手AI:解锁智慧出行底层逻辑》
在科技飞速发展的当下,智慧出行成为人们对未来交通的美好期许,而鸿蒙系统与人工智能的深度融合,正为这一愿景的实现提供强大助力。从技术原理角度深入剖析,鸿蒙系统究竟如何支撑人工智能在智慧出行场景中的应用呢?这背…...
【AVRCP】探寻AVRCP控制互操作性:连接、命令与设备交互
目录 一、AVCTP连接管理 1.1 AVCTP连接建立 1.2 AVCTP连接释放 二、AV/C命令的操作流程 2.1 AV/C命令交换流程 2.2 AV/C命令类型 三、AVRCP特定命令 四、AVRCP浏览命令 五、OBEX连接管理 5.1 OBEX连接建立 5.2 OBEX连接释放 六、总结 七、参考资料 AVRCP对于实现设…...
Mybatis-Plus知识点详解
Mybatis-plus(简称MP),基于Mybatis的增强工具,保留了Mybatis的所有功能,同时增加了通用的CRUD,条件构造器,分页插件等等实用工具 特性 即拿即用:通过通用Mapper和Service,无需编写XML既可以完成单表CURE操作 Lambda支持:使用Lambda表达式构建查询条件,避免硬编码字段名,提升代…...
紧凑交叉引用表
嗯,用户问的是“compact xref table”,也就是紧凑型交叉引用表。我之前在回答中提到过交叉引用流(XRef Stream),但可能需要更详细地解释两者的区别和联系。根据搜索结果中的网页1,传统的Xref表以文本形式存…...
CMake 详解:跨平台构建系统的入门与进阶
目录 一、相关知识点 1. 什么是cmake,为什么使用? 2. 构建过程 二、CMake使用流程 1. 创建 CMakeLists.txt 文件 2. 配置构建目录 3. 运行cmake 4. 运行make编译 一、相关知识点 1. 什么是cmake,为什么使用? CMake 是一个开…...
【架构设计】学习路径
掌握前置知识后,学习架构设计需要从理论认知到实践落地逐步推进。以下是系统化的学习路径,结合具体案例与实操建议,帮助你快速进阶: 一、构建架构思维基础 1. 理解架构设计的核心目标 关键问题驱动设计: 每个架构决策…...
14、Python 枚举与类型注解进阶
Python 枚举与类型注解进阶 文章概述 本文深入探讨Python中枚举(Enum)与类型注解的高级应用场景。通过剖析Enum类的核心特性、dataclass装饰器的工程实践、静态类型检查工具mypy的集成使用,结合状态机等实际案例,系统性地提升代…...
C语言 【实现电脑关机小游戏】非常好玩
引言 在时间限制内做出正确的回答,时间一到,电脑自动关机,听起来是不是很有意思,下面来看看怎么实现吧。 注意:该游戏只在windows系统下可以玩, 一、游戏原理: 在Windows系统下,通…...
【蓝桥杯速成】| 11.回溯 之 子集问题
题目一:子集 问题描述 78. 子集 - 力扣(LeetCode) 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例…...
统计矩的高阶推广:经验还是理论推导?
矩的发展既是经验总结的结果,也是数学理论推导的产物。研究者们在分析数据、描述物理现象的过程中,发现了低阶矩与日常物理概念(如质心、惯性)之间的紧密联系,而高阶矩的应用往往出现在更复杂的数学体系中,…...