Vue3의 템플릿 구문을 사용하는 방법은 무엇입니까?
1. 템플릿 구문이란 무엇인가요?
우리는 HTML
구문의 확장으로 Vue.js
의 템플릿 구문을 직접 이해할 수 있습니다. 모든 템플릿 노드 선언, 속성 설정 및 이벤트 등록은 다음과 같이 설계되었습니다. HTML
구문에 따라 확장됩니다. 공식 성명에 따르면 "모든 Vue
템플릿은 구문적으로 합법적인 HTML
이며 사양을 준수하는 브라우저 및 HTML
파서에서 사용할 수 있습니다. 분석".
Vue.js
的模板语法,直接理解为HTML
语法的一种扩展,它所有的模板节点声明、属性设置和事件注册等都是按照HTML
的语法来进行扩展设计的。按照官方的说法就是“所有的Vue
模板都是语法层面合法的HTML
,可以被符合规范的浏览器和HTML
解析器解析”。Vue 使用一种基于 HTML 的模板语法,使我们能够声明式地将其组件实例的数据绑定到呈现的 DOM 上
二、内容渲染指令
1. v-text
使用
v-tex
t指令,将数据采用纯文本方式填充其空元素中// 组合式 <script setup> import { reactive } from 'vue' let student = reactive({ name: 'Jack', desc: '<h4>我是来自中国的小朋友!</h4>' }) </script> <template> <!-- 使用v-text指令,将数据采用纯文本方式填充其空元素中 --> <div v-text="student.name"></div> <!-- v-text:以纯文本的方式显示数据 --> <div v-text="student.desc"></div> <!-- 下面的代码会报错:div 元素不是空元素 --> <!-- <div v-text="student.name">这是原始的div数据</div> --> </template>로그인 후 복사2. {{ }} 插值表达式
在元素中的某一位置采用纯文本的方式渲染数据
// 组合式 <script setup> import { reactive } from 'vue' let student = reactive({ name: 'Jack', desc: '<h4>我是来自中国的小朋友!</h4>' }) </script> <template> <!-- 插值表达式:在元素中的某一位置采用纯文本的方式渲染数据 --> <div>这是一个 DIV 元素,{{ student.name }},{{ student.desc }}</div> </template>로그인 후 복사3. v-html
使用
v-html
指令,将数据采用HTML
语法填充其空元素中// 组合式 <script setup> import { reactive } from 'vue' let student = reactive({ name: 'Jack', desc: '<h4>我是来自中国的小朋友!</h4>' }) </script> <template> <!-- 使用v-html指令,将数据采用HTML语法填充其空元素中 --> <div v-html="student.name"></div> <!-- v-html:以 HTML 语法显示数据 --> <div v-html="student.desc"></div> <!-- 下面的代码会报错:div 元素不是空元素 --> <!-- <div v-html="student.name">这是原始的div数据</div> --> </template>로그인 후 복사三、双向绑定指令
1. v-model
v-model
双向数据绑定指令,视图数据和数据源同步<br/>一般情况下v-model
指令用在表单元素中:
文本类型的 和
和 会绑定 checked 属性并侦听 change 事件
// 组合式 <script setup> import { ref } from 'vue' let inputText = ref('ABC') // 单行文本框 let message = ref('本次更新有以下几点:……') // 多行文本框 let open = ref(true) // 开灯(复选框) let determine = ref('不确定') // 是否确定(复选框) let likes = ref(['YMQ']) // 兴趣爱好(复选框) let sex = ref('woman') // 性别(单选按钮) let level = ref('B') // // 证书等级(单选下拉框) let city = ref(['苏C', '苏B']) // 去过的城市(多选下拉框) </script> <template> <!-- 单行文本框 --> <input type="text" v-model="inputText"> <hr> <!-- 多行文本框 --> <textarea v-model="message"></textarea> <hr> <!-- 默认情况下,复选框的值:true/false --> <input type="checkbox" v-model="open"> 灯 <hr> <!-- 自定义复选框值: true-value/false-value --> <input type="checkbox" true-value="确定" false-value="不确定" v-model="determine"> 是否确定 <hr> <input type="checkbox" value="LQ" v-model="likes"> 篮球 <input type="checkbox" value="ZQ" v-model="likes"> 足球 <input type="checkbox" value="YMQ" v-model="likes"> 羽毛球 <input type="checkbox" value="PPQ" v-model="likes"> 乒乓球 <hr> <input type="radio" value="man" v-model="sex"> 男 <input type="radio" value="woman" v-model="sex"> 女 <hr> 证书等级: <select v-model="level"> <option value="C">初级</option> <option value="B">中级</option> <option value="A">高级</option> </select> <hr> 去过的城市: <select multiple v-model="city"> <option value="苏A">南京</option> <option value="苏B">无锡</option> <option value="苏C">徐州</option> <option value="苏D">常州</option> </select> </template>로그인 후 복사2. v-model的修饰符
요소의 특정 위치에서 데이터를 일반 텍스트로 렌더링합니다.
修饰符 作用 示例 .number
自动将用户的输入值转为数值类型 <input v-model.number="age" />
.trim
自动过滤用户输入的首尾空白字符 <input v-model.trim="msg" />
.lazy
在 chang
时而非input
时更新2 콘텐츠 렌더링 명령 <input v-model.lazy="msg" />
Vue는 구성 요소 인스턴스의 데이터를 렌더링된 DOM에 선언적으로 바인딩할 수 있는 HTML 기반 템플릿 구문을 사용합니다.1. v-text
v-tex
t 명령을 사용하여 빈 요소를 일반 텍스트의 데이터로 채웁니다.// 组合式 <script setup> import { ref } from 'vue' let age = ref(20) let nickname = ref('') </script> <template> <p>将用户输入的值转成数值 .number,懒更新 .lazy</p> <!-- 。number 将用户输入的值转成数值,如果用户输入的内容无法转成数字,将不会更新数据源 --> <!-- .lazy 在 change 跟新数据源,而不是 input --> <input type="text" v-model.lazy.number="age"> <hr> <p>去掉首尾空白字符</p> <input type="text" v-model.trim="nickname"> </template>로그인 후 복사로그인 후 복사2 {{ }} 보간 표현식
// 组合式 <script setup> import { reactive } from 'vue' let picture = reactive({ src: 'https://cache.yisu.com/upload/information/20230306/112/35391.jpg', // 图像地址 width: 200 // 显示宽度 }) </script> <template> <input type="range" min="100" max="500" v-model="picture.width"> <hr> <!-- v-bind: 为 src 属性绑定指定的数据源 --> <img v-bind:src="picture.src" v-bind:width="picture.width"> <hr> <!-- : 是 v-bind: 的缩写形式 --> <img :src="picture.src" :width="picture.width"> <hr> <!-- 如果绑定的值是 null 或者 undefined,那么该属性将会从渲染的元素上移除 --> <button @click="picture.width = null">设置宽度为NULL</button> </template>로그인 후 복사로그인 후 복사3. v-html
🎜v-html
명령을 사용하여HTML
구문🎜3을 사용하는 데이터가 있는 빈 요소. 양방향 바인딩 지침🎜// 组合式 <script setup> import {reactive} from 'vue' let attrs = reactive({ class: 'error', id: 'borderBlue' }) </script> <template> <!-- 直接使用 v-bind 来为元素绑定多个属性及其值 --> <button v-bind="attrs">我是一个普通的按钮</button> </template> <style> .error { background-color: rgb(167, 58, 58); color: white; } #borderBlue { border: 2px solid rgb(44, 67, 167); } </style>로그인 후 복사로그인 후 복사1. v-model
🎜v-model</code > 양방향 데이터 바인딩 명령, 뷰 데이터와 데이터 소스의 동기화<br/>일반적으로 <code>v-model
명령은 양식 요소에 사용됩니다.
- 🎜텍스트 유형의 및
- 🎜<입력 유형 ="checkbox"> 및 는 확인된 속성을 바인딩하고 변경 이벤트를 수신합니다.
- 🎜
// 组合式 <script setup> import { ref, reactive } from 'vue' let btnClassObject = reactive({ error: false, // 主题色 flat: false // 阴影 }) let capsule = ref(false)// 胶囊 let block = ref(false)// 块 </script> <template> <input type="checkbox" v-model="btnClassObject.error"> error <input type="checkbox" v-model="btnClassObject.flat"> flat <br> <br> <button :class="btnClassObject">我是一个普通的按钮</button> <hr> <input type="checkbox" v-model="capsule"> 胶囊 <input type="checkbox" v-model="block"> 块 <br> <br> <button :class="{ 'rounded': capsule, 'fullWidth': block }">我是一个普通的按钮</button> </template> <style> button { border: none; padding: 15px 20px; background-color: rgb(179, 175, 175); } .error { background-color: rgb(167, 58, 58); color: white; } .flat { box-shadow: 0 0 8px gray; } .rounded { border-radius: 100px; } .fullWidth { width: 100%; } </style>로그인 후 복사로그인 후 복사2. v-model의 수정자
수정자 함수 예 🎜.number
🎜< td>자동 변환 사용자의 입력 값을 숫자 유형🎜<input v-model.number="age" />
🎜🎜로 변환합니다. >🎜
사용자가 입력한 앞뒤 공백 문자를 자동으로 필터링합니다🎜 <input v-model.trim="msg" />
🎜🎜.lazy
🎜input
🎜<input v-model.lazy = 대신 <code>chang
중에 업데이트됨 = "msg" />🎜🎜🎜🎜// 组合式 <script setup> import { ref } from 'vue' let age = ref(20) let nickname = ref('') </script> <template> <p>将用户输入的值转成数值 .number,懒更新 .lazy</p> <!-- 。number 将用户输入的值转成数值,如果用户输入的内容无法转成数字,将不会更新数据源 --> <!-- .lazy 在 change 跟新数据源,而不是 input --> <input type="text" v-model.lazy.number="age"> <hr> <p>去掉首尾空白字符</p> <input type="text" v-model.trim="nickname"> </template>로그인 후 복사로그인 후 복사四、属性绑定指令
响应式地绑定一个元素属性,应该使用
v-bind:
指令如果绑定的值是
null
或者undefined
,那么该属性将会从渲染的元素上移除因为
v-bind
非常常用,我们提供了特定的简写语法:// 组合式 <script setup> import { reactive } from 'vue' let picture = reactive({ src: 'https://cache.yisu.com/upload/information/20230306/112/35391.jpg', // 图像地址 width: 200 // 显示宽度 }) </script> <template> <input type="range" min="100" max="500" v-model="picture.width"> <hr> <!-- v-bind: 为 src 属性绑定指定的数据源 --> <img v-bind:src="picture.src" v-bind:width="picture.width"> <hr> <!-- : 是 v-bind: 的缩写形式 --> <img :src="picture.src" :width="picture.width"> <hr> <!-- 如果绑定的值是 null 或者 undefined,那么该属性将会从渲染的元素上移除 --> <button @click="picture.width = null">设置宽度为NULL</button> </template>로그인 후 복사로그인 후 복사1. 动态绑定多个属性值
直接使用
v-bind
来为元素绑定多个属性及其值// 组合式 <script setup> import {reactive} from 'vue' let attrs = reactive({ class: 'error', id: 'borderBlue' }) </script> <template> <!-- 直接使用 v-bind 来为元素绑定多个属性及其值 --> <button v-bind="attrs">我是一个普通的按钮</button> </template> <style> .error { background-color: rgb(167, 58, 58); color: white; } #borderBlue { border: 2px solid rgb(44, 67, 167); } </style>로그인 후 복사로그인 후 복사渲染结果:<br/>
<button class="redBack" id="btnBorderBlue">我是一个普通按钮</button>
2. 绑定class和style属性
class
和style
可以和其他属性一样使用v-bind
将它们和动态的字符串绑定;但是,在处理比较复杂的绑定时,通过拼接生成字符串是麻烦且易出错的;因此,Vue
专门为class
和style
的v-bind
用法提供了特殊的功能增强;除了字符串外,表达式的值也可以是对象或数组。class属性绑定
绑定对象
// 组合式 <script setup> import { ref, reactive } from 'vue' let btnClassObject = reactive({ error: false, // 主题色 flat: false // 阴影 }) let capsule = ref(false)// 胶囊 let block = ref(false)// 块 </script> <template> <input type="checkbox" v-model="btnClassObject.error"> error <input type="checkbox" v-model="btnClassObject.flat"> flat <br> <br> <button :class="btnClassObject">我是一个普通的按钮</button> <hr> <input type="checkbox" v-model="capsule"> 胶囊 <input type="checkbox" v-model="block"> 块 <br> <br> <button :class="{ 'rounded': capsule, 'fullWidth': block }">我是一个普通的按钮</button> </template> <style> button { border: none; padding: 15px 20px; background-color: rgb(179, 175, 175); } .error { background-color: rgb(167, 58, 58); color: white; } .flat { box-shadow: 0 0 8px gray; } .rounded { border-radius: 100px; } .fullWidth { width: 100%; } </style>로그인 후 복사로그인 후 복사绑定数组
// 组合式 <script setup> import { ref, reactive } from 'vue' let btnTheme = ref([]) // 按钮class数组 let capsule = ref(false)// 胶囊 let widthTheme = ref([])// 宽度数组 </script> <template> <input type="checkbox" value="error" v-model="btnTheme"> error <input type="checkbox" value="flat" v-model="btnTheme"> flat <br> <br> <!-- 直接使用数组数据源,数组中有哪些值,直接在该元素的class里出现对应的类名 --> <button :class="btnTheme">我是一个普通的按钮</button> <hr> <input type="checkbox" v-model="capsule"> 胶囊 <input type="checkbox" value="fullWidth" v-model="widthTheme"> 块 <br> <br> <!-- 数组和对象一起使用 --> <button :class="[{ 'rounded': capsule }, widthTheme]">我是一个普通的按钮</button> </template> <style> button { border: none; padding: 15px 20px; background-color: rgb(179, 175, 175); } .error { background-color: rgb(167, 58, 58); color: white; } .flat { box-shadow: 0 0 8px gray; } .rounded { border-radius: 100px; } .fullWidth { width: 100%; } </style>로그인 후 복사style属性绑定
绑定对象
// 组合式 <script setup> import { reactive, ref } from 'vue' let btnTheme = reactive({ backgroundColor: '#FF0000', // 背景色 color: '#000000' // 文本色 }) let backColor = ref('#0000FF') // 背景色 let color = ref('#FFFFFF') // 文本色 let borRadius = ref(20) // 边框圆角 </script> <template> 背景色:<input type="color" v-model="btnTheme.backgroundColor"> 文本色:<input type="color" v-model="btnTheme.color"> <br> <br> <!-- style:可以直接绑定对象数据源,但是对象数据源的属性名当样式属性(驼峰命名法,kebab-cased形式) --> <button :>我是一个普通的按钮</button> <hr> 背景色:<input type="color" v-model="backColor"> 文本色:<input type="color" v-model="color"> 边框圆角:<input type="range" min="0" max="20" v-model="borRadius"> <br> <br> <!-- style:可以直接写对象,但是对象的属性名当样式属性(驼峰命名法,kebab-cased形式) --> <button :style="{ backgroundColor: backColor, color, 'border-radius': borRadius + 'px' }">我是一个普通的按钮</button> </template> <style> button { border: none; padding: 15px 20px; background-color: rgb(179, 175, 175); } </style>로그인 후 복사绑定数组
还可以给
:style
绑定一个包含多个样式对象的数组,这些对象会被合并后渲染到同一元素上// 组合式 <!-- 脚本区域 --> <script setup> import { ref, reactive } from 'vue' const btnTheme = ref([ { backgroundColor: '#FF0000', // 背景色 color: '#FFFFFF' // 文本色 }, { borderRadius: 0 // 边框圆角 } ]) const colorTheme = reactive({ backgroundColor: '#000000', // 背景色 color: '#FFFFFF' // 文本色 }) const radiusTheme = reactive({ borderRadius: 0 // 边框圆角 }) </script> <!-- 视图区域 --> <template> 背景色:<input type="color" v-model="btnTheme[0].backgroundColor"> 文本色:<input type="color" v-model="btnTheme[0].color"> 胶囊:<input type="checkbox" true-value="5px" false-value="0" v-model="btnTheme[1].borderRadius"> <br> <br> <!-- 直接传入数组 --> <button :>我是一个普通按钮</button> <hr> 背景色:<input type="color" v-model="colorTheme.backgroundColor"> 文本色:<input type="color" v-model="colorTheme.color"> 胶囊:<input type="checkbox" true-value="5px" false-value="0" v-model="radiusTheme.borderRadius"> <br> <br> <!-- 直接写数组 --> <button :>我是一个普通按钮</button> </template> <style> button { padding: 15px 20px; border: none; } </style>로그인 후 복사五、条件渲染指令
1. v-if、v-else-if、v-else
v-if
指令用于条件性地渲染元素;该内容只会在指令的表达式返回真值时才被渲染
v-else-if
提供的是相应于v-if
的else if
区块,它可以连续多次重复使用你也可以使用
v-else
为v-if
添加一个else
区块
v-else
和v-else-if
指令必须配合
v-if
指令一起使用 ,否则它将不会被识别,而且语句块中间不能出现无关其他元素v-if
支持在<template>
元素上使用,这只是一个不可见的包装器元素,最后渲染的结果并不会包含这个<template>
元素// 组合式 <script setup> import { ref } from 'vue' let isShow = ref(false) // 是否显示 let age = ref(20) // 年龄 let week = ref(3) // 周几 </script> <template> 是否显示:<input type="checkbox" v-model="isShow"> <!-- v-if:指令表达式为真时才会渲染该元素 为true时会创建该元素,为false时会销毁该元素 --> <h4 v-if="isShow">这是一个普通的标题标签</h4> <hr> 年龄: <input type="range" min="0" max="100" v-model="age"> {{ age }} <!-- v-if:可以配合 v-else-if 和 v-else 来搭建多重判断条件,他们中间不要参杂无关紧要的元素 --> <h2 v-if="age < 18">未成年</h2> <!-- <span>无关紧要的元素</span> --> <h3 v-else-if="age < 35">青年</h3> <h4 v-else-if="age < 50">中年</h4> <h5 v-else>老年</h5> <hr> 周几: <input type="range" min="1" max="7" v-model="week"> {{ week }} <!-- v-if:可以配合 template 元素使用,最后渲染的结果并不会包含这个 <template>元素 --> <template v-if="week == 1 || week == 3 || week == 5 || week == 7"> <h2>可以游泳</h2> </template> <template v-else> <h2>不可以游泳</h2> </template> </template>로그인 후 복사2. v-show
v-show
按条件显示一个元素的指令v-show
会在DOM
渲染中保留该元素
v-show
仅切换了该元素上名为display
的CSS
属性
v-show
不支持在<template>
元素上使用,也不能和v-else
搭配使用<br/>로그인 후 복사// 组合式 <script setup> import { ref } from 'vue' let isShow = ref(false) // 是否显示 let age = ref(20) // 年龄 let week = ref(3) // 周几 </script> <template> 是否显示:<input type="checkbox" v-model="isShow"> <!-- v-show:指令表达式为真时才会渲染该元素 无论该指令的表达式是否 true 或 false,该元素在元素中是保留该元素的 为 true 时会删除该元素的 display:none 样式,为 false 时会给该元素添加 display:none 样式 --> <h4 v-show="isShow">这是一个普通的标题标签</h4> <hr> 年龄: <input type="range" min="0" max="100" v-model="age"> {{ age }} <h2 v-show="age < 18">未成年</h2> <h3 v-show="age >= 18 && age < 35">青年</h3> <h4 v-show="age >= 35 && age < 50">中年</h4> <h5 v-show="age >= 50">老年</h5> <hr> 周几: <input type="range" min="1" max="7" v-model="week"> {{ week }} <!-- v-show:不可以配合 template 元素使用 --> <!-- <template v-show="week == 1 || week == 3 || week == 5 || week == 7"> <h2>可以游泳</h2> </template> <template v-shw="week == 12 || week == 4 || week == 6"> <h2>不可以游泳</h2> </template> --> </template>로그인 후 복사3. v-if和v-show的区别
v-if
是“真实的”按条件渲染,因为它确保了在切换时,条件区块内的事件监听器和子组件都会被销毁与重建
v-if
也是惰性的:如果在初次渲染时条件值为false
,则不会做任何事;条件区块只有当条件首次变为true
时才被渲染
v-show
元素无论初始条件如何,始终会被渲染,只有 CSSdisplay
属性会被切换
v-if
有更高的切换开销,而v-show
有更高的初始渲染开销;如果需要频繁切换,则使用v-show
较好;如果在运行时绑定条件很少改变,则v-if
会更合适六、事件绑定指令
我们可以使用
v-on:
指令 (简写为@) 来监听DOM
事件,并在事件触发时执行对应的JavaScript
<br/>用法:v-on:click=""
或@click=""
用法:
// 组合式 <script> export default { data: () => ({ volume: 5 // 音量[0, 10] }), methods: { // 添大音量 addVolume() { // 如果音量没有在最高值,则添加音量 if (this.volume !== 10) { this.volume++ } }, // 减小音量 subVolume() { // 如果音量没有在最小值,则减小音量 if (this.volume !== 0) { this.volume-- } }, // 设置音量 setVolume(value) { // 判断音量是否在取值范围之间 if (value >= 0 && value <= 10) { this.volume = value } } } } </script> <template> <h4>当前音量:{{ volume }}</h4> <!-- v-on: 事件绑定 --> <button v-on:click="addVolume">添加音量</button> <button v-on:click="subVolume">减小音量</button> <hr> <!-- @ 是 v-on: 的缩写 --> <button @click="setVolume(0)">静音</button> <button @click="setVolume(5)">音量适中</button> <button @click="setVolume(10)">音量最大</button> </template>로그인 후 복사1. 事件修饰符
事件修饰符 说明 .prevent
阻止默认行为 .stop
阻止事件冒泡 .capture
以捕获模式触发当前的事件处理函数 .once
绑定的事件只触发1次 .self
只有在event.target是当前元素自身时触发事件处理函数 .passive
向浏览器表明了不想阻止事件的默认行为 .prevent
.prevent
:阻止该事件的默认行为// 组合式 <script setup> // 打招呼 function say(name) { window.alert('你好:' + name) } </script> <template> <!-- .prevent 修饰符阻止了超链接的默认行为(跳转到百度页) --> <a href="http://www.baidu.com" rel="external nofollow" rel="external nofollow" @click.prevent="say('baiDu')">百度</a> </template>로그인 후 복사.stop
.stop
:阻止事件产生的冒泡现象// 组合式 <script setup> // 打招呼 function say(name) { console.log('你好:' + name) } </script> <template> <div class="divArea" @click="say('DIV')"> <!-- .stop:阻止产生冒泡事件 --> <button @click.stop="say('BUTTON')">冒泡按钮</button> </div> </template> <style> .divArea { padding: 30px; border: 2px solid blue; } </style>로그인 후 복사.once
.once
:绑定的事件只触发1
次// 组合式 <script setup> // 打招呼 function say(name) { window.alert('你好:' + name) } </script> <template> <!-- .once:绑定的事件只触发一次 --> <button @click.once="say('BUTTON')">点我试一下</button> </template>로그인 후 복사.self
.self
:只有在event.target
是当前元素自身时触发事件处理函数// 组合式 <script setup> // 打招呼 function say(name) { window.alert('你好:' + name) } </script> <template> <!-- .self:只在该元素上触发事件有效,其子元素无效 --> <div class="divArea" @click.self="say('DIV')"> <button>我是一普通的按钮</button> </div> </template> <style> .divArea { padding: 30px; border: 2px solid blue; } </style>로그인 후 복사.capture
.capture
给元素添加一个监听器
当元素事件产生冒泡时,先触发的是该修饰符的元素的事件
如果有多个该修饰符,则由外向内依次触发
// 组合式 <script setup> // 打招呼 function say(name) { console.log('你好:' + name) } </script> <template> <!-- .capture 给元素添加一个监听器 1:当元素事件产生冒泡时,先触发的是该修饰符的元素的事件 2:如果有多个该修饰符,则由外向内依次触发 --> <div class="divArea" @click.capture="say('DIV-1')"> <div class="divArea" @click="say('DIV-2')"> <div class="divArea" @click.capture="say('DIV-3')"> <button>我是一普通的按钮</button> </div> </div> </div> </template> <style> .divArea { padding: 30px; border: 2px solid blue; } </style>로그인 후 복사.passive
.passive
:不阻止事件的默认行为,与.prevent
不要同时使用// 组合式 <script setup> function eventPrevent() { // 阻止事件默认行为 event.preventDefault() } </script> <template> <!-- .passive:先执行默认行为,不考虑执行的代码中是否包含 event.preventDefault() --> <a href="http://www.baidu.com" rel="external nofollow" rel="external nofollow" @click.passive="eventPrevent">百度</a> </template>로그인 후 복사2. 按键修饰符
按键别名:
.enter
、.tab
、.esc
、.space
、.up
、.down
、.left
、.right
、.delete
(捕获Delete
和Backspace
两个按键)<br/>系统修饰符:.ctrl
、.alt
、.shift
、.meta
<br/>准确的修饰符:.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>로그인 후 복사3. 鼠标按键修饰符
鼠标按键修饰符:
.left
、.right
、.middle
// 组合式 <!-- 脚本区域 --> <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>로그인 후 복사七、列表渲染指令
使用
v-for
指令基于一个数组来渲染一个列表1. v-for渲染数组
语法:
in
前一个参数:item in items
<br/>item
:值<br/>items
:需要循环的数组in
前两个参数:(value, index) in items
<br/>value
:值<br/>index
:索引<br/>items
:需要循环的数组// 组合式 <script setup> import { ref } from 'vue' // 课程 let subject = ref([ { id: 1, name: 'Vue' }, { id: 2, name: 'Java' }, { id: 3, name: 'UI设计' }, { id: 4, name: 'Hadoop' }, { id: 5, name: '影视后期' }, ]) </script> <template> <!-- item in itmes item:值,当前循环的数组值 itmes:循环的数组 --> <h7>v-for 渲染数组, v-for="item in itmes"</h7> <ul> <li v-for="sub in subject"> 编号:{{ sub.id }} --- 名称:{{ sub.name }} </li> </ul> <hr> <!-- 解构对象 --> <h7>v-for 渲染数组, v-for="{ 解构…… } in itmes"</h7> <ul> <li v-for="{ id , name } in subject"> 编号:{{ id }} --- 名称:{{ name }} </li> </ul> <hr> <!-- (value, index) in itmes value:值 index:索引 itmes:循环的数组 --> <h7>v-for 渲染数组, v-for="(value, index) in itmes"</h7> <ul> <li v-for="(sub, index) in subject"> 编号:{{ sub.id }} --- 名称:{{ sub.name }} --- 索引:{{ index }} </li> </ul> <hr> <!-- 解构对象 --> <h7>v-for 渲染数组, v-for="({ 解构…… }, index) in itmes"</h7> <ul> <li v-for="({ id , name } , index) in subject"> 编号:{{ id }} --- 名称:{{ name }} --- 索引:{{ index }} </li> </ul> </template>로그인 후 복사2. v-for渲染对象
使用
v-for
来遍历一个对象的所有属性,遍历的顺序会基于对该对象调用Object.keys()
的返回值来决定<br/>语法:
in
前一个参数:value in object
<br/>value
:属性值<br/>items
:需要循环的对象in
前两个参数:(value, name) in object
<br/>value
:属性值<br/>name
:键<br/>items
:需要循环的对象in
前三个参数:(value, name, index) in object
<br/>value
:属性值<br/>name
:键<br/>index
:索引<br/>items
:需要循环的对象// 组合式 <script setup> import { reactive } from 'vue' let student = reactive({ styNum: '007', // 学号 name: 'Jack', // 名字 age: 18 //年龄 }) </script> <template> <!-- value in object value:属性值 object:循环的对象 --> <h7>v-for 渲染对象, v-for="value in object"</h7> <ul> <li v-for="value in student"> {{ value }} </li> </ul> <hr> <!-- (value, name) in object value:属性值 name:属性名 object:循环的对象 --> <h7>v-for 渲染对象, v-for="(value, name) in object"</h7> <ul> <li v-for="(value, name) in student"> 属性名:{{ name }} --- 属性值: {{ value }} </li> </ul> <hr> <!-- (value, name, index) in object value:属性值 name:属性名 index: 索引 object:循环的对象 --> <h7>v-for 渲染对象, v-for="(value, name, index) in object"</h7> <ul> <li v-for="(value, name, index) in student"> 属性名:{{ name }} --- 属性值: {{ value }} --- 索引:{{ index }} </li> </ul> </template>로그인 후 복사3. 通过 key 管理状态
当列表的数据变化时,默认情况下,
vue
会尽可能的复用已存在的DOM
元素,从而提升渲染的性能;但这种默认的性能优化策略,会导致有状态的列表无法被正确更新。<br/>为了给vue
一个提示,以便它能跟踪每个节点的身份,从而在保证有状态的列表被正确更新的前提下,提升渲染的性能;此时,需要为每项提供一个唯一的key属性:<br/>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> <h4>不使用key值</h4> <ul> <li v-for="sub in subject"> <input type="checkbox"> {{ sub }} </li> </ul> <hr> <h4>使用索引当key值</h4> <ul> <li v-for="(sub, index) in subject" :key="index"> <input type="checkbox"> {{ sub }} </li> </ul> <hr> <h4>使用列表属性当key值(该属性必须再此列表中唯一)</h4> <ul> <li v-for="sub in subject" :key="sub.id"> <input type="checkbox"> {{ sub }} </li> </ul> </template>로그인 후 복사위 내용은 Vue3의 템플릿 구문을 사용하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!
본 웹사이트의 성명본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.![]()
핫 AI 도구
![]()
Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱
![]()
AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.
![]()
Undress AI Tool
무료로 이미지를 벗다
![]()
Clothoff.io
AI 옷 제거제
![]()
AI Hentai Generator
AI Hentai를 무료로 생성하십시오.
![]()
인기 기사
R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌R.E.P.O. 최고의 그래픽 설정3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌어 ass 신 크리드 그림자 : 조개 수수께끼 솔루션2 몇 주 전 By DDDR.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌![]()
뜨거운 도구
![]()
메모장++7.3.1
사용하기 쉬운 무료 코드 편집기
![]()
SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.
![]()
스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경
![]()
드림위버 CS6
시각적 웹 개발 도구
![]()
SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)
![]()
뜨거운 주제
Gmail 이메일의 로그인 입구는 어디에 있나요?7457
15
Cakephp 튜토리얼1376
52
Steam의 계정 이름 형식은 무엇입니까?77
11
Win11 활성화 키 영구44
19
NYT 연결 힌트와 답변17
10
See all articlesvue3+vite: src에서 이미지를 동적으로 가져오기 위해 require를 사용할 때 오류를 해결하는 방법 May 21, 2023 pm 03:16 PM
vue3+vite:src는 require를 사용하여 이미지를 동적으로 가져오고 vue3+vite는 여러 이미지를 동적으로 가져옵니다. vue3을 사용하는 경우 require는 이미지를 사용할 수 없습니다. imgUrl:require(' .../assets/test.png') 와 같은 vue2는 typescript가 require를 지원하지 않기 때문에 가져오므로 이를 해결하는 방법은 다음과 같습니다. waitimport를 사용합니다.
vue3 프로젝트에서tinymce를 사용하는 방법 May 19, 2023 pm 08:40 PM
tinymce는 완전한 기능을 갖춘 리치 텍스트 편집기 플러그인이지만,tinymce를 vue에 도입하는 것은 다른 Vue 리치 텍스트 플러그인만큼 원활하지 않습니다.tinymce 자체는 Vue에 적합하지 않으며 @tinymce/tinymce-vue를 도입해야 합니다. 외국 서식 있는 텍스트 플러그인이며 중국어 버전을 통과하지 못했습니다. 공식 웹사이트에서 번역 패키지를 다운로드해야 합니다(방화벽을 우회해야 할 수도 있음). 1. 관련 종속성을 설치합니다. npminstalltinymce-Snpminstall@tinymce/tinymce-vue-S2. 중국어 패키지를 다운로드합니다. 3. 프로젝트 공용 폴더에 스킨과 중국어 패키지를 새로 만들고 다운로드합니다.
Vue3가 마크다운을 구문 분석하고 코드 강조 표시를 구현하는 방법 May 20, 2023 pm 04:16 PM
Vue로 블로그 프론트엔드를 구현하려면 마크다운 파싱을 구현해야 합니다. 코드가 있는 경우 코드 하이라이팅을 구현해야 합니다. markdown-it, vue-markdown-loader,marked,vue-markdown 등과 같은 Vue용 마크다운 구문 분석 라이브러리가 많이 있습니다. 이 라이브러리는 모두 매우 유사합니다. 여기서는 Marked가 사용되었고, 코드 하이라이팅 라이브러리로 하이라이트.js가 사용되었습니다. 구체적인 구현 단계는 다음과 같습니다. 1. 종속 라이브러리를 설치합니다. vue 프로젝트에서 명령 창을 열고 다음 명령 npminstallmarked-save//marked를 입력하여 markdown을 htmlnpmins로 변환합니다.
Vue3에서 페이지의 일부 콘텐츠를 새로 고치는 방법 May 26, 2023 pm 05:31 PM
페이지를 부분적으로 새로 고치려면 로컬 구성 요소(dom)의 다시 렌더링만 구현하면 됩니다. Vue에서 이 효과를 얻는 가장 쉬운 방법은 v-if 지시어를 사용하는 것입니다. Vue2에서는 v-if 명령을 사용하여 로컬 DOM을 다시 렌더링하는 것 외에도 새 빈 구성 요소를 만들 수도 있습니다. 로컬 페이지를 새로 고쳐야 할 경우 이 빈 구성 요소 페이지로 점프한 다음 다시 돌아올 수 있습니다. 빈 원본 페이지의 beforeRouteEnter 가드. 아래 그림과 같이 Vue3.X에서 새로 고침 버튼을 클릭하여 빨간색 상자 안에 DOM을 다시 로드하고 해당 로딩 상태를 표시하는 방법입니다. Vue3.X의 scriptsetup 구문에 있는 구성 요소의 가드에는
vue3 프로젝트가 패키징되어 서버에 게시된 후 액세스 페이지가 공백으로 표시되는 문제를 해결하는 방법 May 17, 2023 am 08:19 AM
vue3 프로젝트가 패키징되어 서버에 게시되면 액세스 페이지에 공백 1이 표시됩니다. vue.config.js 파일의 publicPath는 다음과 같이 처리됩니다. const{defineConfig}=require('@vue/cli-service') module.exports=defineConfig({publicPath :process.env.NODE_ENV==='생산'?'./':'/&
Vue3 재사용 가능한 구성 요소를 사용하는 방법 May 20, 2023 pm 07:25 PM
머리말 Vue든 React든, 여러 개의 반복되는 코드를 접하게 되면, 파일을 중복된 코드 덩어리로 채우는 대신, 이러한 코드를 어떻게 재사용할 수 있을지 고민해 보겠습니다. 실제로 vue와 React 모두 컴포넌트를 추출하여 재사용할 수 있지만, 작은 코드 조각이 발견되어 다른 파일을 추출하고 싶지 않은 경우, 이에 비해 React는 동일한에서 사용할 수 있습니다. 파일에서 해당 위젯을 선언합니다. 또는 다음과 같은 renderfunction을 통해 구현합니다. constDemo:FC=({msg})=>{returndemomsgis{msg}}constApp:FC=()=>{return(
Vue3에서 아바타를 선택하고 자르는 방법 May 29, 2023 am 10:22 AM
최종 효과는 VueCropper 컴포넌트 Yarnaddvue-cropper@next를 설치하는 것입니다. 위의 설치 값은 Vue2이거나 다른 방법을 사용하여 참조하려는 경우 공식 npm 주소: 공식 튜토리얼을 방문하세요. 컴포넌트에서 참조하고 사용하는 것도 매우 간단합니다. 여기서는 해당 컴포넌트와 해당 스타일 파일을 소개하기만 하면 됩니다. 여기서는 import{userInfoByRequest}from'../js/api만 소개하면 됩니다. 내 구성 요소 파일에서 import{VueCropper}from'vue-cropper&
DefineCustomElement를 사용하여 Vue3에서 구성 요소를 정의하는 방법 May 28, 2023 am 11:29 AM
Vue를 사용하여 사용자 정의 요소 구축 WebComponents는 개발자가 재사용 가능한 사용자 정의 요소(customelements)를 생성할 수 있는 웹 네이티브 API 세트의 집합적 이름입니다. 사용자 정의 요소의 주요 이점은 프레임워크 없이도 어떤 프레임워크에서도 사용할 수 있다는 것입니다. 다른 프런트 엔드 기술 스택을 사용하는 최종 사용자를 대상으로 하거나 사용하는 구성 요소의 구현 세부 사항에서 최종 애플리케이션을 분리하려는 경우에 이상적입니다. Vue와 WebComponents는 보완적인 기술이며 Vue는 사용자 정의 요소를 사용하고 생성하는 데 탁월한 지원을 제공합니다. 사용자 정의 요소를 기존 Vue 애플리케이션에 통합하거나 Vue를 사용하여 빌드할 수 있습니다.
![]()