vue3 指令详解

news2024/11/15 17:27:44

在这里插入图片描述

系列文章目录

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.coloradmin.cn/o/1365110.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaSE 万字总结知识点(期末复习指南)

目录 一.Java的特性 二.注释 三.数据类型 基本数据类型 包装类 引用数据类型 四.运算符 五.逻辑控制 选择语句 循环语句 六.数组 七.方法 八.类与对象 构造方法 内部类 九.继承和多态 十.抽象类与接口 抽象类 接口 十一.异常 一.Java的特性 Java最初由Sun…

C++中vector的insert参数问题

今天模拟实现vector的过程中&#xff0c;发现pos传参给insert后是不能直接使用的&#xff0c;如果扩容的话&#xff0c;就要更新pos&#xff0c;于是就像用引用来解决这个问题 一般的pos还是能正常传参&#xff0c;但是如果传某容器的迭代器的话&#xff0c;就会报错 原因&…

LeetCode-加一(66)

题目描述&#xff1a; 给定一个由整数组成的非空数组所表示的非负整数&#xff0c;在该数的基础上加一。 最高位数字存放在数组的首位&#xff0c; 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外&#xff0c;这个整数不会以零开头。 思路&#xff1a; 这里主要分…

Go-gin-example 添加注释 第一部分 新建项目及api编写

文章目录 go-gin-example环境准备初始化 Go Modules基础使用 gin 安装测试gin是否引入 gin搭建Blog APIsgo-ini简述配置文件 阶段目标 编写简单API错误码包 完成一个demo初始化项目初始化项目数据库编写项目配置包拉取go-ini配置包在conf目录下新建app.ini文件&#xff0c;写入…

React.Children.map 和 js 的 map 有什么区别?

JavaScript 中的 map 不会对为 null 或者 undefined 的数据进行处理&#xff0c;而 React.Children.map 中的 map 可以处理 React.Children 为 null 或者 undefined 的情况。 React 空节点&#xff1a;可以由null、undefined、false、true创建 import React from reactexport …

详解ajax、fetch、axios的区别

众所周知它们都用来发送请求&#xff0c;其实它们区别还蛮大的。这也是面试中的高频题&#xff0c;本文将详细进行讲解。 1. ajax 英译过来是Aysnchronous JavaScript And XML&#xff0c;直译是异步JS和XML&#xff08;XML类似HTML&#xff0c;但是设计宗旨就为了传输数据&a…

NI基于PC的测量和控制系统

基于PC的测量和控制系统为工程师提供了电气和物理测量功能&#xff0c;使其能够以可自定义、准确且经济实惠的方式进行台式测量. 什么是基于PC的测量和控制系统&#xff1f; 在基于PC的测量和控制系统中&#xff0c;NI硬件产品通过USB或以太网连接到PC或笔记本电脑。这种系统具…

在ultralytics中实现obb检测,官方团队做了哪些修改?

在最新的在ultralytics中,官方团队已经提供了obb检测功能,并发布了相应的预训练模型,其具体使用可以参考。https://blog.csdn.net/a486259/article/details/134557389 1、网络结构 1.1 OBB(Detect) 在ultralytics\nn\modules\head.py中,实现了OBB head,用于在网络head…

致远OA getAjaxDataServlet XXE漏洞复现(QVD-2023-30027)

0x01 产品简介 致远互联-OA 是数字化构建企业数字化协同运营中台,面向企业各种业务场景提供一站式大数据分析解决方案的协同办公软件。 0x02 漏洞概述 致远互联-OA getAjaxDataServlet 接口处存在XML实体注入漏洞,未经身份认证的攻击者可以利用此漏洞读取系统内部敏感文件…

Marvelous Designer 各版本安装指南

Marvelous Designer下载链接 https://pan.baidu.com/s/1ZZCraq6w2Z4JPisND8q0jA?pwd0531 1.鼠标右击【Marvelous Designer 12(64bit)】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;选择【解压到 Marvelous Designer 12(64bit)】。 2.打开解压后的…

软件测试|测试平台开发-Flask 入门:编写第一个简单 Web 应用

简介 Flask 是一个轻量级的 Python Web 框架&#xff0c;它使得创建 Web 应用变得简单快捷。相比于Django框架&#xff0c;它具有以下的优点&#xff1a; 轻&#xff1a;Flask 是一个轻量级的 Web 框架&#xff0c;使用 Python 语言编写易&#xff1a;较其他同类型框架更为灵…

关于burpsuite设置HTTP或者SOCKS代理

使用burpsuite给自己的浏览器做代理&#xff0c;抓包重发这些想必大家都清除 流量请求过程&#xff1a; 本机浏览器 -> burpsuite -> 目标服务器 实质还是本机发出的流量 如果我们想让流量由其他代理服务器发出 实现&#xff1a; 本机浏览器 -> burpsuite -> 某…

Linux程序、进程和计划任务

目录 一.程序和进程 1.程序的概念 2.进程的概念 3.线程的概念 4.单线程与多线程 5.进程的状态 二.查看进程信息相关命令&#xff1a; 1.ps&#xff1a;查看静态进程信息状态 2.top&#xff1a;查看动态进程排名信息 3.pgrep&#xff1a;查看指定进程 4.pstree&#…

图表分析网页模版 大数据可视化大屏电子沙盘合集

项目基于html/css/js&#xff0c;包含行业&#xff1a; 智慧政务 智慧社区 金融行业 智慧交通 智慧门店 智慧大厅 智慧物流 智慧医疗 通用模板 大数据分析平台 项目包含功能 (部分)&#xff1a; 实时数据K线图&#xff08;可自由配置多种行业模式&#xff09; 可切换式大屏展…

linux 01 centos镜像下载,服务器,vmware模拟服务器

https://www.bilibili.com/video/BV1pz4y1D73n?p3&vd_source4ba64cb9b5f8c56f1545096dfddf8822 01.使用的版本 国内主要使用的版本是centos 02.centos镜像下载 这里的是centos7 一.阿里云官网地址&#xff1a;https://www.aliyun.com/ 二. -----【文档与社区】 —【…

HCIA-Datacom题库(自己整理分类的)_11_其他网络协议单选【9道题】

1.DNS协议的主要作用是&#xff1f; 文件传输 远程接入 域名解析 邮件传输 2.下列属于链路状态协议的是? Direct static FTP OSPF 解析&#xff1a; FTP&#xff1a;文件传输协议 OSPF&#xff1a;链路状态路由协议 3.如下图所示的网络主机A通过Telnet登录到路由…

Java环境准备:JDK与IDEA

新手小白学Java–环境准备篇 文章目录 新手小白学Java--环境准备篇第1节 JDK的下载与安装第2节 IDEA的下载与安装第3节 使用IDEA创建第一个Java项目第4节 使用小技巧查看电脑的操作系统版本显示出文件的后缀名IDEA 修改字体大小IDEA 修改显示主题色IDEA 修改单行注释的颜色IDEA…

定时器@Scheduled使用

四种调度方法 Scheduled 是 Spring Boot 中用于创建定时任务的注解。使用此注解可以很方便地实现定时任务的自动调度。以下是常见四种参数的作用&#xff1a; 固定延迟&#xff08;Fixed Delay&#xff09;: Scheduled(fixedDelay 1000)&#xff1a;在上一个任务完成后&#…

STM32---中断

中断框图 一.中断 中断&#xff1a;当有中断请求时&#xff0c;CPU会停止处理当前的任务&#xff0c;转而去处理中断任务。 中断输入线有19/20根&#xff08;互联型号20根&#xff09;。 分类&#xff1a;系统异常&#xff08;10个&#xff09;和外部中断&#xff08;60个&…

thinkphp6入门(15)-- 模型动态构建查询条件

背景 我使用thinkphp6的模型写数据库查询&#xff0c;有多个where条件&#xff0c;但是不确定是否需要添加某个where条件&#xff0c;怎么才能动态得生成查询 链式查询 在ThinkPHP 6中&#xff0c;可以使用链式查询方法来动态地构建查询条件。可以根据参数的值来决定是否添加…