0

0

Vue基础语法之计算属性、事件监听以及条件渲染(整理分享)

WBOY

WBOY

发布时间:2022-01-26 18:01:33

|

2915人浏览过

|

来源于CSDN

转载

本篇文章给大家总结了vue的基础语法,其中包括计算属性、事件监听、条件渲染、以及列表渲染等等相关问题,希望对大家有帮助。

Vue基础语法之计算属性、事件监听以及条件渲染(整理分享)

Vue笔记二:基础语法

1、 插值(动态内容)

Mustache语法(双大括号)

将data中的文本数据,插入到HTML中,此时数据是响应式的。

Message: {{ msg }}
{{firstName}}{{lastName}}
{{firstName+lastName}}
{{firstName+""+lastName}}
//使用 JavaScript 表达式

{{counter*2}}

{{ number + 1 }}

{{ ok ? 'YES' : 'NO' }}

{{ message.split('').reverse().join('') }}

指令

  • v-once:执行一次性地插值,当数据改变时,插值处的内容不会更新
这个将不会改变: {{ msg }}
  • v-html :解析html并展示
  • v-text:渲染指定dom的内容文本,类似Mustache,一般不用,不够灵活,会覆盖标签内所有内容
  • v-pre:原封不动展示标签内容,不进行解析

{{message}}

结果:{{message}}

  • v-cloak:解决vue解析卡顿会出现{{}}闪烁的问题
    vue解析之前,p有属性v-cloak,解析后没有此属性。
    所以 可以通过这个指令隐藏未编译的 Mustache 标签直到实例准备完毕
  

{{message}}

  

2、绑定属性(动态属性)

v-bind用于绑定一个或多个属性值,或者向另一个组件传递props值。简写为冒号:

立即学习前端免费学习笔记(深入)”;

1、元素的src和href

@@##@@百度

2、class绑定

对象语法

我们可以传给 v-bind:class 一个对象,以动态地切换 class

上面的语法表示 active 这个 class 存在与否将取决于数据 property isActive 的 truthiness。
你可以在对象中传入更多字段来动态切换多个 class。此外,v-bind:class 指令也可以与普通的 class attribute 共存。

data: {
  isActive: true,
  hasError: false}

结果渲染为:

isActive 或者 hasError 变化时,class 列表将相应地更新。例如,如果 hasError 的值为 true,class 列表将变为 "static active text-danger"
绑定的数据对象不必内联定义在模板里,也可以定义在data

data: { classObject: { active: true, 'text-danger': false } }

渲染的结果和上面一样。我们也可以在这里绑定一个返回对象的计算属性。

data: { isActive: true, error: null }, computed: { classObject: function () { return { active: this.isActive && !this.error, 'text-danger': this.error && this.error.type === 'fatal' } } }

返回对象的方法

data: { isActive: true, error: null }, methods: { IsActive() { return { active: this.isActive && !this.error, line:isLine } } }

数组语法

我们可以把一个数组传给 v-bind:class,以应用一个 class 列表:

data: { activeClass: 'active', errorClass: 'text-danger' }

渲染为:

根据条件切换列表中的 class,可以用三元表达式:

这样写将始终添加 errorClass,但是只有在 isActive 是 truthy[1] 时才添加 activeClass

不过,当有多个条件 class 时这样写有些繁琐。所以在数组语法中也可以使用对象语法:

3、 style绑定内联样式

对象语法
v-bind:style 的对象语法十分直观——看着非常像 CSS,但其实是一个 JavaScript 对象。CSS property 名可以用驼峰式 (camelCase) 或短横线分隔 (kebab-case,记得用引号括起来) 来命名:

data: { activeColor: 'red', fontSize: 30 }

直接绑定到一个样式对象通常更好,这会让模板更清晰:

data: { styleObject: { color: 'red', fontSize: '13px' } }

同样的,对象语法常常结合返回对象的计算属性使用。或者方法

//计算属性

//方法

数组语法

v-bind:style 的数组语法可以将多个样式对象应用到同一个元素上:

3、计算属性

在模板中放入太多的逻辑会让模板过重且难以维护,需要对数据进行变化处理后再显示

{{ message.split('').reverse().join('') }}

基础例子

Original message: "{{ message }}"

Computed reversed message: "{{ reversedMessage }}"

结果:

Original message: “Hello”

Computed reversed message: “olleH”

这里我们声明了一个计算属性 reversedMessage。我们提供的函数将用作 property vm.reversedMessage 的 getter 函数:

console.log(vm.reversedMessage) // => 'olleH'vm.message = 'Goodbye'console.log(vm.reversedMessage) // => 'eybdooG'

你可以打开浏览器的控制台,自行修改例子中的 vm。vm.reversedMessage 的值始终取决于 vm.message 的值。
你可以像绑定普通 property 一样在模板中绑定计算属性。Vue 知道 vm.reversedMessage 依赖于 vm.message,因此当 vm.message 发生改变时,所有依赖 vm.reversedMessage 的绑定也会更新。而且最妙的是我们已经以声明的方式创建了这种依赖关系:计算属性的 getter 函数是没有副作用 (side effect) 的,这使它更易于测试和理解。

计算属性的 getter和setter

计算属性默认只有 getter,是只读属性,不过在需要时你也可以提供一个 setter:

// ...computed: {
  fullName: {
    // getter
    get: function () {
      return this.firstName + ' ' + this.lastName    },
    // setter
    set: function (newValue) {
      var names = newValue.split(' ')
      this.firstName = names[0]
      this.lastName = names[names.length - 1]
    }
  }}// ...

现在再运行 vm.fullName = 'John Doe' 时,setter 会被调用,vm.firstNamevm.lastName 也会相应地被更新。

因为计算属性一般没有setter,所以简写为

 fullName:  function () {
      return this.firstName + ' ' + this.lastName }

计算属性 vs 方法
通过在表达式中调用方法也能达到同样的效果

Reversed message: "{{ reversedMessage() }}"

// 在组件中

两种方式的最终结果确实是完全相同的。然而,不同的是计算属性是基于它们的响应式依赖进行缓存的。只在相关响应式依赖发生改变时它们才会重新求值。这就意味着只要 message 还没有发生改变,多次访问 reversedMessage 计算属性会立即返回之前的计算结果,而不必再次执行函数。
这也同样意味着下面的计算属性将不再更新,相比之下,每当触发重新渲染时,调用方法将总会再次执行函数。

计算属性 vs 侦听属性

Vue 提供了一种更通用的方式来观察和响应 Vue 实例上的数据变动:侦听属性

{{ fullName }}

上面代码是命令式且重复的。将它与计算属性的版本进行比较:

var vm = new Vue({
  el: '#demo',
  data: {
    firstName: 'Foo',
    lastName: 'Bar'
  },
  computed: {
    fullName: function () {
      return this.firstName + ' ' + this.lastName    }
  }})

计算属性传参

计算属性本身是不能传参的,但是可以通过闭包传参,但是传参之后没有缓存机制了,和methods没有什么区别,所以官网并没有介绍这个

 computed: {
	  usertype(){
		  return function (value){
			  var user = ''
			  value === 1 ? user = '学生' : user = '老师'
			  return user		  }
	  }
  }

4、事件监听

基础

可以用 v-on 指令监听 DOM 事件,并在触发时运行一些 JavaScript 代码。简写@click
许多事件处理逻辑会更为复杂,因此 v-on 还可以接收一个需要调用的方法名称

The button above has been clicked {{ counter }} times.

参数问题(括号问题)

1、无参



2、有参


 

只需要event对象时,

需要event对象,同时也需要其他对象时,可以用特殊变量 $event 把它传入方法:


几种错误写法


事件修饰符

在事件处理程序中调用 event.preventDefault()event.stopPropagation() 是非常常见的需求。尽管我们可以在方法中轻松实现这点,但更好的方式是:方法只有纯粹的数据逻辑,而不是去处理 DOM 事件细节。

为了解决这个问题,Vue.js 为 v-on 提供了事件修饰符。之前提过,修饰符是由点开头的指令后缀来表示的。



  

...
...
...

1.事件修饰符

  • .stop 阻止事件冒泡,调用event.stopPropagation
 
  • .prevent 阻止事件默认行为,调用event.preventDefault()



 

  • .self 事件绑定的元素本身触发时才触发回调

 
...
  • .once 事件只能触发一次,第二次就不会触发了

不像其它只能对原生的 DOM 事件起作用的修饰符,.once 修饰符还能被用到自定义的组件事件上

  • .native 将一个vue组件变成一个普通的html,使其可以监听click等原生事件,监听组件的原生事件
ok
  • .passive 能够提升移动端的性能。

不要.passive 和 .prevent 一起使用,因为 .prevent 将会被忽略,同时浏览器可能会向你展示一个警告。请记 住,.passive 会告诉浏览器你想阻止事件的默认行为。




...
  • .capture
 
 
...

使用修饰符时,顺序很重要;相应的代码会以同样的顺序产生。因此,用 v-on:click.prevent.self 会阻止所有的点击,而 v-on:click.self.prevent 只会阻止对元素自身的点击。

不要.passive 和 .prevent 一起使用,因为 .prevent 将会被忽略,同时浏览器可能会向你展示一个警告。请记住,.passive 会告诉浏览器你不想阻止事件的默认行为。

5、条件渲染

基础

v-if 指令用于条件性地渲染一块内容。这块内容只会在指令的表达式返回 truthy 值的时候被渲染。

Vue is awesome!

isShow为false时显示

元素上使用 v-if 条件渲染分组

因为 v-if 是一个指令,所以必须将它添加到一个元素上。但是如果想切换多个元素呢?此时可以把一个 元素当做不可见的包裹元素,并在上面使用 v-if。最终的渲染结果将不包含 元素。

v-else-if不常用,用计算属性更好

A
B
C
Not A/B/C

类似于 v-elsev-else-if 也必须紧跟在带 v-if 或者 v-else-if 的元素之后。

key 管理可复用的元素

Vue 会尽可能高效地渲染元素,通常会复用已有元素而不是从头开始渲染。这么做除了使 Vue 变得非常快之外,还有其它一些好处。例如,如果你允许用户在不同的登录方式之间切换:

问题:那么在上面的代码中切换 loginType 将不会清除用户已经输入的内容。

原因:两个模板使用了相同的元素,虚拟DOM渲染时,出于性能考虑 不会被替换掉仅仅是替换了它的 placeholder

解决:添加一个具有唯一值的 key attribute 即可,key不同,不会复用

注意, 元素仍然会被高效地复用,因为它们没有添加 key attribute。

v-show

另一个用于根据条件展示元素的选项是 v-show 指令。用法大致一样:

Hello!

不同的是带有 v-show 的元素始终会被渲染并保留在 DOM 中。v-show 只是简单地切换元素的 CSS 属性display

注意,v-show 不支持 元素,也不支持 v-else

v-if vs v-show

v-if 是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。

v-if 也是惰性的:如果在初始渲染时条件为假,则什么也不做——直到条件第一次变为真时,才会开始渲染条件块。

相比之下,v-show 就简单得多——不管初始条件是什么,元素总是会被渲染,并且只是简单地基于 CSS 进行切换,当条件为false时,仅仅是将元素的display属性设置为none而已。

一般来说,v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销。

因此,如果需要非常频繁地切换,则使用 v-show 较好;如果在运行时条件很少改变,则使用 v-if 较好。

Open Voice OS
Open Voice OS

OpenVoiceOS是一个社区驱动的开源语音AI平台

下载

不推荐同时使用 v-ifv-for。当 v-ifv-for 一起使用时,v-for 具有比 v-if 更高的优先级。

6、列表渲染

6.1 遍历数组

v-for 把一个数组对应为一组元素,v-for 指令需要使用 item in items 形式的特殊语法,其中 items 是源数据数组,而 item 则是被迭代的数组元素的别名

  • {{ item.message }}

结果:

  • Foo
  • Bar

v-for 块中,我们可以访问所有父作用域的 property。v-for 还支持一个可选的第二个参数,即当前项的索引index。

  • {{ parentMessage }} - {{ index }} - {{ item.message }}

结果:

  • Parent - 0 - Foo
  • Parent - 1 - Bar

你也可以用 of 替代 in 作为分隔符,因为它更接近 JavaScript 迭代器的语法:

6.2 遍历对象

你也可以用 v-for 来遍历一个对象的 property。

  • {{ value }}

{{ name }}: {{ value }}

{{ index }}. {{ name }}: {{ value }}

结果:

  • How to do lists in Vue

  • Jane Doe

  • 2016-04-10

title: How to do lists in Vue

author: Jane Doe

publishedAt: 2016-04-10

\0. title: How to do lists in Vue

\1. author: Jane Doe

\2. publishedAt: 2016-04-10

在遍历对象时,会按 Object.keys() 的结果遍历,但是不能保证它的结果在不同的 JavaScript 引擎下都一致。

6.3 维护状态 (key属性)

当 Vue 正在更新使用 v-for 渲染的元素列表时,它默认使用“就地更新”的策略。如果数据项的顺序被改变,Vue 将不会移动 DOM 元素来匹配数据项的顺序,而是就地更新每个元素,并且确保它们在每个索引位置正确渲染(与虚拟DOM和Diff算法有关)。

这个默认的模式是高效的,但是只适用于不依赖子组件状态或临时 DOM 状态 (例如:表单输入值) 的列表渲染输出

为了给 Vue 一个提示,以便它能跟踪每个节点的身份,从而重用和重新排序现有元素,你需要为每项提供一个唯一 key attribute:

建议尽可能在使用 v-for 时提供 key attribute,除非遍历输出的 DOM 内容非常简单,或者是刻意依赖默认行为以获取性能上的提升。因为它是 Vue 识别节点的一个通用机制,key 并不仅与 v-for 特别关联。

不要使用对象或数组之类的非基本类型值作为 v-forkey,请用字符串或数值类型的值。

6.4 数组更新检测

变更方法(数组的哪些方法是响应式的)

变更方法会变更调用了这些方法的原始数组

Vue 将被侦听的数组的变更方法进行了包裹,所以它们也将会触发视图更新。这些被包裹过的方法包括:

  • push() 加元素,this.names.push("aaa","bbb")

  • pop() 删除数组最后一个元素 ,names.pop()

  • shift()删除数组第一个元素

  • unshift()数组最前面添加元素

  • splice()删除/插入/替换元素

    第一个参数为从哪个位置开始删除/插入/替换元素

    删除元素:第二个参数传入要删除几个元素,不传则删除后面所有元素splice(0,2)

    替换元素:第二个元素传入要替换几个元素,后面跟用于替换的元素splice(0,2,’d’,'2')

    插入元素:第二个元素传入0,后面跟要插入的元素splice(0,0,’d’)

  • sort()数组排序

  • reverse()翻转数组

替换数组(高阶函数filter、map、reduce)

非变更方法,例如 filter()concat()slice()。它们不会变更原始数组,而总是返回一个新数组。你可能认为这将导致 Vue 丢弃现有 DOM 并重新渲染整个列表。幸运的是,事实并非如此。Vue 为了使得 DOM 元素得到最大范围的重用而实现了一些智能的启发式方法,所以用一个含有相同元素的数组去替换原来的数组是非常高效的操作。

由于 JavaScript 的限制,Vue 不能检测数组和对象的变化。深入响应式原理中有相关的讨论。

filter()显示过滤/排序后的结果

回调函数必须返回一个boolean值:

返回true时,函数内部会自动将这次回调的n加入到新的数组;返回false时,函数内部将过滤掉这次的n。

有时,我们想要显示一个数组经过过滤或排序后的版本,而不实际变更或重置原始数据。在这种情况下,可以创建一个计算属性,来返回过滤或排序后的数组。例如:

  • {{ n }}
  • 在计算属性不适用的情况下 (例如,在嵌套 v-for 循环中) 你可以使用一个方法:

    • {{ n }}

    map() 映射

    let nums=[ 1, 2, 3, 4, 5 ]let nuwnums=nums.map(function(n){
        return n*2})

    reduce 数组内元素的汇总

    let nums=[ 1, 2, 3, 4, 5 ]//preValue为前一个值,0为初始默认值;n为数组内元素let nuwnums=nums.reduce(function(preValue,n){
        return preValue+n},0)

    [在 v-for 里使用值范围]

    v-for 也可以接受整数。在这种情况下,它会把模板重复对应次数。

    {{ n }}

    结果:

    1 2 3 4 5 6 7 8 9 10

    上使用 v-for

    类似于 v-if,你也可以利用带有 v-for 来循环渲染一段包含多个元素的内容。比如:

    v-forv-if 一同使用

    注意我们推荐在同一元素上使用 v-ifv-for

    当它们处于同一节点,v-for 的优先级比 v-if 更高,这意味着 v-if 将分别重复运行于每个 v-for 循环中。

    7、表单输入绑定v-model

    基础使用

    实现表单元素和数据的双向绑定

    Message is: {{ message }}

    data:{ message:'' }

    原理

    Message is: {{ message }}

    简写:

    v-model 在内部为不同的输入元素使用不同的 property 并抛出不同的事件:

    • text 和 textarea 元素使用 value property 和 input 事件;
    • checkbox 和 radio 使用 checked property 和 change 事件;
    • select 字段将 value 作为 prop 并将 change 作为事件。

    radio单选框

    您选择的性别是{{sex}}

    data:{sex:'女'}

    data中的sex为默认值,其单选按钮因为双向绑定也会默认选中

    单选按钮的互斥:v-model 或者 name=“sex” 放在一个组内

    checkbox复选框

    单个勾选框,绑定到Boolean值

    是否同意协议{{isAgree}}

    data:{isAgree:false}

    多选框,绑定到数组

    篮球足球
    data:{hobbies:[]}

    select选择框

    单选

    选择的水果是{{fruit}}

    data:{fruit:''}

    多选

    选择的水果是{{fruits}}

    data:{fruits:[]}

    修饰符

    .lazy 在输入框输入完内容,光标离开时才更新视图
    .trim 过滤首尾空格
    .number 自动将用户的输入值转为数值类型。如果先输入数字,那它就会限制你输入的只能是数字;如果先输入字符串,那就相当于没有加.number

    用法如下:

    还有很多修饰符比如键盘,鼠标等修饰符

    相关推荐:vue.js视频教程

    Vue基础语法之计算属性、事件监听以及条件渲染(整理分享)

    相关专题

    更多
    Golang gRPC 服务开发与Protobuf实战
    Golang gRPC 服务开发与Protobuf实战

    本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

    6

    2026.01.15

    公务员递补名单公布时间 公务员递补要求
    公务员递补名单公布时间 公务员递补要求

    公务员递补名单公布时间不固定,通常在面试前,由招录单位(如国家知识产权局、海关等)发布,依据是原入围考生放弃资格,会按笔试成绩从高到低递补,递补考生需按公告要求限时确认并提交材料,及时参加面试/体检等后续环节。要求核心是按招录单位公告及时响应、提交材料(确认书、资格复审材料)并准时参加面试。

    35

    2026.01.15

    公务员调剂条件 2026调剂公告时间
    公务员调剂条件 2026调剂公告时间

    (一)符合拟调剂职位所要求的资格条件。 (二)公共科目笔试成绩同时达到拟调剂职位和原报考职位的合格分数线,且考试类别相同。 拟调剂职位设置了专业科目笔试条件的,专业科目笔试成绩还须同时达到合格分数线,且考试类别相同。 (三)未进入原报考职位面试人员名单。

    49

    2026.01.15

    国考成绩查询入口 国考分数公布时间2026
    国考成绩查询入口 国考分数公布时间2026

    笔试成绩查询入口已开通,考生可登录国家公务员局中央机关及其直属机构2026年度考试录用公务员专题网站http://bm.scs.gov.cn/pp/gkweb/core/web/ui/business/examResult/written_result.html,查询笔试成绩和合格分数线,点击“笔试成绩查询”按钮,凭借身份证及准考证进行查询。

    8

    2026.01.15

    Java 桌面应用开发(JavaFX 实战)
    Java 桌面应用开发(JavaFX 实战)

    本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

    65

    2026.01.14

    php与html混编教程大全
    php与html混编教程大全

    本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

    36

    2026.01.13

    PHP 高性能
    PHP 高性能

    本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

    75

    2026.01.13

    MySQL数据库报错常见问题及解决方法大全
    MySQL数据库报错常见问题及解决方法大全

    本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

    20

    2026.01.13

    PHP 文件上传
    PHP 文件上传

    本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

    33

    2026.01.13

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    Vue 教程
    Vue 教程

    共42课时 | 6.5万人学习

    Vue3.x 工具篇--十天技能课堂
    Vue3.x 工具篇--十天技能课堂

    共26课时 | 1.4万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号