Vue.js 的指令系统是其最强大的特性之一,通过以 v- 开头的特殊属性,我们可以在模板中声明式地绑定底层Vue实例的数据。本文将深入讲解Vue中最重要的指令,帮助掌握Vue的核心功能。

文章目录

    • 1. v-model:双向数据绑定的核心
      • 基本用法
      • 修饰符
      • 自定义组件中的 v-model
    • 2. v-bind:属性绑定的万能钥匙
      • 基本用法
      • 动态属性名
    • 3. v-if / v-else-if / v-else:条件渲染
      • 基本用法
      • v-if vs v-show
    • 4. v-for:列表渲染
      • 基本用法
      • 维护状态(key的重要性)
    • 5. v-on:事件处理
      • 基本用法
      • 事件修饰符
      • 按键修饰符
    • 6. 其他重要指令
      • v-text 和 v-html
      • v-show
      • v-pre
      • v-once
      • v-cloak
    • 7. 自定义指令
      • 全局注册
      • 局部注册
      • 指令钩子函数
      • 高级自定义指令示例
    • 8. 实践
      • 指令实践
  • Vue.js 指令快速参考表
    • 核心指令对照表
    • 常用修饰符详解
      • v-model 修饰符
      • v-on 事件修饰符
      • v-on 按键修饰符
    • 使用场景对比
      • v-if vs v-show
      • v-for 使用要点
    • 最佳实践速查
      • ✅ 推荐做法
      • ❌ 避免做法
    • 自定义指令语法
      • 注册方式
      • 钩子函数
      • 参数说明


在这里插入图片描述

1. v-model:双向数据绑定的核心

基本用法

v-model 是Vue中实现双向数据绑定的指令,主要用于表单元素。

<template><div><!-- 文本输入 --><input v-model="message" placeholder="输入消息"><p>消息是: {{ message }}</p><!-- 多行文本 --><textarea v-model="text" placeholder="多行文本"></textarea><!-- 复选框 --><input type="checkbox" id="checkbox" v-model="checked"><label for="checkbox">{{ checked }}</label><!-- 单选按钮 --><input type="radio" id="one" value="One" v-model="picked"><label for="one">One</label><input type="radio" id="two" value="Two" v-model="picked"><label for="two">Two</label><!-- 选择框 --><select v-model="selected"><option disabled value="">请选择</option><option>A</option><option>B</option><option>C</option></select></div>
</template><script>
export default {data() {return {message: '',text: '',checked: false,picked: '',selected: ''}}
}
</script>

修饰符

v-model 提供了三个有用的修饰符:

<!-- .lazy - 在 change 事件而非 input 事件触发时更新 -->
<input v-model.lazy="msg"><!-- .number - 自动将用户输入转换为数值类型 -->
<input v-model.number="age" type="number"><!-- .trim - 自动过滤用户输入的首尾空白字符 -->
<input v-model.trim="msg">

自定义组件中的 v-model

<!-- 父组件 -->
<custom-input v-model="searchText"></custom-input><!-- 子组件 CustomInput.vue -->
<template><input:value="modelValue"@input="$emit('update:modelValue', $event.target.value)">
</template><script>
export default {props: ['modelValue'],emits: ['update:modelValue']
}
</script>

2. v-bind:属性绑定的万能钥匙

基本用法

v-bind 用于动态绑定一个或多个属性,或组件 prop 到表达式。

<template><div><!-- 绑定属性 --><img v-bind:src="imageSrc" v-bind:alt="imageAlt"><!-- 缩写语法 --><img :src="imageSrc" :alt="imageAlt"><!-- 绑定类名 --><div :class="{ active: isActive, 'text-danger': hasError }"></div><div :class="[activeClass, errorClass]"></div><div :class="classObject"></div><!-- 绑定样式 --><div :style="{ color: activeColor, fontSize: fontSize + 'px' }"></div><div :style="[baseStyles, overridingStyles]"></div><div :style="styleObject"></div></div>
</template><script>
export default {data() {return {imageSrc: 'https://example.com/image.jpg',imageAlt: '示例图片',isActive: true,hasError: false,activeClass: 'active',errorClass: 'text-danger',classObject: {active: true,'text-danger': false},activeColor: 'red',fontSize: 30,styleObject: {color: 'red',fontSize: '13px'},baseStyles: { color: 'blue' },overridingStyles: { fontSize: '20px' }}}
}
</script>

动态属性名

<template><!-- 动态属性名 --><a :[attributeName]="url">链接</a><!-- 当 attributeName 为 "href" 时,等价于 --><a :href="url">链接</a>
</template><script>
export default {data() {return {attributeName: 'href',url: 'https://www.example.com'}}
}
</script>

3. v-if / v-else-if / v-else:条件渲染

基本用法

这些指令用于条件性地渲染元素。

<template><div><h1 v-if="awesome">Vue is awesome!</h1><h1 v-else>Oh no 😢</h1><!-- 多条件判断 --><div v-if="type === 'A'">A</div><div v-else-if="type === 'B'">B</div><div v-else-if="type === 'C'">C</div><div v-else>Not A/B/C</div><!-- 使用 template 包装多个元素 --><template v-if="loginType === 'username'"><label>Username</label><input placeholder="Enter your username" key="username-input"></template><template v-else><label>Email</label><input placeholder="Enter your email address" key="email-input"></template></div>
</template><script>
export default {data() {return {awesome: true,type: 'A',loginType: 'username'}}
}
</script>

v-if vs v-show

<template><div><!-- v-if 是"真正"的条件渲染,会销毁和重建元素 --><p v-if="showIf">通过 v-if 显示</p><!-- v-show 只是简单地切换元素的 CSS display 属性 --><p v-show="showShow">通过 v-show 显示</p></div>
</template><script>
export default {data() {return {showIf: true,showShow: true}}
}
</script>

使用建议:

  • 如果需要非常频繁地切换,则使用 v-show
  • 如果在运行时条件很少改变,则使用 v-if

4. v-for:列表渲染

基本用法

v-for 指令用于基于源数据多次渲染元素或模板块。

<template><div><!-- 遍历数组 --><ul><li v-for="item in items" :key="item.id">{{ item.message }}</li></ul><!-- 带索引的遍历 --><ul><li v-for="(item, index) in items" :key="item.id">{{ index }} - {{ item.message }}</li></ul><!-- 遍历对象 --><ul><li v-for="value in object" :key="value">{{ value }}</li></ul><!-- 遍历对象,包含键名 --><ul><li v-for="(value, name) in object" :key="name">{{ name }}: {{ value }}</li></ul><!-- 遍历对象,包含键名和索引 --><ul><li v-for="(value, name, index) in object" :key="name">{{ index }}. {{ name }}: {{ value }}</li></ul><!-- 遍历数字 --><span v-for="n in 10" :key="n">{{ n }}</span></div>
</template><script>
export default {data() {return {items: [{ id: 1, message: 'Foo' },{ id: 2, message: 'Bar' }],object: {title: 'How to do lists in Vue',author: 'Jane Doe',publishedAt: '2016-04-10'}}}
}
</script>

维护状态(key的重要性)

<template><div><!-- 不推荐:没有key --><div v-for="item in items">{{ item.name }}</div><!-- 推荐:使用唯一的key --><div v-for="item in items" :key="item.id">{{ item.name }}</div><!-- 数组变更方法 --><button @click="addItem">添加项目</button><button @click="removeItem">删除项目</button><button @click="updateItem">更新项目</button></div>
</template><script>
export default {data() {return {items: [{ id: 1, name: '项目1' },{ id: 2, name: '项目2' }]}},methods: {addItem() {this.items.push({ id: Date.now(), name: `项目${this.items.length + 1}` })},removeItem() {this.items.pop()},updateItem() {if (this.items.length > 0) {this.items[0].name = '更新的项目1'}}}
}
</script>

5. v-on:事件处理

基本用法

v-on 指令用于监听DOM事件,并在触发时执行JavaScript代码。

<template><div><!-- 基本用法 --><button v-on:click="counter += 1">Add 1</button><p>按钮被点击了 {{ counter }} 次</p><!-- 缩写语法 --><button @click="greet">Greet</button><!-- 内联处理器中的方法 --><button @click="say('hi')">Say hi</button><button @click="say('what')">Say what</button><!-- 访问原始的DOM事件 --><button @click="warn('Form cannot be submitted yet.', $event)">Submit</button><!-- 多个事件处理器 --><button @click="one($event), two($event)">Submit</button></div>
</template><script>
export default {data() {return {counter: 0,name: 'Vue.js'}},methods: {greet(event) {alert('Hello ' + this.name + '!')if (event) {alert(event.target.tagName)}},say(message) {alert(message)},warn(message, event) {if (event) {event.preventDefault()}alert(message)},one(event) {console.log('第一个处理器')},two(event) {console.log('第二个处理器')}}
}
</script>

事件修饰符

Vue为 v-on 提供了事件修饰符来处理DOM事件细节。

<template><div><!-- 阻止单击事件继续传播 --><a @click.stop="doThis"></a><!-- 提交事件不再重载页面 --><form @submit.prevent="onSubmit"></form><!-- 修饰符可以串联 --><a @click.stop.prevent="doThat"></a><!-- 只有修饰符 --><form @submit.prevent></form><!-- 添加事件监听器时使用事件捕获模式 --><div @click.capture="doThis">...</div><!-- 只当在 event.target 是当前元素自身时触发处理函数 --><div @click.self="doThat">...</div><!-- 点击事件将只会触发一次 --><a @click.once="doThis"></a><!-- 滚动事件的默认行为将会立即触发,而不会等待onScroll完成 --><div @scroll.passive="onScroll">...</div></div>
</template>

按键修饰符

<template><div><!-- 只有在 key 是 Enter 时调用 vm.submit() --><input @keyup.enter="submit"><!-- 其他按键修饰符 --><input @keyup.tab="tabHandler"><input @keyup.delete="deleteHandler"><input @keyup.esc="escHandler"><input @keyup.space="spaceHandler"><input @keyup.up="upHandler"><input @keyup.down="downHandler"><input @keyup.left="leftHandler"><input @keyup.right="rightHandler"><!-- 系统修饰键 --><input @keyup.ctrl="ctrlHandler"><input @keyup.alt="altHandler"><input @keyup.shift="shiftHandler"><input @keyup.meta="metaHandler"><!-- 组合使用 --><input @keyup.ctrl.enter="ctrlEnterHandler"><!-- 鼠标按钮修饰符 --><button @click.left="leftClick">左键</button><button @click.right="rightClick">右键</button><button @click.middle="middleClick">中键</button></div>
</template>

6. 其他重要指令

v-text 和 v-html

<template><div><!-- v-text:更新元素的textContent --><span v-text="msg"></span><!-- 等价于 --><span>{{ msg }}</span><!-- v-html:更新元素的innerHTML --><p v-html="html"></p></div>
</template><script>
export default {data() {return {msg: 'Hello World',html: '<strong>粗体文本</strong>'}}
}
</script>

v-show

<template><div><!-- 根据表达式的真假值,切换元素的display CSS属性 --><h1 v-show="ok">Hello!</h1></div>
</template><script>
export default {data() {return {ok: true}}
}
</script>

v-pre

<template><div><!-- 跳过这个元素和它的子元素的编译过程 --><span v-pre>{{ this will not be compiled }}</span></div>
</template>

v-once

<template><div><!-- 只渲染元素和组件一次 --><h1 v-once>{{ title }}</h1><!-- 这也适用于子组件 --><my-component v-once :comment="msg"></my-component><!-- 带有v-for的v-once --><ul><li v-for="i in list" v-once :key="i">{{ i }}</li></ul></div>
</template><script>
export default {data() {return {title: '只渲染一次的标题',msg: '这是一条消息',list: [1, 2, 3]}}
}
</script>

v-cloak

<template><!-- 防止页面加载时显示未编译的Mustache标签 --><div v-cloak>{{ message }}</div>
</template><style>
[v-cloak] {display: none;
}
</style><script>
export default {data() {return {message: 'Hello World'}}
}
</script>

7. 自定义指令

全局注册

// main.js
const app = createApp({})// 注册一个全局自定义指令 v-focus
app.directive('focus', {// 当被绑定的元素挂载到DOM中时...mounted(el) {// 聚焦元素el.focus()}
})

局部注册

<template><input v-focus />
</template><script>
export default {directives: {// 在模板中启用v-focusfocus: {// 指令的定义mounted(el) {el.focus()}}}
}
</script>

指令钩子函数

const myDirective = {// 在绑定元素的父组件被挂载前调用beforeMount(el, binding, vnode, prevVnode) {},// 在元素被插入到DOM前调用mounted(el, binding, vnode, prevVnode) {},// 绑定元素的父组件更新前调用beforeUpdate(el, binding, vnode, prevVnode) {},// 在绑定元素的父组件及他自己的所有子节点都更新后调用updated(el, binding, vnode, prevVnode) {},// 绑定元素的父组件卸载前调用beforeUnmount(el, binding, vnode, prevVnode) {},// 绑定元素的父组件卸载后调用unmounted(el, binding, vnode, prevVnode) {}
}

高级自定义指令示例

// 颜色指令
app.directive('color', {mounted(el, binding) {el.style.color = binding.value},updated(el, binding) {el.style.color = binding.value}
})// 权限指令
app.directive('permission', {mounted(el, binding) {const { value } = bindingconst roles = ['admin', 'user'] // 从store或其他地方获取用户角色if (value && value instanceof Array && value.length > 0) {const permissionRoles = valueconst hasPermission = roles.some(role => {return permissionRoles.includes(role)})if (!hasPermission) {el.parentNode && el.parentNode.removeChild(el)}}}
})

8. 实践

指令实践

  1. 合理选择v-if和v-show

    • 频繁切换使用v-show
    • 条件很少改变使用v-if
  2. v-for必须使用key

    <!-- 推荐 -->
    <li v-for="item in items" :key="item.id">{{ item.name }}</li><!-- 不推荐 -->
    <li v-for="item in items">{{ item.name }}</li>
    
  3. 避免v-if和v-for同时使用

    <!-- 不推荐 -->
    <li v-for="user in users" v-if="user.isActive" :key="user.id">{{ user.name }}
    </li><!-- 推荐:使用computed -->
    <li v-for="user in activeUsers" :key="user.id">{{ user.name }}
    </li>
    
  4. 事件处理器优化

    <!-- 推荐:使用方法 -->
    <button @click="handleClick">点击</button><!-- 不推荐:复杂的内联表达式 -->
    <button @click="items.push({ id: Date.now(), name: 'new' }), updateCount++">添加
    </button>
    

Vue.js 指令快速参考表

核心指令对照表

指令作用语法示例修饰符使用场景
v-model双向数据绑定<input v-model="message">.lazy .number .trim表单输入、自定义组件
v-bind单向属性绑定:src="url" :class="{active: isActive}"动态属性、样式、类名
v-if条件渲染(销毁/创建)<div v-if="show">content</div>条件很少改变的元素
v-else-if多条件渲染<div v-else-if="type === 'A'">A</div>多分支条件判断
v-else否则渲染<div v-else>default</div>条件渲染的最后分支
v-show条件显示(CSS display)<div v-show="visible">content</div>频繁切换显示/隐藏
v-for列表渲染<li v-for="item in items" :key="item.id">数组、对象、数字遍历
v-on事件监听@click="handler" @keyup.enter="submit".stop .prevent .once用户交互事件处理
v-text更新文本内容<span v-text="message"></span>纯文本显示
v-html更新HTML内容<div v-html="htmlContent"></div>动态HTML内容
v-pre跳过编译<span v-pre>{{ raw }}</span>显示原始模板语法
v-once只渲染一次<h1 v-once>{{ title }}</h1>静态内容性能优化
v-cloak隐藏未编译模板<div v-cloak>{{ message }}</div>防止模板闪烁

常用修饰符详解

v-model 修饰符

修饰符说明示例
.lazy在 change 事件触发时同步<input v-model.lazy="msg">
.number自动转换为数字类型<input v-model.number="age">
.trim自动去除首尾空格<input v-model.trim="msg">

v-on 事件修饰符

修饰符说明示例
.stop阻止事件冒泡@click.stop="doThis"
.prevent阻止默认行为@submit.prevent="onSubmit"
.capture使用事件捕获模式@click.capture="doThis"
.self只在事件目标是元素自身时触发@click.self="doThat"
.once事件只触发一次@click.once="doThis"
.passive立即触发默认行为@scroll.passive="onScroll"

v-on 按键修饰符

修饰符说明示例
.enter回车键@keyup.enter="submit"
.tabTab键@keyup.tab="nextField"
.delete删除键@keyup.delete="deleteItem"
.escEscape键@keyup.esc="cancel"
.space空格键@keyup.space="play"
.up/.down/.left/.right方向键@keyup.up="moveUp"
.ctrl/.alt/.shift/.meta系统修饰键@keyup.ctrl.enter="save"

使用场景对比

v-if vs v-show

特性v-ifv-show
渲染方式条件性渲染(真正的删除/创建)基于CSS display切换
切换开销高(重新渲染)低(只改变CSS)
初始开销低(条件为假时不渲染)高(总是渲染)
适用场景条件很少改变频繁切换
生命周期会触发组件的生命周期不会触发生命周期

v-for 使用要点

遍历类型语法参数说明
数组v-for="item in items"item: 数组元素
数组+索引v-for="(item, index) in items"item: 元素, index: 索引
对象v-for="value in object"value: 属性值
对象+键名v-for="(value, key) in object"value: 值, key: 键名
对象+键名+索引v-for="(value, key, index) in object"value: 值, key: 键名, index: 索引
数字v-for="n in 10"n: 1到10的数字

最佳实践速查

✅ 推荐做法

  • v-for 必须使用 :key
  • 使用计算属性代替复杂的模板表达式
  • 事件处理器使用方法而非内联表达式
  • 合理选择 v-if 和 v-show
  • 使用缩写语法(: 代替 v-bind:@ 代替 v-on:

❌ 避免做法

  • v-for 和 v-if 在同一元素上使用
  • 使用数组索引作为 key(除非必要)
  • 在模板中编写复杂逻辑
  • 忘记使用事件修饰符优化性能
  • 滥用 v-html(XSS风险)

自定义指令语法

注册方式

// 全局注册
app.directive('focus', {mounted(el) { el.focus() }
})// 局部注册
directives: {focus: {mounted(el) { el.focus() }}
}

钩子函数

钩子触发时机
beforeMount绑定元素的父组件被挂载前
mounted元素被插入到DOM后
beforeUpdate绑定元素的父组件更新前
updated父组件及所有子节点都更新后
beforeUnmount绑定元素的父组件卸载前
unmounted绑定元素的父组件卸载后

参数说明

directive(el, binding, vnode, prevVnode) {// el: 绑定的元素// binding: { value, oldValue, arg, modifiers, instance, dir }// vnode: 虚拟节点// prevVnode: 之前的虚拟节点
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/91571.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/91571.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/91571.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机分类汇总大全

前端部分有 Node.js、ActionScript、Swift、TypeScript、Webpack、JavaScript。需要分别详细说明它们的定义、特点、应用场景、优缺点等。比如 Node.js&#xff0c;要提到它的运行环境、事件驱动、非阻塞 I/O&#xff0c;适合的应用如 API 服务、实时应用&#xff0c;以及常用框…

模拟链路滤波器设计一些细节

目录 原设计思路剖析 300M带宽仿真与计算 原设计思路剖析 滤波器设计的一些细节,以下为ADS54J60模拟链路的一些问题设计原理图 实际电路设计如上所示,但是实际bom并未按此设计,根据实际的BOM明细以及ADC使用说明书,可以间接理解原设计者的设计初衷,是将ADC的一部分特性…

CatBoost 完整解析:类别特征友好的梯度提升框架

1️⃣ 什么是 CatBoost&#xff1f;CatBoost&#xff08;Categorial Boosting&#xff09;是由 Yandex&#xff08;俄罗斯搜索引擎公司&#xff09;开源的梯度提升框架&#xff0c;专为类别特征处理优化。核心特点&#xff1a;无需手动 one-hot / LabelEncoding&#xff0c;原生…

NDBmysql-cluster集群部署脚本

NDB(Network Database)是MySQL Cluster的核心存储引擎,专为高可用性、高吞吐量、分布式数据存储设计,采用内存计算+磁盘持久化架构,支持跨节点数据分片与自动冗余,适用于对实时性和可靠性要求严苛的业务场景(如金融交易、电信计费、实时分析等)。 今天大白鼠就分享构建…

计算机网络中的socket是什么?编程语言中的socket编程又是什么?python的socket编程又该如何用?

1. 计算机网络中的 Socket 是什么&#xff1f; 想象一下电话系统&#xff1a; 电话插座 (Socket)&#xff1a; 是墙上的一个物理接口&#xff0c;它本身不是通话&#xff0c;但它是建立通话连接的端点。你需要把电话线插进插座才能打电话。通话 (Connection)&#xff1a; 是两台…

【科普】进程与线程的区别

一、定义与概念&#xff1a;进程&#xff1a;进程是执行中的一段程序。一旦程序被载入到内存中并准备执行&#xff0c;就变成了一个进程。进程是表示资源分配的基本概念&#xff0c;又是调度运行的基本单位&#xff0c;是系统中的并发执行的单位。线程&#xff1a;线程是进程中…

Conda创建虚拟环境,解决不同项目的冲突!

随着需求的增多&#xff0c;又要增加多几个不同的项目来在本地测试&#xff0c;这个时候往往就会遇到 不同项目的Python版本不同等等一系列问题&#xff0c;只好请出Conda来帮忙。 一、先去下载安装一下Conda Conda | Anaconda.org 安装完后&#xff0c;需要给CONDA做个环境变…

RK3568下的进程间广播通信:用C语言构建简单的中心服务器

最近的项目中需要实现这样一个功能,就是一个进程A发消息,进程B和进程C都能收到相同的消息,同样,进程B发消息,进程A和进程C也都能收到消息,就像下图中的描述。 使用一个中心服务器作为消息转发枢纽,所有客户端连接到服务器,发送消息到服务器后,服务器再将消息转发给所有…

激光雷达/相机一体机 时间同步和空间标定(1)

一、参考链接 海康威视、LIVOX与PTP时间同步_海康相机ptp同步-CSDN博客 基于PTP实现主机与相机系统时钟同步功能_ptp同步-CSDN博客

嵌入式系统的中断控制器(NVIC)

1. NVIC的核心功能 核心价值&#xff1a;NVIC通过硬件级中断管理、自动状态处理及低延迟优化&#xff0c;为实时系统提供确定性响应&#xff0c;是Cortex-M芯片实时性的基石。 中断优先级管理 支持多级可编程优先级&#xff08;通常4-8位&#xff0c;如STM32用4位实现16级优先级…

【源力觉醒 创作者计划】2025年国产AI模型深度测评:文心大模型4.5、DeepSeek、Qwen3能力大比拼

文章目录引言&#xff1a;AI大模型的新时代一、模型架构与技术生态对比1. 文心大模型4.5系列2. DeepSeek3. 通义千问&#xff08;Qwen 3.0&#xff09;二、语言理解能力实测2.1 情感分析测试2.1.1 文心一言的表现2.1.2 DeepSeek的表现2.1.3 Qwen 3.0的表现2.1.4 测试结果分析2.…

从C++0基础到C++入门(第十五节:switch语句)

一. switch语句1.1 语法结构如下&#xff1a;switch (表达式) {case 常量1:// 代码块1break;case 常量2:// 代码块2break;default:// 默认代码块 }1.2 注意 &#xff1a;表达式必须是整型或枚举类型&#xff08;如int、char&#xff09;。case后的常量必须与表达式类型兼容。学…

编程与数学 03-002 计算机网络 16_网络编程基础

编程与数学 03-002 计算机网络 16_网络编程基础一、网络编程的基本概念&#xff08;一&#xff09;客户端与服务器模型&#xff08;二&#xff09;套接字&#xff08;Socket&#xff09;编程的基本原理二、基于TCP的网络编程&#xff08;一&#xff09;TCP套接字的创建与使用&a…

在纯servlet项目中,使用@WebFilter定义了多个filter,如何设置filter的优先级

在纯 Servlet 项目中&#xff0c;WebFilter 注解本身并不提供直接的属性来设置过滤器的优先级&#xff08;如过滤器执行的顺序&#xff09;。但是&#xff0c;你可以通过以下几种方式来控制过滤器的执行顺序&#xff1a;1. 通过 web.xml 配置过滤器的顺序在 web.xml 中&#xf…

关于鸦片战争的历史

19世纪&#xff0c;英国东印度公司获得了鸦片贸易的垄断权&#xff0c;而犹太人是东印度公司的主要投资人之一&#xff0c;英国东印度公司又将鸦片经营权外包给了犹太人。其中&#xff0c;塞法迪犹太人控制了主要的鸦片交易&#xff0c;著名的沙逊家族就是当时臭名昭著的犹太鸦…

Maven - 并行安全无重复打包构建原理揭秘

作者&#xff1a;唐叔在学习 专栏&#xff1a;唐叔的Java实践 标签&#xff1a; #Maven并行构建 #Maven多线程打包 #Java构建优化 #Maven性能调优 #CI/CD加速 #Maven反应堆原理 #避免重复编译 #高并发构建 文章目录一、遇到问题&#xff1a;并行打包会不会翻车&#xff1f;二、…

phpyun人才系统v7.1使用升级补丁怎么从授权版升级至vip版?我说下我的技巧有资源的可以看过来,这样就不用花钱麻烦官方了,新版本照样支持小程序源码

前:这个方法我只在Phpyun 的7.x系列使用过&#xff0c;低于这个版本的我暂时没有研究过&#xff0c;我感觉大同小异&#xff01; 一. 升级前提条件 无论现在你使用的是商业版还是学习版 想垮系列升级你必须有对应的升级补丁&#xff0c;比如说你是授权版或旗舰版 想升级到最新的…

P13014 [GESP202506 五级] 最大公因数

题目描述对于两个正整数 a,b&#xff0c;他们的最大公因数记为 gcd(a,b)。对于 k>3 个正整数 c1​,c2​,…,ck​&#xff0c;他们的最大公因数为&#xff1a;gcd(c1​,c2​,…,ck​)gcd(gcd(c1​,c2​,…,ck−1​),ck​)给定 n 个正整数 a1​,a2​,…,an​ 以及 q 组询问。对…

【机器学习-4】 | 集成学习 / 随机森林篇

集成学习与随机森林学习笔记 0 序言 本文将系统介绍Bagging、Boosting两种集成学习方法及随机森林算法&#xff0c;涵盖其原理、过程、参数等内容。通过学习&#xff0c;你能理解两种方法的区别&#xff0c;掌握随机森林的随机含义、算法步骤、优点及关键参数使用&#xff0c;明…

深入 Go 底层原理(十二):map 的实现与哈希冲突

1. 引言map 是 Go 语言中使用频率极高的数据结构&#xff0c;它提供了快速的键值对存取能力。虽然 map 的使用非常简单&#xff0c;但其底层的实现却是一个精心设计的哈希表&#xff0c;它需要高效地处理哈希计算、数据存储、扩容以及最关键的——哈希冲突。本文将解剖 map 的底…