Vue框架之模板语法全面解析

    • 一、模板语法的核心思想
    • 二、插值表达式:数据渲染的基础
      • 2.1 基本用法:渲染文本
      • 2.2 纯HTML渲染:`v-html`指令
      • 2.3 一次性插值:`v-once`指令
    • 三、指令系统:控制DOM的行为
      • 3.1 条件渲染:`v-if`与`v-show`
        • 3.1.1 `v-if`:动态创建/销毁元素
        • 3.1.2 `v-else`与`v-else-if`:条件分支
        • 3.1.3 `v-show`:动态显示/隐藏元素
        • 3.1.4 `v-if`与`v-show`的区别
      • 3.2 列表渲染:`v-for`
        • 3.2.1 遍历数组
        • 3.2.2 遍历对象
        • 3.2.3 `key`属性的重要性
      • 3.3 属性绑定:`v-bind`
        • 3.3.1 基础用法
        • 3.3.2 绑定class的特殊用法
        • 3.3.3 绑定style的特殊用法
      • 3.4 事件绑定:`v-on`
        • 3.4.1 基础用法
        • 3.4.2 传递事件参数
        • 3.4.3 事件修饰符
      • 3.5 表单绑定:`v-model`
        • 3.5.1 文本框与文本域
        • 3.5.2 复选框与单选框
        • 3.5.3 下拉框
        • 3.5.4 修饰符
    • 四、模板语法的进阶技巧
      • 4.1 计算属性:`computed`
      • 4.2 侦听器:`watch`
      • 4.3 模板中的注释
    • 五、常见问题与避坑指南
      • 5.1 插值表达式不能使用语句
      • 5.2 `v-for`与`v-if`同时使用的陷阱
      • 5.3 响应式数据更新不触发视图

Vue的模板语法是连接数据与视图的桥梁,它允许我们开发者以声明式的方式将数据渲染到DOM中,同时支持丰富的指令和表达式,掌握模板语法是使用Vue开发页面的基础,本文我将从插值表达式、指令系统、事件处理到表单绑定,系统解析Vue模板语法的核心知识点,并结合实例演示其用法。

一、模板语法的核心思想

Vue的模板语法基于HTML扩展,核心思想是声明式渲染:开发者只需关注“数据应该如何展示”,而无需手动操作DOM。模板中的特殊语法会被Vue编译器处理,最终转换为渲染函数,生成对应的DOM节点。

<!-- 示例:声明式渲染 -->
<div id="app"><h1>{{ message }}</h1>
</div><script>
const app = new Vue({el: '#app',data() {return {message: 'Hello Vue Template!'}}
});
</script>

上述代码中,{{ message }}是模板语法的核心——插值表达式,它会将Vue实例中的message数据实时渲染到页面中。当message的值变化时,页面会自动更新,这就是Vue的响应式渲染特性。

二、插值表达式:数据渲染的基础

插值表达式是模板中最基础的语法,用于将数据插入到DOM中,语法为{{ 表达式 }}

2.1 基本用法:渲染文本

<div id="app"><!-- 直接渲染变量 --><p>姓名:{{ name }}</p><!-- 渲染表达式结果 --><p>年龄+1:{{ age + 1 }}</p><!-- 渲染函数返回值 --><p>大写姓名:{{ name.toUpperCase() }}</p><!-- 三元表达式 --><p>是否成年:{{ age >= 18 ? '是' : '否' }}</p>
</div><script>
new Vue({el: '#app',data() {return {name: 'zhangsan',age: 20}}
});
</script>

特性

  • 支持JavaScript表达式(如+toUpperCase()、三元运算),但不能写语句(如iffor);
  • 数据变化时自动更新(响应式);
  • 会自动转义HTML(防止XSS攻击),例如{{ '<h1>标题</h1>' }}会渲染为纯文本,而非HTML标签。

2.2 纯HTML渲染:v-html指令

如果需要渲染包含HTML标签的字符串,需使用v-html指令(注意XSS风险):

<div id="app"><!-- 插值表达式:转义HTML --><p>{{ rawHtml }}</p> <!-- 输出:<span style="color: red">红色文本</span> --><!-- v-html:渲染为HTML --><p v-html="rawHtml"></p> <!-- 输出:红色文本(实际为红色) -->
</div><script>
new Vue({el: '#app',data() {return {rawHtml: '<span style="color: red">红色文本</span>'}}
});
</script>

注意

  • v-html会覆盖元素的子节点;
  • 动态渲染HTML存在XSS风险,仅在内容完全可信时使用;
  • 不能用于单文件组件(SFC)的模板根节点。

2.3 一次性插值:v-once指令

如果数据只需渲染一次,后续变化不再更新,可使用v-once

<div id="app"><p v-once>初始值:{{ message }}</p><p>实时值:{{ message }}</p><button @click="message = '新值'">修改值</button>
</div><script>
new Vue({el: '#app',data() {return {message: '初始值'}}
});
</script>

点击按钮后,v-once所在的段落仍显示“初始值”,而另一段落会更新为“新值”。

三、指令系统:控制DOM的行为

Vue提供了一系列内置指令(以v-为前缀),用于控制DOM的行为,如条件渲染、列表渲染、事件绑定等。

3.1 条件渲染:v-ifv-show

3.1.1 v-if:动态创建/销毁元素

v-if根据表达式的真假,动态创建或销毁元素(完全从DOM中移除):

<div id="app"><p v-if="isShow">这是v-if控制的内容</p><button @click="isShow = !isShow">切换显示</button>
</div><script>
new Vue({el: '#app',data() {return {isShow: true}}
});
</script>
3.1.2 v-elsev-else-if:条件分支
<div id="app"><p v-if="score >= 90">优秀</p><p v-else-if="score >= 60">及格</p><p v-else>不及格</p>
</div><script>
new Vue({el: '#app',data() {return {score: 85}}
});
</script>
3.1.3 v-show:动态显示/隐藏元素

v-show通过CSS的display属性控制元素显示(display: none),元素始终存在于DOM中:

<div id="app"><p v-show="isShow">这是v-show控制的内容</p><button @click="isShow = !isShow">切换显示</button>
</div>
3.1.4 v-ifv-show的区别
特性v-ifv-show
原理动态创建/销毁DOM元素通过display: none控制显示
初始渲染成本条件为假时,无渲染成本无论条件真假,都有初始渲染成本
切换成本较高(涉及DOM操作)较低(仅修改CSS)
适用场景条件很少切换(如权限控制)条件频繁切换(如标签页切换)

3.2 列表渲染:v-for

v-for用于循环渲染列表数据,支持数组、对象、字符串和数字,语法为v-for="(item, index) in items"

3.2.1 遍历数组
<div id="app"><ul><!-- 遍历数组:(元素, 索引) --><li v-for="(item, index) in fruits" :key="item.id">{{ index + 1 }}. {{ item.name }} - 价格:{{ item.price }}元</li></ul>
</div><script>
new Vue({el: '#app',data() {return {fruits: [{ id: 1, name: '苹果', price: 5 },{ id: 2, name: '香蕉', price: 3 },{ id: 3, name: '橙子', price: 4 }]}}
});
</script>
3.2.2 遍历对象
<div id="app"><ul><!-- 遍历对象:(值, 键名, 索引) --><li v-for="(value, key, index) in user" :key="key">{{ index + 1 }}. {{ key }}: {{ value }}</li></ul>
</div><script>
new Vue({el: '#app',data() {return {user: {name: '张三',age: 25,gender: '男'}}}
});
</script>
3.2.3 key属性的重要性

v-for渲染列表时,必须添加key属性(唯一标识),Vue通过key识别元素的身份,优化DOM更新性能:

<!-- 错误:无key(不推荐) -->
<li v-for="item in list">{{ item }}</li><!-- 正确:使用唯一key(推荐) -->
<li v-for="item in list" :key="item.id">{{ item.name }}</li>

注意

  • key的值必须唯一,不能重复;
  • 不要用index作为key(数组排序、删除元素时会导致身份错乱);
  • 推荐使用数据的唯一ID作为key(如后端返回的id)。

3.3 属性绑定:v-bind

v-bind用于动态绑定HTML属性,语法为v-bind:属性名="表达式",可简写为:属性名

3.3.1 基础用法
<div id="app"><!-- 绑定src属性 --><img :src="imgUrl" alt="图片"><!-- 绑定class属性 --><div :class="boxClass">这是一个div</div><!-- 绑定style属性 --><p :style="textStyle">这是带样式的文本</p><!-- 绑定自定义属性 --><div :data-id="itemId"></div>
</div><script>
new Vue({el: '#app',data() {return {imgUrl: 'https://picsum.photos/200',boxClass: 'container active',textStyle: {color: 'red',fontSize: '16px'},itemId: 123}}
});
</script>
3.3.2 绑定class的特殊用法

class属性支持对象和数组语法,动态控制类名:

<div id="app"><!-- 对象语法:{ 类名: 布尔值 } --><div :class="{ active: isActive, 'text-danger': hasError }"></div><!-- 数组语法:[类名1, 类名2] --><div :class="[baseClass, isActive ? 'active' : '']"></div>
</div><script>
new Vue({el: '#app',data() {return {isActive: true,hasError: false,baseClass: 'container'}}
});
</script>
3.3.3 绑定style的特殊用法

style属性支持对象和数组语法,动态控制样式:

<div id="app"><!-- 对象语法:{ CSS属性: 值 }(注意驼峰命名) --><div :style="{ color: textColor, fontSize: fontSize + 'px' }"></div><!-- 数组语法:[样式对象1, 样式对象2] --><div :style="[baseStyle, highlightStyle]"></div>
</script><script>
new Vue({el: '#app',data() {return {textColor: 'blue',fontSize: 16,baseStyle: { padding: '10px' },highlightStyle: { backgroundColor: 'yellow' }}}
});
</script>

3.4 事件绑定:v-on

v-on用于绑定事件监听器,语法为v-on:事件名="处理函数",可简写为@事件名

3.4.1 基础用法
<div id="app"><!-- 绑定点击事件 --><button @click="handleClick">点击我</button><!-- 绑定输入事件 --><input @input="handleInput" placeholder="输入内容"><!-- 直接执行表达式 --><button @click="count++">计数器:{{ count }}</button>
</div><script>
new Vue({el: '#app',data() {return {count: 0}},methods: {handleClick() {alert('按钮被点击了');},handleInput(e) {console.log('输入内容:', e.target.value); // e是原生事件对象}}
});
</script>
3.4.2 传递事件参数
<div id="app"><!-- 无参数:默认传递事件对象e --><button @click="handleClick">无参数</button><!-- 传递自定义参数:需手动传递$event获取原生事件对象 --><button @click="handleClickWithParams('参数1', $event)">带参数</button>
</div><script>
new Vue({el: '#app',methods: {handleClick(e) {console.log('事件对象:', e);},handleClickWithParams(param, e) {console.log('参数:', param);console.log('事件对象:', e);}}
});
</script>
3.4.3 事件修饰符

Vue提供了事件修饰符,简化事件处理(如阻止默认行为、阻止冒泡):

<div id="app"><!-- .prevent:阻止默认行为(如表单提交) --><form @submit.prevent="handleSubmit"><button type="submit">提交</button></form><!-- .stop:阻止事件冒泡 --><div @click="parentClick"><button @click.stop="childClick">点击</button></div><!-- .once:事件只触发一次 --><button @click.once="handleOnce">只触发一次</button>
</div><script>
new Vue({el: '#app',methods: {handleSubmit() {console.log('表单提交');},parentClick() {console.log('父元素事件');},childClick() {console.log('子元素事件');},handleOnce() {console.log('只触发一次');}}
});
</script>

常用事件修饰符:

  • .prevent:阻止默认行为(如e.preventDefault());
  • .stop:阻止事件冒泡(如e.stopPropagation());
  • .once:事件只触发一次;
  • .self:仅当事件目标是元素自身时触发;
  • .enter:仅在按键为Enter时触发(键盘事件专用)。

3.5 表单绑定:v-model

v-model用于在表单元素(输入框、复选框等)与数据之间创建双向绑定,本质是v-bind绑定valuev-on监听input事件的语法糖。

3.5.1 文本框与文本域
<div id="app"><!-- 单行文本框 --><input v-model="username" placeholder="用户名"><p>用户名:{{ username }}</p><!-- 多行文本域(与单行用法一致,无需使用textarea的value属性) --><textarea v-model="message" rows="3" placeholder="留言"></textarea><p>留言:{{ message }}</p>
</div><script>
new Vue({el: '#app',data() {return {username: '',message: ''}}
});
</script>
3.5.2 复选框与单选框
<div id="app"><!-- 单选框(v-model绑定选中的值) --><div><label><input type="radio" v-model="gender" value="male"></label><label><input type="radio" v-model="gender" value="female"></label><p>性别:{{ gender }}</p></div><!-- 复选框(单个:绑定布尔值) --><div><label><input type="checkbox" v-model="isAgree"> 同意协议</label><p>是否同意:{{ isAgree }}</p></div><!-- 复选框(多个:绑定数组,value为选中的值) --><div><label><input type="checkbox" v-model="hobbies" value="reading"> 阅读</label><label><input type="checkbox" v-model="hobbies" value="sports"> 运动</label><p>爱好:{{ hobbies }}</p></div>
</div><script>
new Vue({el: '#app',data() {return {gender: 'male',isAgree: false,hobbies: []}}
});
</script>
3.5.3 下拉框
<div id="app"><!-- 单选下拉框 --><select v-model="selectedCity"><option value="">请选择城市</option><option value="beijing">北京</option><option value="shanghai">上海</option></select><p>选中城市:{{ selectedCity }}</p><!-- 多选下拉框(添加multiple属性,v-model绑定数组) --><select v-model="selectedCities" multiple><option value="beijing">北京</option><option value="shanghai">上海</option><option value="guangzhou">广州</option></select><p>选中城市:{{ selectedCities }}</p>
</div><script>
new Vue({el: '#app',data() {return {selectedCity: '',selectedCities: []}}
});
</script>
3.5.4 修饰符

v-model提供了修饰符,处理表单数据:

  • .trim:自动去除首尾空格;
  • .number:将输入值转为数字(无法转换时保留字符串);
  • .lazy:在change事件(而非input)时更新数据(适合输入完成后验证)。
<div id="app"><input v-model.trim="username" placeholder="自动去空格"><input v-model.number="age" placeholder="仅数字"><input v-model.lazy="search" placeholder="失去焦点后更新">
</div>

四、模板语法的进阶技巧

4.1 计算属性:computed

当模板中的表达式逻辑复杂时,推荐使用计算属性(computed),它具有缓存特性,依赖数据不变时不会重新计算。

<div id="app"><p>原始价格:{{ price }}</p><p>折扣价(9折):{{ discountedPrice }}</p><p>折扣价(8折):{{ getDiscountedPrice(0.8) }}</p>
</div><script>
new Vue({el: '#app',data() {return {price: 100}},computed: {// 计算属性(缓存)discountedPrice() {console.log('计算属性执行');return this.price * 0.9;}},methods: {// 方法(无缓存,每次调用都执行)getDiscountedPrice(discount) {console.log('方法执行');return this.price * discount;}}
});
</script>

计算属性 vs 方法

  • 计算属性:依赖数据变化时才重新计算,适合频繁访问且逻辑复杂的场景;
  • 方法:每次调用都执行,适合需要动态参数的场景。

4.2 侦听器:watch

watch用于监听数据变化,执行异步或复杂逻辑(如数据变化后发送请求)。

<div id="app"><input v-model="username" placeholder="输入用户名">
</div><script>
new Vue({el: '#app',data() {return {username: ''}},watch: {// 监听username变化username(newVal, oldVal) {console.log(`用户名从${oldVal}变为${newVal}`);// 模拟异步请求(如验证用户名是否已存在)clearTimeout(this.timer);this.timer = setTimeout(() => {console.log(`验证用户名:${newVal}`);}, 500);}}
});
</script>

4.3 模板中的注释

Vue模板支持HTML注释和Vue特有的注释(不会被渲染到DOM中):

<div id="app"><!-- 这是HTML注释,会被渲染到DOM中 -->{{ /* 这是Vue注释,不会被渲染 */ }}
</div>

五、常见问题与避坑指南

5.1 插值表达式不能使用语句

<!-- 错误:模板表达式不能用if语句 -->
<p>{{ if (isShow) { return '显示' } else { return '隐藏' } }}</p><!-- 正确:用三元表达式 -->
<p>{{ isShow ? '显示' : '隐藏' }}</p>

5.2 v-forv-if同时使用的陷阱

不建议在同一元素上同时使用v-forv-if,因为v-for的优先级高于v-if,会导致每次循环都执行条件判断,影响性能。

错误示例

<!-- 不推荐:每次循环都判断 -->
<li v-for="item in list" v-if="item.isActive" :key="item.id">{{ item.name }}
</li>

正确示例:先过滤数据,再循环

<!-- 推荐:先过滤数据 -->
<li v-for="item in activeItems" :key="item.id">{{ item.name }}
</li><script>
new Vue({computed: {activeItems() {return this.list.filter(item => item.isActive);}}
});
</script>

5.3 响应式数据更新不触发视图

Vue的响应式系统依赖Object.defineProperty(Vue 2),直接修改数组索引或对象属性可能不会触发视图更新:

// 错误:直接修改数组索引
this.list[0] = '新值'; // 视图不更新// 正确:使用Vue提供的方法或重新赋值
this.list.splice(0, 1, '新值'); // 或 this.list = [...this.list, 新值]// 错误:直接添加对象属性
this.user.age = 25; // 视图不更新// 正确:使用Vue.set或重新赋值
this.$set(this.user, 'age', 25); // 或 this.user = { ...this.user, age: 25 }

总结:Vue的模板语法是其声明式编程模型的核心,通过简洁的语法将数据与视图关联

  • 简化DOM操作:无需手动操作DOM,专注数据逻辑;
  • 响应式更新:数据变化自动同步到视图;
  • 丰富的指令v-ifv-forv-model等指令覆盖常见场景;
  • 灵活的扩展:计算属性、侦听器处理复杂逻辑。

若这篇内容帮到你,动动手指支持下!关注不迷路,干货持续输出!
ヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノ

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

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

相关文章

从零开始的语言模型构建 CS336 第一课(一)

语言模型的发展历史 &#x1f3d7; Early foundation models (2010年代后期) 2018&#xff1a;ELMo&#xff08;基于 LSTM 预训练 微调&#xff09;[Peters 2018]2018&#xff1a;BERT&#xff08;基于 Transformer 预训练 微调&#xff09;[Devlin 2018]2019&#xff1a;G…

微信获取access_token授权的两种不同情况

1.网页授权&#xff1a;需要页面调用授权的sdk&#xff0c;首先需要获取到code参数 &#xff08;A.网页版的获取code参考另一篇文章&#xff1a;https://blog.csdn.net/ettamei/article/details/148763361?spm1011.2415.3001.5331 B.前端sdk提供&#xff1a;code只有5分钟的有…

达梦数据库windows静默安装

<DATABASE> <!-- 安装数据库的语言配置&#xff0c;简体中文版: ZH&#xff0c;繁体中文版: CHT&#xff0c;英文版: EN&#xff0c;不区分大小写。不允许为空 --> <LANGUAGE>ZH</LANGUAGE> <!-- 安装程序的时区配置&#xff0c;缺省为08:00&#…

20250709荣品RD-RK3588开发板的Android13系统下修改为连续长按10s开机

20250709荣品RD-RK3588开发板的Android13系统下修改为连续长按10s开机 2025/7/9 10:11缘起&#xff1a;由于荣品RD-RK3588开发板使用的PMIC是RK806。 以前在荣品PRO-RK3566开发板上使用的PMIC是RK809上做过了长按开机的。 直接迁移过来了&#xff01;1、根据RK809的DATASHEET&a…

20250713-`Seaborn.pairplot` 的使用注意事项

Seaborn.pairplot 的使用注意事项 sns.pairplot 是 Seaborn 中最常用、最强大的探索性数据分析&#xff08;EDA&#xff09;函数之一。 它在一个调用里就能同时展示&#xff1a; 任意两两变量间的 散点图&#xff08;观察关系、聚类、异常值&#xff09;对角线上每个变量的 单…

如何选择合适的AI论文写作工具?七个AI英文论文写作网站

在写作英文论文时&#xff0c;许多人往往会遇到写作思路卡壳、语言不流畅、重复率过高等问题。幸运的是&#xff0c;AI论文写作工具的出现&#xff0c;极大地提升了写作效率和质量。这些工具不仅可以帮你快速生成内容、扩展论点&#xff0c;还可以优化语言&#xff0c;帮助你顺…

【保姆级喂饭教程】idea中安装Conventional Commit插件

目录前言一、安装二、测试前言 之前了解到了Conventional Commit规范&#xff0c;idea中好像没什么钩子工具&#xff0c;测试一下Conventional Commit插件吧 一、安装 点击file-settings 点击plugins插件&#xff0c;搜索Conventional Commit&#xff0c;点击install安装&…

# 电脑每次重启都自动启动惠普安装程序,怎么取消?

电脑每次重启都自动启动惠普安装程序&#xff0c;怎么取消&#xff1f; 一、通过任务管理器禁用&#xff1a; 1&#xff09;右键点击任务栏上的空白区域&#xff0c;选择 “任务管理器”。 2&#xff09;在任务管理器窗口中&#xff0c;点击顶部菜单栏上的 “启动” 选项卡。 3…

QT遇到过的样式记录

此帖主要记录平常工程里遇到的qt样式 窗口无边框 原始文档 void QWidget::setWindowFlag(Qt::WindowType flag, bool on true) Sets the window flag flag on this widget if on is true; otherwise clears the flag. This function was introduced in Qt 5.9. See also se…

软件设计师中级概念题

软件过程模型 1. 瀑布模型&#xff1a; 五个阶段&#xff1a;需求分析、设计、编码、测试、运行与维护。 为软件的开发和维护提供了一种有效的管理模式&#xff0c;它是以文档作为驱动、合适于软件需求很明确的软件项目模型。瀑布模型假设&#xff0c;一个待开发的系统需求是完…

Elasticsearch安装、入门、基础API操作、全文检索、精准查询、地理查询、复合查询、排序、分页、高亮、数据聚合、自动补全、数据同步、ES集群

学习资料&#xff1a; 通过网盘分享的文件&#xff1a;Elasticsearch 链接: https://pan.baidu.com/s/18BxA0BH0G–jwy95uFmFZQ 提取码: yyds 初识ES正向索引倒排索引ES与MySQL 概念对比安装ES操作索引库mapping属性创建索引库{"mappings": {"properties":…

教程:如何查看浏览器扩展程序的源码

在学习前端、自动化或扩展开发时&#xff0c;我们常常会想研究某个浏览器插件的实现逻辑。即使扩展没有公开源码&#xff0c;只要我们本地安装了它&#xff0c;就可以查看它的完整源代码进行学习。✅ 方法一&#xff1a;从浏览器插件目录提取源码 第一步&#xff1a;打开扩展程…

虚拟储能与分布式光伏协同优化:新型电力系统的灵活性解决方案

安科瑞顾强摘要&#xff1a; 在全球能源结构向低碳化、智能化加速转型的背景下&#xff0c;分布式光伏的大规模接入为电力系统带来机遇的同时&#xff0c;也因其波动性与间歇性带来了运行挑战。本文聚焦于虚拟储能系统&#xff08;Virtual Energy Storage System, VESS&#xf…

java valueOf方法

一,什么是valueOf方法?valueOf是java包装类(比如Long,Integer等)中提供的一个静态方法二,valueOf的主要作用是什么主要作用是将其他类型的数据转换为当前包装类的对象三,代码实例:咱们以Long.valueOf为例,1,他可以接受一个long类型的数值,返回对应的Long对象(把基本类型long包…

工业平板电脑 vs 消费级平板:从防护等级到使用寿命全方面对比

平板电脑已经广泛应用于各个行业。但你知道吗&#xff1f;市面上常见的“平板”其实可以分为两大类&#xff1a;工业平板电脑和消费级平板电脑。虽然它们看起来都是“平板”&#xff0c;但用途、性能和适用场景却大不相同。今天&#xff0c;我们就来聊聊这两者的区别&#xff0…

MySQL技术笔记-索引+慢 SQL+锁 全链路优化实战

目录 前言 MySQL索引 一、概述 二、索引分类 &#xff08;一&#xff09;按功能特性分类 &#xff08;二&#xff09;按存储方式分类 &#xff08;三&#xff09;按数据结构分类 &#xff08;四&#xff09;按索引字段数量分类 三、索引的优缺点 &#xff08;一&…

S7-1200 与 S7-300 PNS7-400 PN UDP 通信 TIA 相同项目

7-1200 与 S7-300 PN/S7-400 PN UDP 通信 TIA 相同项目S7-1200 与 S7-300 PN 口之间的以太网通信可以通过 UDP 协议来实现&#xff0c;使用的通信指令是在双方 CPU 调用通信-开放式用户通信TSEND_C&#xff0c;TRCV_C&#xff08;1200支持&#xff0c;300不支持&#xff09;或T…

java进阶(二)+学习笔记

面向对象设计原则1. 面向对象概念面向对象 是一种编程思想&#xff0c;面向过程是关注实现的步骤&#xff0c;每个步骤定义一个函数&#xff0c;调用函数执行即可。面向对象关注的是谁(对象)来执行&#xff0c; 把具有相同属性和行为的一类事物(对象)进行抽象成类&#…

[附源码+数据库+毕业论]基于Spring Boot+mysql+vue结合内容推荐算法的学生咨询系统

摘要 随着互联网的普及&#xff0c;学生在学习和生活中面临着海量信息&#xff0c;如何高效获取有价值的内容成为亟待解决的问题。本文基于 Spring Boot 框架&#xff0c;结合内容推荐算法&#xff0c;设计并实现了一个学生咨询系统。系统采用 Spring Boot MyBatis MySQL Vu…

DeepSeek 微调实践:DeepSeek-R1 大模型基于 MS-Swift 框架部署 / 推理 / 微调实践大全

注&#xff1a;此文章内容均节选自充电了么创始人&#xff0c;CEO兼CTO陈敬雷老师的新书《GPT多模态大模型与AI Agent智能体》&#xff08;跟我一起学人工智能&#xff09;【陈敬雷编著】【清华大学出版社】 GPT多模态大模型与AI Agent智能体书籍本章配套视频课程【陈敬雷】 文…