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.mfbz.cn/a/300813.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

塑料制品行业生产管理MES系统解决方案

塑料制品产业虽然有一定的规模和基础&#xff0c;但存在自主创新能力低、“散小乱”、品牌效应不明显、行业创新能力与庞大的产业不匹配或支撑不足等问题&#xff0c;塑料加工行业还处在质量型产业的初期&#xff0c;抗风险能力低。 注塑行业6大痛点&#xff1a; 1.生产效率低…

使用 MONAI 加载和保存各种格式的医学图像

本教程属于实战&#xff0c;手把手教你加载各种医学图像数据&#xff08;nii.gz, .dcm, .png等&#xff09;。并学会查看医学图像数据的元数据&#xff08;shape, affine, orientation&#xff09;。学会使用monai全方位了解你的数据&#xff0c;并把它用于之后的深度学习训练。…

IO进程线程day

1.实现互斥机制 #include <head.h>char buf[128]; //全局数组&#xff0c;临界资源//1、创建一个互斥锁 pthread_mutex_t mutex;//定义分支线程 void *task(void *arg) {while(1){//3、获取锁资源pthread_mutex_lock(&mutex);printf("分支线程中&…

字节跳动机器人研究团队:用大规模视频数据训练GR-1,机器人轻松应对复杂任务

最近 GPT 模型在 NLP 领域取得了巨大成功。GPT 模型首先在大规模的数据上预训练&#xff0c;然后在特定的下游任务的数据上微调。大规模的预训练能够帮助模型学习可泛化的特征&#xff0c;进而让其轻松迁移到下游的任务上。 但相比自然语言数据&#xff0c;机器人数据是十分稀…

【学习笔记】1、数字逻辑概论

1.1 数字信号 数字信号&#xff0c;在时间和数值上均是离散的。数字信号的表达方式&#xff1a;二值数字逻辑和逻辑电平描述的数字波形。 &#xff08;1&#xff09; 数字波形的两种类型 数值信号又称为“二值信号”。数字波形又称为“二值位形图”。 什么是一拍 一定的时…

最新ChatGPT网站系统源码+详细搭建部署教程+Midjourney绘画AI绘画

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Ch…

Java学习苦旅(二十三)——二叉搜索树

本篇博客将详细讲解二叉搜索树。 文章目录 二叉搜索树概念操作查找插入删除 性能分析 结尾 二叉搜索树 概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根…

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -全局异常统一处理实现

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

Packet Tracer - Configure AAA Authentication on Cisco Routers

Packet Tracer - 在思科路由器上配置 AAA 认证 地址表 目标 在R1上配置本地用户账户&#xff0c;并使用本地AAA进行控制台和vty线路的身份验证。从R1控制台和PC-A客户端验证本地AAA身份验证功能。配置基于服务器的AAA身份验证&#xff0c;采用TACACS协议。从PC-B客户端验证基…

LeetCode 2807. 在链表中插入最大公约数【链表,迭代,递归】1279

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

Java多线程技术11——ThreadPoolExecutor类的使用1

1 概述 ThreadPoolExecutor类可以非常方便的创建线程池对象&#xff0c;而不需要程序员设计大量的new实例化Thread相关的代码。 2 队列LinkedBlockingQueue的使用 public class Test1 {public static void main(String[] args) {LinkedBlockingQueue queue new LinkedBlocki…

LeetCode-移动零(283)

题目描述&#xff1a; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 思路&#xff1a; 这里的思路跟以前做过的去重复数字的思路有点像&…

字符输入输出 C语言xdoj16

问题描述&#xff1a; 通过键盘输入5个大写字母&#xff0c;输出其对应的小写字母&#xff0c;并在末尾加上“&#xff01;”。 输入说明&#xff1a; 5个大写字母通过键盘输入&#xff0c;字母之间以竖线“|”分隔。 输出说明&#xff1a; 输出5个大写字母对应的小写字母&…

多线程模板应用实现(实践学习笔记)

出处&#xff1a;B站码出名企路 个人笔记&#xff1a;因为是跟着b站的教学视频以及文档初步学习&#xff0c;可能存在诸多的理解有误&#xff0c;对大家仅供借鉴&#xff0c;参考&#xff0c;然后是B站up阳哥的视频&#xff0c;我是跟着他学。大家有兴趣的可以到b站搜索。加油…

webpack的性能优化(一)——分包优化

1.什么是分包&#xff1f;为什么要分包&#xff1f; 默认情况下&#xff0c;Webpack 会将所有代码构建成一个单独的包&#xff0c;这在小型项目通常不会有明显的性能问题&#xff0c;但伴随着项目的推进&#xff0c;包体积逐步增长可能会导致应用的响应耗时越来越长。归根结底这…

【Linux】进程信号——进程信号的概念和介绍、产生信号、四种产生信号方式、阻塞信号、捕捉信号、阻塞和捕捉信号的函数

文章目录 进程信号1.进程信号的概念和介绍2.产生信号2.1通过终端按键产生信号2.2 调用系统函数向进程发信号2.3 由软件条件产生信号2.4硬件异常产生信号 3.阻塞信号3.1信号在内核中的表示3.2信号集操作函数3.3sigprocmask 4.捕捉信号4.1内核如何实现信号的捕捉4.2 sigaction 进…

【AI视野·今日Robot 机器人论文速览 第七十一期】Fri, 5 Jan 2024

AI视野今日CS.Robotics 机器人学论文速览 Fri, 5 Jan 2024 Totally 11 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers Machine Learning in Robotic Ultrasound Imaging: Challenges and Perspectives Authors Yuan Bi, Zhongliang Jiang, Felix D…

线性代数 --- 矩阵行列式的性质

Determinant det A|A| 矩阵的行列式是一个数&#xff0c;这个数能够反应一些关于矩阵的信息。行列式只对方阵有效。 若矩阵A为&#xff1a; 则A的行列式为&#xff1a; 性质1&#xff1a; 单位矩阵的行列式等于1 性质2&#xff1a;行与行之间的交换会改变det的正负号 以2x2单位…

Mybatis入门源码二:sql执行

后面开始分析sql执行的源码流程也就是这一部分 一、factory.openSession() 重点关注configuration.newExecutor这个方法&#xff0c;获取事务处理器比较简单&#xff0c;就是获取一个jdbc的事务管理器。 这个方法通过传入的执行器类型来创建不同的执行器&#xff0c;有simp…

x-cmd pkg | trdsql - 能对 CSV、LTSV、JSON 和 TBLN 执行 SQL 查询的工具

目录 简介首次用户技术特点竞品和相关作品进一步阅读 简介 trdsql 是一个使用 sql 作为 DSL 的强大工具: 采用 SQL 对 CSV、LTSV、JSON 和 TBLN 文件执行查询与 MySQL&#xff0c;Postgresql&#xff0c;Sqlite 的 Driver 协同&#xff0c;可以实现对应数据库的表与文件的 JO…