Vue3全家桶 - Vue3 - 【3】模板语法(指令+修饰符 + v-model语法糖)
一、模板语法
- 主要还是记录一些指令的使用和vue2的区别;
- vue3指令导航;
1.1 v-text 和 v-html
- 指令的区别:
- v-text:
- 更新元素的文本内容;
v-text通过设置元素的 textContent 属性来工作,因此它将覆盖元素中所有现有的内容。如果你需要更新textContent的部分,应该使用 mustache interpolations 代替。- 不能解析标签;
- v-html:
- 更新元素的
innerHTML; v-html的内容直接作为普通 HTML 插入—— Vue 模板语法是不会被解析的。如果你发现自己正打算用v-html来编写模板,不如重新想想怎么使用组件来代替。- 可以解析标签;
- 在单文件组件,
scoped样式将不会作用于v-html里的内容,因为 HTML 内容不会被 Vue 的模板编译器解析。如果你想让v-html的内容也支持 scoped CSS,你可以使用 CSS modules 或使用一个额外的全局<style>元素,手动设置类似 BEM 的作用域策略。
- 更新元素的
- v-text:
- vue2:这两个指令的使用的时候,没什么需要注意的地方,即使标签里面有内容,也可以正常使用和在浏览器中正常显示内容;
- vue3:绑定指令的元素必须是空标签,如果该标签里面有内容或其他标签,都会报错;
- 相比vue2,vue3源码在这两个指令绑定的时候去做了进一步的处理;

- 相比vue2,vue3源码在这两个指令绑定的时候去做了进一步的处理;
1.2 v-model
- 注意:
- 一般情况下,
v-model指令用在表单元素中; - 文本类型的
input、textarea会绑定元素的value属性并侦听input事件; - 单选和复选
radio、checkbox会绑定元素的checked属性,并侦听change事件; - 下拉菜单
select会绑定元素的value属性,并侦听change事件;- 指令绑定在 select元素 上,给 子元素option 设置 value属性;
- 一般情况下,
- 示例展示:
<script setup>import { ref, reactive, toRef, toRefs, onMounted } from 'vue';let text = ref('111')let textarea = ref('222')let radio = ref('man')let open = ref(true)let determine = ref('确定')let checkbox = ref(['YMQ'])let select = ref('B')let selects = ref(['苏C', '苏B'])onMounted(() => {}); </script><template><h4>单行文本框</h4><input type="text" v-model="text"><hr><h4>多行文本框</h4><input type="textarea" v-model="textarea"><hr><h4>单选框</h4><input type="radio" value="man" v-model="radio"> 男<input type="radio" value="woman" v-model="radio"> 女<hr><h4>默认复选框</h4><input type="checkbox" name="" id="" v-model="open"> 灯<h4>自定义复选框的值</h4><!-- 默认状态下,复选框的值是 true / false ,既 open 的值为 true / false--><input type="checkbox" true-value="确定" false-value="不确定" v-model="determine"> 是否确定<!-- true-value - 表示选中状态下,既 determine 的值false-value - 表示未选中状态下,表示选中状态下,既 determine 的值--><hr><h4>复选框</h4><input type="checkbox" value="LQ" v-model="checkbox"> 篮球<input type="checkbox" value="ZQ" v-model="checkbox"> 足球<input type="checkbox" value="YMQ" v-model="checkbox"> 羽毛球<input type="checkbox" value="PPQ" v-model="checkbox"> 乒乓球<hr><h4>单选下拉菜单</h4>证书等级:<select v-model="select"><option value="C">初级</option><option value="B">中级</option><option value="A">高级</option></select><hr><h4>多选下拉菜单</h4>去过的城市:<select multiple v-model="selects"><!--NOTEmultiple - 规定可同时选择多个选项值 - 布尔值(写该属性表示true,不写表示false)--><option value="苏A">南京</option><option value="苏B">无锡</option><option value="苏C">徐州</option><option value="苏D">常州</option></select> </template>
1.3 v-if 和 v-for 的 优先级
- vue2:
v-for > v-if;
- vue3:
v-if > v-for;
1.4 v-for 循环 数组 和 对象
- 这块和 vue2 没啥区别,主要是我自己在 vue2 里面主要是配合数组使用(很少循环对象);
- 使用
v-for的时候,记得添加key; - 循环数组:
- 写法一:
v-for = "item in arr";item:数组的每一项元素;arr:需要循环的数组;
- 写法二:
v-for = "(item, index) in arr";item:数组的每一项元素;index:每一项元素对应的索引;arr:需要循环的数组;
- 写法一:
- 循环对象:
- 使用
v-for来遍历一个对象的所有属性,遍历的顺序 会基于该对象调用Object.keys()的 返回值 来决定; - 写法一:
v-for = "value in object";value:属性值;object:需要循环的对象;
- 写法二:
v-for = "(value, name) in object";value:属性值;name:属性名;object:需要循环的对象;
- 写法三:
v-for = "(value, name, index) in object";value:属性值;name:属性名;index:索引(Object.keys()的返回值中name对应的索引);object:需要循环的对象;
- 示例展示:
<script setup>import { reactive } from 'vue'let student = reactive({styNum: '007', // 学号name: 'Jack', // 名字age: 18 //年龄}) </script><template><h6>Object.keys() 的 返回值</h6><span>{{ Object.keys(student) }}</span><!-- value in objectvalue:属性值object:循环的对象--><h6>v-for 渲染对象, v-for="value in object"</h6><ul><li v-for="value in student" :key="value">{{ value }}</li></ul><hr><!-- (value, name) in objectvalue:属性值name:属性名object:循环的对象--><h6>v-for 渲染对象, v-for="(value, name) in object"</h6><ul><li v-for="(value, name) in student" :key="name">属性名:{{ name }} --- 属性值: {{ value }}</li></ul><hr><!-- (value, name, index) in objectvalue:属性值name:属性名index: 索引object:循环的对象--><h6>v-for 渲染对象, v-for="(value, name, index) in object"</h6><ul><li v-for="(value, name, index) in student" :key="name">属性名:{{ name }} --- 属性值: {{ value }} --- 索引:{{ index }}</li></ul> </template> - 效果展示:

- 使用
- 通过
key提高更新性能:- 当列表的数据变化时,默认情况下,
vue会尽可能的复用已存在的DOM元素,从而提升渲染的性能;但这种默认的性能优化策略,会导致有状态的列表无法被正确更新; - 为了给
vue一个提示,以便它能跟踪每个节点的身份,从而在保证有状态的列表被正确更新的前提下,提升渲染的性能;此时,需要为每项提供一个唯一的key属性: key的注意事项:key的类型 只能 是Number/String;key值必须具有 唯一性;- 建议循环的列表有一个属性当
key(该属性的值在此列表中唯一); - 不使用 索引 当
key; - 🔺 使用
v-for指令时一定要指定key的值;
- 示例展示:
<script setup>import { ref } from 'vue'// 课程let subject = ref([{ id: 1, name: 'Vue' },{ id: 2, name: 'Java' },{ id: 3, name: 'Hadoop' }])// 添加课程function addSubject() {// (数组最前面)添加subject.value.unshift({ id: 4, name: 'Python' })} </script><template><button @click.once="addSubject">添加课程(数组最前面)</button><h3>不使用key值</h3><ul><li v-for="sub in subject"><input type="checkbox">{{ sub }}</li></ul><hr><h3>使用索引当key值</h3><ul><li v-for="(sub, index) in subject" :key="index"><input type="checkbox">{{ sub }}</li></ul><hr><h3>使用列表属性当key值(该属性必须再此列表中唯一)</h3><ul><li v-for="sub in subject" :key="sub.id"><input type="checkbox">{{ sub }}</li></ul> </template> - 效果展示:
- 观察 不使用key + 使用索引作为key 的变化(会导致有状态的列表无法被正确的更新);

- 观察 不使用key + 使用索引作为key 的变化(会导致有状态的列表无法被正确的更新);
- 当列表的数据变化时,默认情况下,
1.5 键盘按键修饰符
- 这块和 vue2 没啥区别,主要是我自己在 vue2 里面就知道那么几个修饰符,所以在这里记录了一下;
- 按键别名:
.enter、.tab、.esc、.space、.up、.down、.left、.right、.delete(捕获Delete和Backspace两个按键); - 系统修饰符:
.ctrl、.alt、.shift、.meta; - 准确的修饰符:
.exact(添加了对应键位的修饰符,就必须按下对应的键位,否则事件不生效)(见【示例展示】); - 示例展示:
<script setup>// 弹出消息function showMessage(message) {window.alert(message)} </script><template>按下的键中包含 Enter 键事件: <input type="text" @keydown.enter="showMessage('你按下了 Enter 键')"><hr>按下的键中包含 Shift Enter 键事件:<input type="text" @keydown.enter.shift="showMessage('你按下了 Shift + Enter 键')"/><hr>按下的键只有 Shift Enter 键事件:<input type="text" @keydown.enter.shift.exact="showMessage('你只有按下了 Shift + Enter 键,这个事件才会触发')"/> </template>
1.6 鼠标按键修饰符
- 这块和 vue2 没啥区别,主要是我自己在 vue2 里面基本没遇到过,所以在这里记录了一下;
- 鼠标按键修饰符:
.left:鼠标左键;.middle:鼠标中键(滚轮键);.right:鼠标右键;
- 示例展示:
<!-- 脚本区域 --> <script setup>function showTest(text) {window.alert(text)} </script><!-- 视图区域 --> <template><!-- 鼠标右键按下 --><button @mousedown.right="showTest('按下的是鼠标右键')">鼠标右键按下</button><hr><!-- 点击时,采用的是鼠标中键 --><button @click.middle="showTest('按下的是鼠标中键')">点击时,采用的是鼠标中键</button><hr><!-- 鼠标左键按下 --><button @mousedown.left="showTest('按下的是鼠标左键')">鼠标左键按下</button> </template><!-- 样式区域 --> <style>button {border: none;padding: 15px 20px;}button:active {box-shadow: 0 0 5px grey;} </style>
二、vue2 和 vue3 v-model语法糖 区别
- vue3官网(组件 v-model);
- 在 vue2 中
v-mode语法糖 简写的代码:text和textarea:<Son :value="msg" @input="msg=$event.target.value" />;radio和checkbox:<Son :checked="msg" @change="msg=$event.target.checked" />;
- 在 vue3 中
v-model语法糖 有所调整:<Son :modelValue="msg" @update:modelValue="msg=$event" />;
- 示例展示:
- 父组件:
<script setup>import { ref } from 'vue'// NOTE 在使用 setup 语法糖的 单文件 里面导入组件的时候,无需注册,直接使用即可// TODO 导入组件import SonComponent from '@/components/SonComponent.vue'let searchText = ref('禁止摆烂-才浅') </script><template><!-- <son-component :modelValue="searchText" @update:modelValue="newVal => searchText = newVal"></son-component> --><son-component v-model="searchText"></son-component> </template> - 子组件:
<script setup>// NOTE 接受父组件传递的数据 - 接收数据有两种形式(数组 + 对象)defineProps({modelValue: {type: String,required: true}}) </script><template><input type="text" :value="modelValue" @input="$emit('update:modelValue', $event.target.value)"> </template>
- 父组件:
- 总结:
- vue3封装组件支持
v-model的时候:- 父传子
:modelValue传递数据; - 子传父
@update:modelValue触发事件,更新数据;
- 父传子
- vue2的
xxx.sync语法糖解析:- 父传子
:xxx; - 子传父
@update:xxx在vue3.0 使用v-model:xxx代替。
- 父传子
- vue3封装组件支持
相关文章:
Vue3全家桶 - Vue3 - 【3】模板语法(指令+修饰符 + v-model语法糖)
一、模板语法 主要还是记录一些指令的使用和vue2的区别;vue3指令导航; 1.1 v-text 和 v-html 指令的区别: v-text: 更新元素的文本内容;v-text 通过设置元素的 textContent 属性来工作,因此它将覆盖元素…...
OpenCV开发笔记(七十七):相机标定(二):通过棋盘标定计算相机内参矩阵矫正畸变摄像头图像
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/136616551 各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究 红胖子(红模仿)的博…...
2024蓝桥杯每日一题(时间日期)
一、第一题:日期差值 解题思路:模拟 写一个计算时间的板子两者相减 【Python程序代码】 mon [0,31,28,31,30,31,30,31,31,30,31,30,31] def pd(x):if x%4000 or (x%40 and x%100!0):return Truereturn False def get_day(y,m,d):res 0for i …...
js【详解】事件
给 DOM 节点绑定事件 推荐使用 addEventListener 函数 第一个参数:事件名称第二个参数:事件处理函数(第一个参数为 event)第三个参数: true 采用捕获法来处理事件false 【推荐】采用冒泡法来处理事件 let div1 docu…...
webpack5基础--14_优化css
Css 处理 提取 Css 成单独文件 Css 文件目前被打包到 js 文件中,当 js 文件加载时,会创建一个 style 标签来生成样式 这样对于网站来说,会出现闪屏现象,用户体验不好 我们应该是单独的 Css 文件,通过 link 标签加载…...
Skywalking(9.7.0) 告警配置
图片被吞,来这里看吧:https://juejin.cn/post/7344567669893021736 过年前一天发版,大家高高兴兴准备回家过年去了。这时候老板说了一句,记得带上电脑,关注用户反馈。有紧急问题在高速上都得给我找个服务区改好。 但是…...
删除、创建、验证Kafka安装自带的__consumer_offsets topic
删除Kafka自带Topic 一般情况下,你删除Kafka自带的__consumer_offsets topic,会报错提示不能删除。 倔强的你直接找到zookeeper删掉了它,list查看确实没有这个topic了,但是这会导致消费者和偏移量无法记录。 创建Kafka自带的Topi…...
在文件夹下快速创建vue项目搭建vue框架详细步骤
一、首先在你的电脑目录下新建一个文件夹 进入该文件夹并打开控制台(输入cmd指令) 进入控制台后输入 vue create springboot_vue (自己指定名称) 如果出现这类报错如:npm install 的报错npm ERR! network request to http://registry.cnp…...
蓝桥杯倒计时 36天-DFS练习
文章目录 飞机降落仙境诅咒小怂爱水洼串变换 飞机降落 思路:贪心暴搜。 #include<bits/stdc.h>using namespace std; const int N 10; int t,n; //这题 N 比较小,可以用暴力搜搜复杂度是 TN*N! struct plane{int t,d,l; }p[N]; bool vis[N];//用…...
ctfshow web入门 php特性总结
1.web89 intval函数的利用,intval函数获取变量的整数值,失败时返回0,空的数组返回,非空数组返回1 num[]1 intval ( mixed $var [, int $base 10 ] ) : int Note: 如果 base 是 0,通过检测 var 的格式来决定使用的进…...
Media Encoder 2024:未来媒体编码的新纪元 mac/win版
随着科技的飞速发展,媒体内容已成为我们日常生活中不可或缺的一部分。为了满足用户对高质量视频内容不断增长的需求,Media Encoder 2024应运而生,它凭借卓越的技术和创新的特性,重塑了媒体编码的未来。 Media Encoder 2024 mac/w…...
2024年AI辅助研发趋势:数智时代革新新引擎
随着科技的飞速发展,人工智能(AI)已经渗透到我们生活的方方面面,而在软件开发领域,AI辅助研发正成为一股不可忽视的力量。本文将探讨2024年AI辅助研发的趋势,以及它如何成为数智时代革新的新引擎。 AI辅助研…...
2024年家政预约上门服务小程序【用户端+商家端+师傅端】源码
024最新家政预约上门服务小程序源码 主要功能:商家入住,师傅入住,缴纳保正金 支持师傅,抢单派单 支持多城市多门下单,支持预约上门服务到店核销 支持补差价义价,支持区域服务限制 基于thinkphp和原生小程序开发...
数据结构:静态链表(编程技巧)
链表的元素用数组存储, 用数组的下标模拟指针。 一、理解 如果有些程序设计语言没有指针类型,如何实现链表? 在使用指针类型实现链表时,我们很容易就可以直接在内存中新建一块地址用于创建下一个结点,在逻辑上&#x…...
python中的**可以表示什么??
在Python中,** 有两个主要的用途: 作为幂运算符:a ** b 表示a的b次方。例如,2 ** 3 会返回 8,因为2的3次方等于8。 在函数调用或定义时作为关键字参数的解包: 当你有一个字典,并且你想将这个字…...
使用 Git 跟踪项目文件
本章内容为:用Django 写学习笔记程序第三章.2部署程序摘录,详情内容查看请跳转下方链接: 用Django 写学习笔记程序第三章.2部署程序 文章目录 使用 Git 跟踪项目文件虚拟环境中安装 gitgit 是什么git 安装完成后的简单配置创建项目忽略文件初…...
C++从零开始(day47)——set,map学习使用
这是关于一个普通双非本科大一学生的C的学习记录贴 在此前,我学了一点点C语言还有简单的数据结构,如果有小伙伴想和我一起学习的,可以私信我交流分享学习资料 那么开启正题 今天分享的是关于set和map的知识点 1.关联式容器 在前面&#…...
手机和电脑同步的好用记事本软件有哪些
我常常需要随手记录各种信息,以便随时查阅和使用。比如,在下班路上,我会用手机记录明天要处理的工作事项、购物清单,或是某个突然迸发的创意想法;而在办公室,我则需要在电脑上整理会议纪要、项目计划&#…...
使用CSS制作动态的环形图/饼图
使用纯 CSS Animation conic-gradient 实现一个环形图。 饼图的实现思路和环形图一样,去掉中间的圆形遮盖 after 伪类元素即可。 一、构建基础样式 构建圆形节点和中间的遮盖元素。 <style>body {background-color: rgb(130, 226, 255);}.circle {top: 16…...
掌握React中的useEffect:函数组件中的魔法钩子
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...
