vue模版语法整理(二)

本文详细介绍了Vue中的事件监听,包括v-on指令、参数及修饰符的使用。同时,文章阐述了条件判断语句v-if、v-else-if、v-else及其与v-show的区别。此外,还讲解了v-for循环遍历数组和对象,以及在循环中如何使用key属性。最后,文章提及了检测数组更新的方法,如push、pop、shift、unshift等,并讨论了Vue中key属性对于高效更新虚拟DOM的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

事件监听

  • 在前端开发中,我们需要经常和用于交互。这个时候,我们就必须监听用户发生的时间,比如点击、拖拽、键盘事件等等
  • 在Vue中如何监听事件呢?使用v-on指令

v-on

作用:绑定事件监听器
缩写:@

v-on参数
  • 当通过methods中定义方法,以供@click调用时,需要注意参数问题:

1.事件调用的方法没有参数

<div id="app">
  <button @click="btn1Click()">按钮1</button>
  <button @click="btn1Click">按钮1</button>
</div>
 methods: {
      btn1Click() {
        console.log("btn1Click");
      },
      }

2.在事件定义时, 写方法时省略了小括号, 但是方法本身是需要一个参数的, 这个时候, Vue会默认将浏览器生产的event事件对象作为参数传入到方法

<div id="app">
  <button @click="btn2Click">按钮2</button>
</div>
    methods: {
      btn2Click(event) {
        console.log('--------', event);
      }
    }

在这里插入图片描述
3.方法定义时, 我们需要event对象, 同时又需要其他参数
在调用方式, 如何手动的获取到浏览器参数的event对象: $event

<div id="app">
  <button @click="btn3Click(abc, $event)">按钮3</button>
</div>
  const app = new Vue({
    el: '#app',
    data: {
      message: '你好啊',
      abc: 123
    },
    methods: {
      btn3Click(abc, event) {
        console.log('++++++++', abc, event);
      }
    }
})

在这里插入图片描述
4.如果函数需要参数,但是没有传入, 那么函数的形参为undefined

   function abc(name) {
     console.log(name);
   }
   abc()

在这里插入图片描述

v-on修饰符

Vue提供了修饰符来帮助我们方便的处理一些事件:

  • .stop - 调用 event.stopPropagation()。
  <div @click="divClick">
    aaaaaaa
    <button @click.stop="btnClick">按钮</button>
  </div>
  • prevent - 调用 event.preventDefault()。
  <form action="baidu">
    <input type="submit" value="提交" @click.prevent="submitClick">
  </form>
  • {keyCode | keyAlias} - 只当事件是从特定键触发时才触发回调,监听某个键盘的键帽。
 <input type="text" @keyup.enter="keyUp">
  • native - 监听组件根元素的原生事件。

  • once - 只触发一次回调。

<button @click.once="btn2Click">按钮2</button>

这里具体看我转的这篇文章https://blog.youkuaiyun.com/ShangMY97/article/details/105369663

条件判断

v-if、v-else-if、v-else

JavaScript的条件语句if、else、else if类似。
通过小案例来了解一下

key值的作用
  • Vue在重新渲染页面的时候,会尝试复用页面上已经存在的dom, 给某个元素标签加上key值之后,Vue会认为这是页面上唯一的元素,key值不一样 重新渲染页面的时候,Vue就不会尝试复用了,此处与虚拟dom有关。
  • 根据下面这个小案例来理解就是:没有key值的话我先在账户的文本框中输入内容,在切换到邮箱,里面的内容还会存在,加了key值就清空了
<div id="app">
  <span v-if="isUser">
    <label for="username">用户账号</label>
    <input type="text" id="username" placeholder="用户账号" key="username">
  </span>
  <span v-else>
    <label for="email">用户邮箱</label>
    <input type="text" id="email" placeholder="用户邮箱" key="email">
  </span>
  <button @click="isUser = !isUser">切换类型</button>
</div>

<script>
  const app = new Vue({
    el: '#app',
    data: {
      isUser: true
    }
  })
</script>

在这里插入图片描述
点击按钮
在这里插入图片描述

v-show

v-show的用法和v-if非常相似,也用于决定一个元素是否渲染:
v-if和v-show对比

  • v-if当条件为false时,压根不会有对应的元素在DOM中。
  • v-show当条件为false时,仅仅是将元素的display属性设置为none而已。
  • 当需要在显示与隐藏之间切片很频繁时,使用v-show
  • 当只有一次切换时,通过使用v-if

v-if: 当条件为false时, 包含v-if指令的元素, 根本就不会存在dom中

<div id="app">
  <h2 v-if="isShow" id="aaa">{{message}}</h2>
</div>

v-show: 当条件为false时, v-show只是给我们的元素添加一个行内样式: display: none

 <div id="app">
  <h2 v-show="isShow" id="bbb">{{message}}</h2>
</div>

循环遍历

v-for遍历数组

<script>
  const app = new Vue({
    el: '#app',
    data: {
      names: ['smy', 'kobe', 'james', 'curry']
    }
  })
</script>

1.在遍历的过程中,没有使用索引值(下标值)

<div id="app">
  <ul>
    <li v-for="item in names">{{item}}</li>
  </ul>
</div>

在这里插入图片描述
2.在遍历的过程中, 获取索引值

<div id="app">
  <ul>
    <li v-for="(item, index) in names">
      {{index+1}}.{{item}}
    </li>
  </ul>
</div>

在这里插入图片描述

v-for遍历对象

<script>
  const app = new Vue({
    el: '#app',
    data: {
      info: {
        name: 'why',
        age: 18,
        height: 1.88
      }
    }
  })
</script>

1.在遍历对象的过程中, 如果只是获取一个值, 那么获取到的是value

<div id="app">
  <ul>
    <li v-for="item in info">{{item}}</li>
  </ul>
</div>

在这里插入图片描述
2.获取key和value 格式: (value, key)

<div id="app">
  <ul>
    <li v-for="(value, key) in info">{{value}}-{{key}}</li>
  </ul>
</div>

在这里插入图片描述
3.获取key和value和index 格式: (value, key, index)

<div id="app">
  <ul>
    <li v-for="(value, key, index) in info">{{value}}-{{key}}-{{index}}</li>
  </ul>
</div>

在这里插入图片描述

组件的key属性

为什么需要这个key属性呢(了解)?

  • 这个其实和Vue的虚拟DOM的Diff算法有关系。
  • 这里我们借用React’s diff algorithm中的一张图来简单说明一下:

当某一层有很多相同的节点时,也就是列表节点时,我们希望插入一个新的节点
在这里插入图片描述
在这里插入图片描述

  • 我们希望可以在B和C之间加一个F,Diff算法默认执行起来是这样的。
  • 即把C更新成F,D更新成C,E更新成D,最后再插入E,是不是很没有效率?

所以我们需要使用key来给每个节点做一个唯一标识

  • Diff算法就可以正确的识别此节点
  • 找到正确的位置区插入新的节点。

所以一句话,key的作用主要是为了高效的更新虚拟DOM(理解了上面我说的v-if里的key,两个意思差不多我觉得)

检测数组更新

<div id="app">
  <ul>
    <li v-for="item in letters">{{item}}</li>
  </ul>
  <button @click="btnClick">按钮</button>
</div>
const app = new Vue({
    el: '#app',
    data: {
      letters: ['a', 'b', 'c', 'd']
    },
    methods: {}
})

methods中具体内容

1.push方法

methods: {
  btnClick() {
     this.letters.push('aaaa', 'bbbb', 'cccc')
 }
}

点击按钮后
在这里插入图片描述
2.pop(): 删除数组中的最后一个元素

 methods: {
      btnClick() {
         this.letters.pop();
 	  }
}    

点击按钮后
在这里插入图片描述
3.shift(): 删除数组中的第一个元素

methods: {
      btnClick() {
      	this.letters.shift();
      }
}

在这里插入图片描述
4.unshift(): 在数组最前面添加元素

methods: {
      btnClick() {
      	 this.letters.unshift('aaa', 'bbb', 'ccc')
      }
}

在这里插入图片描述
5.splice作用: 删除元素/插入元素/替换元素

  • 删除元素: 第二个参数传入你要删除几个元素(如果没有传,就删除后面所有的元素)
  • 替换元素: 第二个参数, 表示我们要替换几个元素, 后面是用于替换前面的元素
methods: {
      btnClick() {
      	this.letters.splice(1, 3, 'm', 'n', 'l', 'x')
      }
}

不写mnlx就是直接删除a后三个
在这里插入图片描述

  • 插入元素: 第二个参数, 传入0, 并且后面跟上要插入的元素
methods: {
      btnClick() {
      	this.letters.splice(1, 0, 'x', 'y', 'z')
      }
}

在这里插入图片描述

methods: {
      btnClick() {
        const start = 2
        this.letters.splice(start)
	  }
}

在这里插入图片描述

methods: {
      btnClick() {
        const start = 2
        this.letters.splice(start,this.letters.length-start)
	  }
}

在这里插入图片描述
6.sort(),我们先打乱数组内顺序,点击按钮后重新排序

methods: {
      btnClick() {
      	this.letters.sort()
      }
}

7.reverse()逆序

methods: {
      btnClick() {
      	this.letters.reverse()
      }
}

在这里插入图片描述
8.set(要修改的对象, 索引值, 修改后的值)

methods: {
      btnClick() {
      	Vue.set(this.letters, 0, 'bbbbbb')
      }
}

在这里插入图片描述
9.sum(…num)

function sum(...num) {
    console.log(num);
  }

  sum(20, 30, 40, 50, 601, 111, 122, 33)

在这里插入图片描述
(以上内容根据微博“coderwhy”的vue视频课程整理)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值