vue3 指令详解

在这里插入图片描述

系列文章目录

TypeScript 从入门到进阶专栏


文章目录

  • 系列文章目录
  • 前言
  • 一、v-model (双向绑定功能)
  • 二、v-bind(用于将一个或多个属性绑定到元素的属性或组件的 prop)
  • 三、v-if、v-else、v-else-if(用于根据条件选择性地渲染元素)
  • 四、v-show(根据条件显示或隐藏元素,通过改变元素的 CSS 的 display 属性)
  • 五、v-for(用于基于数据源循环渲染元素列表)
  • 六、v-on(用于绑定事件监听器,可以使用简写的语法 @)
  • 七、v-text(用于将数据绑定到元素的文本内容) (vue3已废弃)
  • 八、v-html(将数据作为 HTML 解析并渲染)
  • 九、v-pre(将元素或组件直接渲染为静态内容,不会被当成模板编译)


前言

Vue 中的指令是用来操作DOM元素的特殊属性,它们可以在模板中使用,并且通过Vue实例的指令选项进行自定义。

一、v-model (双向绑定功能)

Vue 3 中使用 v-model 的方式与 Vue 2 有所不同。

在 Vue 2 中,我们可以通过在组件上使用 v-model 指令来实现双向绑定。例如:

<child-component v-model="data"></child-component>

而在 Vue 3 中,v-model 指令被移除了,取而代之的是一个新的命名约定。

  1. 在子组件中,你需要声明一个 modelValue 属性,用于接收传递给子组件的值,并且在需要更新值的时候,触发一个名为 update:modelValue 的自定义事件。
// 子组件
<template><input :value="modelValue" @input="$emit('update:modelValue', $event.target.value)" />
</template><script>
export default {props: ['modelValue'],
};
</script>
  1. 在父组件中,你需要使用 .sync 修饰符来实现双向绑定。这样做可以将一个 prop 的更新转换为更新其父级的值。
<!-- 父组件 -->
<template><child-component :modelValue.sync="data"></child-component>
</template><script>
export default {data() {return {data: ''}}
};
</script>

这样就可以在父组件中使用 v-model 的方式进行双向绑定了。

<child-component v-model="data"></child-component>

除了这种方式,你也可以手动创建一个绑定到 modelValue 的计算属性,然后通过 @input 事件手动更新父级的值。

<!-- 父组件 -->
<template><child-component :model-value="data" @update:model-value="data = $event" />
</template><script>
export default {data() {return {data: ''}}
};
</script>
<!-- 子组件 -->
<template><input :value="modelValue" @input="$emit('update:model-value', $event.target.value)" />
</template><script>
export default {props: ['modelValue'],
};
</script>

二、v-bind(用于将一个或多个属性绑定到元素的属性或组件的 prop)

使用 v-bind 来动态绑定属性或者指令到一个表达式上。使用 v-bind 的语法如下:

<template><div><button v-bind:disabled="isDisabled">Click me</button><input v-bind:value="username" /></div>
</template><script>
import { ref } from 'vue';export default {setup() {const isDisabled = ref(false);const username = ref('');return {isDisabled,username,};},
};
</script>

在上面的例子中,我们使用了 v-bind 指令来绑定按钮的 disabled 属性和输入框的 value 属性到一个变量上。这些变量使用了 Vue 3 的 composition API 中的 ref 函数来创建可响应式的数据。

v-bind:disabled=“isDisabled” 表示将 isDisabled 变量的值绑定到按钮的 disabled 属性上。当 isDisabled 变量的值为 true 时,按钮将被禁用。

v-bind:value=“username” 表示将 username 变量的值绑定到输入框的 value 属性上。输入框中显示的文本将随着 username 变量的值而变化。

总之,Vue 3 中的 v-bind 用法和 Vue 2 中的用法基本相同,但是配合使用 composition API 来创建可响应式数据。


三、v-if、v-else、v-else-if(用于根据条件选择性地渲染元素)

v-if指令用于根据条件来渲染元素,它需要一个表达式作为参数,如果表达式的值为真,则渲染该元素,如果为假,则不渲染。

v-else指令用于指定一个条件为假时渲染的元素,它必须紧跟在v-if指令之后,而且它们必须属于同一个父元素。

v-else-if指令用于指定一个额外的条件,它必须紧跟在v-if或v-else-if指令之后,而且它们必须属于同一个父元素。v-else-if可以多次使用,用于指定多个条件,当前一个条件为假时,会检查下一个条件。

以下是一个例子,展示了如何使用v-if、v-else和v-else-if指令:

<template><div><p v-if="condition1">条件1为真</p><p v-else-if="condition2">条件2为真</p><p v-else>条件1和条件2都为假</p></div>
</template><script>
export default {data() {return {condition1: true,condition2: false}}
}
</script>

四、v-show(根据条件显示或隐藏元素,通过改变元素的 CSS 的 display 属性)

使用 v-show 指令来控制元素的显示与隐藏。v-show 的使用方式与 Vue 2 中相同。

你可以在一个元素上添加 v-show 指令,并将一个计算属性或者一个响应式的变量作为其值。这样,当计算属性的值或者变量的值为 true
时,元素将显示;当计算属性的值或者变量的值为 false 时,元素将隐藏。

下面是一个示例:

<template><div><button @click="toggle">Toggle</button><div v-show="isVisible">This is a hidden element</div></div>
</template><script>
export default {data() {return {isVisible: false};},methods: {toggle() {this.isVisible = !this.isVisible;}}
};
</script>

在上面的示例中,初始时 div 元素是隐藏的。当点击按钮时,toggle 方法会将 isVisible 的值反转,从而控制 div 元素的显示与隐藏。

注意:v-show 只是简单地切换元素的 CSS 属性(display: none),而不是真正地从 DOM 中移除或添加元素。因此,如果频繁地切换显示和隐藏,可能会影响性能。如果需要频繁地切换显示和隐藏,可以考虑使用 v-if 指令。

五、v-for(用于基于数据源循环渲染元素列表)

Vue 中,使用 v-for 指令来循环渲染列表或数组的元素。

<template><div><ul><li v-for="item in items" :key="item.id">{{ item.name }}</li></ul></div>
</template>

在上面的例子中,我们使用 v-for 指令来循环渲染 items 数组中的每个元素。需要注意的是,我们为每个循环的元素指定了一个唯一的 key 值,这有助于 Vue 跟踪每个元素的身份,以便在进行列表更新时提高性能。

你还可以使用 index 参数访问当前元素在数组中的索引:

<template><div><ul><li v-for="(item, index) in items" :key="item.id">{{ index }} - {{ item.name }}</li></ul></div>
</template>

此外,还可以使用 v-for 指令循环渲染对象的属性:

<template><div><ul><li v-for="(value, key) in user" :key="key">{{ key }}: {{ value }}</li></ul></div>
</template>

在上面的例子中,我们循环渲染了 user 对象的属性,key 代表属性名,value 代表属性值。

除了基本的循环渲染,v-for 还支持使用 of 关键字来替代 in 关键字:

<template><div><ul><li v-for="item of items" :key="item.id">{{ item.name }}</li></ul></div>
</template>

使用 of 关键字的语法更接近 JavaScript 的 for...of 循环。

注意:在 Vue 3 中,v-for 不再支持同时使用 keyindex 参数,如果需要使用索引值,可以通过在循环前手动增加一个计数器变量。

六、v-on(用于绑定事件监听器,可以使用简写的语法 @)

使用v-on指令来监听DOM事件。v-on指令可以用于绑定内联事件处理函数或组件方法。

以下是一些v-on使用示例:

  1. 绑定内联事件处理函数:
<button v-on:click="handleClick">点击按钮</button>
const app = Vue.createApp({methods: {handleClick() {console.log('按钮被点击了');}}
});
app.mount('#app');
  1. 绑定动态事件名:
<button v-on:[eventName]="handleClick">点击按钮</button>
const app = Vue.createApp({data() {return {eventName: 'click'}},methods: {handleClick() {console.log('按钮被点击了');}}
});
app.mount('#app');
  1. 传递事件参数:
<button v-on:click="handleClick('参数')">点击按钮</button>
const app = Vue.createApp({methods: {handleClick(param) {console.log('参数:', param);}}
});
app.mount('#app');

除了使用v-on指令,还可以使用@符号作为v-on的简写形式。

<button @click="handleClick">点击按钮</button>
```在Vue3中,可以使用v-on指令来监听DOM事件。v-on指令可以用于绑定内联事件处理函数或组件方法。以下是一些v-on使用示例:1. 绑定内联事件处理函数:
```html
<button v-on:click="handleClick">点击按钮</button>
const app = Vue.createApp({methods: {handleClick() {console.log('按钮被点击了');}}
});
app.mount('#app');
  1. 绑定动态事件名:
<button v-on:[eventName]="handleClick">点击按钮</button>
const app = Vue.createApp({data() {return {eventName: 'click'}},methods: {handleClick() {console.log('按钮被点击了');}}
});
app.mount('#app');
  1. 传递事件参数:
<button v-on:click="handleClick('参数')">点击按钮</button>
const app = Vue.createApp({methods: {handleClick(param) {console.log('参数:', param);}}
});
app.mount('#app');

除了使用v-on指令,还可以使用@符号作为v-on的简写形式。

<button @click="handleClick">点击按钮</button>

七、v-text(用于将数据绑定到元素的文本内容) (vue3已废弃)

使用 v-text 指令来设置元素的文本内容。

使用 v-text 指令的语法如下:

<div v-text="message"></div>

在上面的示例中,message 是一个 Vue 实例中的 data 属性,它将被渲染到 <div> 元素中作为文本内容。

与使用双大括号插值语法 {{ message }} 不同,v-text 指令会替换元素的全部文本内容,而不只是插入变量的值。这可能对于某些特定的用例更加灵活。

需要注意的是,在 Vue 3 中,v-text 指令已经被废弃,推荐使用双大括号插值语法 {{ message }} 来代替。在 Vue 3 中,你可以使用 v-text 指令来设置元素的文本内容。

使用 v-text 指令的语法如下:

<div v-text="message"></div>

在上面的示例中,message 是一个 Vue 实例中的 data 属性,它将被渲染到 <div> 元素中作为文本内容。

与使用双大括号插值语法 {{ message }} 不同,v-text 指令会替换元素的全部文本内容,而不只是插入变量的值。这可能对于某些特定的用例更加灵活。

需要注意的是,在 Vue 3 中,v-text 指令已经被废弃,推荐使用双大括号插值语法 {{ message }} 来代替。

八、v-html(将数据作为 HTML 解析并渲染)

我们可以使用v-html指令来渲染HTML内容。v-html指令允许我们将一个字符串作为HTML代码来动态地渲染到模板中。

使用v-html指令的语法如下:

<div v-html="htmlContent"></div>

其中,htmlContent是一个包含HTML代码的属性或变量。

需要注意的是,使用v-html指令存在安全风险。因为它会将HTML代码直接渲染到模板中,所以要确保渲染的内容是可信的。如果渲染的内容来自不可信的来源,可能会导致XSS攻击。

为了增加安全性,Vue 3还引入了一个新的API createApp来创建应用实例时可以配置compilerOptions中的isCustomElement属性,以防止未经验证的元素被渲染。例如:

import { createApp } from 'vue';const app = createApp({// ...
});app.config.compilerOptions.isCustomElement = (tag) => tag === 'my-custom-element';

这样,只有<my-custom-element>标签会被认为是安全的自定义元素,并进行渲染,其他未经验证的标签将被忽略。在Vue 3中,我们可以使用v-html指令来渲染HTML内容。v-html指令允许我们将一个字符串作为HTML代码来动态地渲染到模板中。

使用v-html指令的语法如下:

<div v-html="htmlContent"></div>

其中,htmlContent是一个包含HTML代码的属性或变量。

需要注意的是,使用v-html指令存在安全风险。因为它会将HTML代码直接渲染到模板中,所以要确保渲染的内容是可信的。如果渲染的内容来自不可信的来源,可能会导致XSS攻击。

为了增加安全性,Vue 3还引入了一个新的API createApp来创建应用实例时可以配置compilerOptions中的isCustomElement属性,以防止未经验证的元素被渲染。例如:

import { createApp } from 'vue';const app = createApp({// ...
});app.config.compilerOptions.isCustomElement = (tag) => tag === 'my-custom-element';

这样,只有<my-custom-element>标签会被认为是安全的自定义元素,并进行渲染,其他未经验证的标签将被忽略。

九、v-pre(将元素或组件直接渲染为静态内容,不会被当成模板编译)

在 Vue 3 中,可以使用 v-pre 指令来跳过编译过程,将元素或组件直接渲染为静态内容,不会被当成模板编译。这样可以提高性能,特别是对于静态内容较多的场景。

使用方式很简单,只需要在元素或组件上添加 v-pre 属性即可,如下所示:

<template><div v-pre>这是一个静态内容,会直接输出到页面,不会被编译</div>
</template>

在上述代码中,<div> 元素的内容会直接输出到页面,不会被编译成 Vue 的模板。这在一些不需要动态更新的内容上非常有用。

需要注意的是,v-pre 只能用在元素或组件上,不能在表达式或指令中使用。在实际开发中,应该合理使用 v-pre,避免滥用,因为滥用 v-pre 可能会导致代码不易维护和调试。在 Vue 3 中,可以使用 v-pre 指令来跳过编译过程,将元素或组件直接渲染为静态内容,不会被当成模板编译。这样可以提高性能,特别是对于静态内容较多的场景。

使用方式很简单,只需要在元素或组件上添加 v-pre 属性即可,如下所示:

<template><div v-pre>这是一个静态内容,会直接输出到页面,不会被编译</div>
</template>

在上述代码中,<div> 元素的内容会直接输出到页面,不会被编译成 Vue 的模板。这在一些不需要动态更新的内容上非常有用。

需要注意的是,v-pre 只能用在元素或组件上,不能在表达式或指令中使用。在实际开发中,应该合理使用 v-pre,避免滥用,因为滥用 v-pre 可能会导致代码不易维护和调试。

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

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

相关文章

iview table 表格合并行鼠标悬停时的高亮显示

背景&#xff1a; Iview里面的表格没有提供鼠标移入移出的事件。 而且当开启鼠标悬浮高亮的时候会显示异常&#xff0c;并没有高亮合并后的整行&#xff0c;还是高亮子行。 高亮前&#xff1a; 高亮异常情况&#xff1a; 解决后&#xff1a; 解决方案&#xff1a; 一、思路&…

leetcode“位运算”——只出现一次的数字

只出现一次的数字i&#xff1a; https://leetcode.cn/problems/single-number/ 给你一个非空整数数组 nums&#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现一次的元素。 class Solution { public:int singleNumber(vector<i…

RedisTemplate序列化

SpringBoot整合Redis&#xff0c;配置RedisTemplate序列化。如果使用StringRedisTemplate&#xff0c;那么不需要配置序列化&#xff0c;但是StringRedisTemplate只能存储简单的String类型数据&#xff0c;如图&#xff1a; 如果使用StringRedisTemplate存储一个常规对象&#…

4《数据结构》

文章目录 绪论逻辑结构存储结构【物理结构】顺序和链式存储区别顺序表和数组区别数组和链表的区别链表结点概念链表为空条件链表文章http://t.csdnimg.cn/dssVK二叉树B树B树【MYSQL索引默认数据结构】B树和B树区别冒泡排序插排选排快排 绪论 数据结构&#xff1a;研究非数值计…

构建高效PythonWeb:GraphQL+Sanic

1.1 简介&#xff1a;在当今快速发展的技术时代&#xff0c;Web应用的性能和灵活性变得越来越重要。在众多技术中&#xff0c;GraphQL和Sanic以其独特的优势脱颖而出。GraphQL&#xff0c;作为一个强大的数据查询语言&#xff0c;为前端和后端之间的通信提供了极大的灵活性。而…

GPT实战系列-简单聊聊LangChain

GPT实战系列-简单聊聊LangChain LLM大模型相关文章&#xff1a; GPT实战系列-ChatGLM3本地部署CUDA111080Ti显卡24G实战方案 GPT实战系列-Baichuan2本地化部署实战方案 GPT实战系列-大话LLM大模型训练 GPT实战系列-探究GPT等大模型的文本生成 GPT实战系列-Baichuan2等大模…

GPT在地学、GIS、气象、农业、生态、环境等领域中的应用教程

详情点击链接&#xff1a;GPT在地学、GIS、气象、农业、生态、环境等领域中的应用教程 一开启大模型 1 开启大模型 1)大模型的发展历程与最新功能 2)大模型的算法构架与底层逻辑 3)大模型的强大功能与应用场景 4)国内外经典大模型&#xff08;ChatGPT、LLaMA、Gemini、DA…

杨中科 ASP.NET MVC

ASP.NET Core 入门 什么是ASP.NET CORE 1、ASP.NET Core是.NET中做Web开发的框架 2、ASP.NET Core MVC 传统MVC项目&#xff0c;前后端都做在一起 3、ASP.NET Core Web API: 前后端分离、多端开发。(是属于MVC中的一部分) 4、ASPNET Core MVC其实包含Web API&#xff0c;不过…

Excelize 入选“2023开源创新榜”优秀开源项目

近日&#xff0c;由中国科协科学技术传播中心、中国计算机学会、中国通信学会、中国科学院软件研究所共同主办&#xff0c;CSDN 承办的 2023 开源创新榜专家评审会在国家科技传播中心成功举办。Excelize 电子表格文档开源基础库入选“2023开源创新榜”优秀开源项目。 评审委员…

实现在一个文件夹中找到特定名称特点格式的文件

当你要在一个文件夹中查找特定名称和格式的文件时&#xff0c;你可以使用 Python 的 os 和 fnmatch 模块。以下是一个简单的脚本示例&#xff0c;它可以在指定目录中查找文件&#xff1a; import os import fnmatchdef find_files(directory, pattern):"""在指…

突破技术边界:R与jsonlite库探秘www.snapchat.com的数据之旅

概述 Snapchat是一款流行的社交媒体应用&#xff0c;它允许用户发送和接收带有滤镜和贴纸的照片和视频&#xff0c;以及创建和观看故事和发现内容。Snapchat的数据是非常有价值的&#xff0c;因为它可以反映用户的行为、偏好和趋势。然而&#xff0c;Snapchat的数据并不容易获…

【React系列】Portals、Fragment

本文来自#React系列教程&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) Portals 某些情况下&#xff0c;我们希望渲染的内容独立于父组件&#xff0c;甚至是独立于当前挂载到的DOM元素中&am…

《路由与交换技术》---简答题

1、什么是STP&#xff1f;解决什么问题&#xff1f; STP代表生成树协议&#xff08;Spanning Tree Protocol&#xff09;。它是用于在计算机网络中解决环路问题的一种协议。 STP的主要目标是消除环路&#xff0c;保持网络的稳定性和可靠性&#xff0c;同时提供冗余路径以实现网…

matlab如何标定相机内外参和畸变参数

关于内外参矩阵和畸变矩阵可以学习 https://blog.csdn.net/qq_30815237/article/details/87530011?spm1001.2014.3001.5506 在APP中找到 camera Calibrator 点击 Add Images&#xff0c;导入拍照图片。标定20张左右就够了&#xff0c;然后角度变一下&#xff0c;但不需要变太…

【一】使用vue-cli创建vue3的helloworld项目

不再推荐使用vue-cli命令创建vue3的项目&#xff0c;vue-cli 是 Vue 早期推出的一款脚手架&#xff0c;使用 webpack 创建 Vue 项目。后期推荐使用 create-vue&#xff0c;create-vue 是 Vue3 的专用脚手架&#xff0c;使用 vite 创建 Vue3 的项目(关注【二】使用create-vue创建…

Android RecyleView 使用 Gilde 加载图片引发的卡顿问题

Glide 是一个用于 Android 的图片加载和缓存库。它可以帮助开发者快速、高效地加载网络图片、本地文件和视频帧&#xff0c;并且能够自动缓存图片数据&#xff0c;减少网络请求。Glide 具有良好的性能和易用的 API&#xff0c;支持常见的图片加载需求&#xff0c;例如图片压缩、…

Docker使用扩展

日升时奋斗&#xff0c;日落时自省 目录 1、容器 1.1、容器的生命周期 1.1.1、容器OOM 1.1.2、容器异常退出 1.1.3、容器暂停 1.2、容器命令 1.2.1、创建容器 1.2.2、启动容器 1.2.3、容器日志 1.2.4、容器交互 1.2.5、容器停止 1.2.6、扩展 1.3、综合演示 2、存…

超维空间M1无人机使用说明书——21、基于opencv的人脸识别

引言&#xff1a;M1型号无人机不仅提供了yolo进行物体识别&#xff0c;也增加了基于opencv的人脸识别功能包&#xff0c;仅需要启动摄像头和识别节点即可 链接: 源码链接 一、一键启动摄像头和人脸识别节点 roslaunch robot_bringup bringup_face_detect.launch无报错&#…

Cache伪共享

伪共享 什么是伪共享 为了解决计算机系统中主内存与CPU之间运行速度差问题&#xff0c;会在CPU与主内存之间添加一级或者多级高速缓冲存储器(Cache)。 这个Cache一般是被集成到CPU内部的&#xff0c;所以也叫CPU Cache。 在Cache内部是按行存储的&#xff0c;其中每一行称为…

深入理解循环神经网络(RNN)及其变体

目录 前言1 RNN实现顺序记忆1.1 RNN的序列处理能力1.2 梯度问题&#xff1a;RNN的局限性1.3 应对梯度问题的策略 2 RNN变体&#xff1a;解决梯度问题2.1 GRU&#xff08;门控循环单元&#xff09;2.2 LSTM&#xff08;长短期记忆网络&#xff09;2.3 变体优势&#xff1a;处理长…