如果我们需要给元素绑定一个事件
,就使用v-on
指令
基本使用:
在元素标签中v-on:事件类型 = “事件名”,下面以给div绑定点击事件和鼠标移入事件为例:
<div class="box" v-on:click="divClick">div>
<div class="box" v-on:mousemove="mouseMove">div>
语法糖写法:
可以将v-on:
简写为@
,同样以点击事件和鼠标移入事件为例:
<div class="box" @click="divClick">div>
<div class="box" @mousemove="mouseMove">div>
同时绑定多个事件:
元素是可以同时绑定多个事件的,写在一行内即可:
<div class="box" @mousemove="mouseMove" @click="divClick">多个事件绑定div>
如果同时绑定的事件特别多
,建议直接绑定一个对象
:
<div class="box" v-on="{ click: divClick, mousemove: divMove }">div>
v-on的参数传递:
使用@事件类型监听事件传递参数及在methods中定义方法接收参数时,需要注意参数问题
,此处以@click点击事件为例:
$event
传入代码演示:
<body>
<div id="app">
<button @click="btn1Click">按钮1button>
<button @click="btn2Click('sevgilid',18)">按钮2button>
<button @click="btn3Click('sevgilid',18,$event)">按钮3button>
div>
<script src="../js/vue.js">script>
<script>
const app = Vue.createApp({
data() {
return {
message: 'hello vue'
}
},
methods:{
// 1.默认参数:event对象
// 总结:如果在绑定事件的时候,没有传递任何的参数,那么event对象会被默认传递进来
btn1Click(event){
console.log("btn1click",event);
},
// 2.明确参数
btn2Click(name,age){
console.log("btn2click",name,age);
},
// 3.明确参数+event参数
btn3Click(name,age,event){
console.log("btn2click",name,age,event);
}
}
})
app.mount('#app')
script>
body>
基本使用:
条件判断为true时渲染
用法示例:
<body>
<div id="app">
<div class="info" v-if="Object.keys(info).length">
<h2>个人信息h2>
<ul>
<li>
姓名:{{info.name}}li>
<li>年龄:{{info.age}}li>
ul>
div>
<h2 v-else>info里没有数据,无法正确展示信息h2>
div>
<script src="../js/vue.js">script>
<script>
const app = Vue.createApp({
data() {
return {
info:{name:"sevgilid",age:18}
}
}
})
app.mount('#app')
script>
body>
代码演示2:
<body>
<div id="app">
<h1 v-if="socre>90">优秀h1>
<h2 v-else-if="score>80">良好h2>
<h3 v-else-if="score>60">及格h3>
<h4 v-else>不及格的fwh4>
div>
<script src="../js/vue.js">script>
<script>
const app = Vue.createApp({
data() {
return {
score: 30
}
}
})
app.mount('#app')
script>
body>
共同点:
不同点:
用法上不同:
v-show不能和v-else或v-else-if一起使用
;v-show
是不支持template
;本质上的不同:
v-show
来的展示或隐藏是通过CSS的display属性来进行切换的,也就是说其DOM无论如何都是存在的
;v-if的条件为false时
,其对应的原生压根不会被渲染到DOM中
;v-if和v-show的选择:
频繁在显示和隐藏之间进行切换
,使用v-show
;不会频繁的发生切换
,使用v-if
;上述v-if和v-show区别时提到了,v-show是不支持template的,此处的template元素需要单独提出来说一下:
Vue3新出的
用来包裹的元素, 目的是解决Vue2只能用div包裹,页面也会出现过多的html结构的缺点template的作用是模板占位符
,可帮助我们包裹元素,但在循环过程当中,template不会被渲染到页面上
案例体验template:
- 需求:希望同时切换多个元素,通常情况下我们会包裹一个div,但如果并不希望多出一个html结构被渲染;
- 这个时候就可以使用template
<div id="app">
<template v-if="isShow">
<h2>{{ message }}h2>
<h2>{{ message }}h2>
<h2>{{ message }}h2>
<h2>{{ message }}h2>
template>
<template v-else>
<h2>嘎嘎嘎嘎h2>
<h2>嘎嘎嘎嘎h2>
<h2>嘎嘎嘎嘎h2>
<h2>嘎嘎嘎嘎h2>
<h2>嘎嘎嘎嘎h2>
template>
<button @click="buttonClick">点击切换button>
div>
item in 数组
:item
是我们给每项元素起的常用名称,这个名字可以自定义
;v-for遍历数组
代码演示:
<body>
<div id="app">
<ul>
<li v-for="item in movies">{{item}}li>
ul>
div>
<script>
const app = Vue.createApp({
data() {
return {
movies: ["大话西游","盗梦空间","少年的奇幻漂流","一路向西"]
}
}
})
app.mount('#app')
script>
v-for遍历多个参数:
遍历数组时常常需要拿到数组的索引:
<ul>
<li v-for="(item,index) in movies">{{index}}-{{item}}li>
ul>
v-for遍历复杂数据:
在实际开发时,最常见的是遍历从服务器中请求到的复杂的数组:
<body>
<div id="app">
<h2>商品列表h2>
<div class="item" v-for="prodcut in products">
<h3>商品:{{prodcut.name}}h3>
<span>价格:{{prodcut.price}}span>
<p>秒杀:{{prodcut.desc}}p>
div>
div>
<script>
const app = Vue.createApp({
data() {
return {
products:[
{id:110, name:"xiaomiPro", price:9.9, desc:"快来抢购吧"},
{id:112, name:"IphoneX", price:16.6, desc:"速度抢购"},
{id:777, name:"华为电视", price:66.6,desc:"手慢无"}]
}
}
})
app.mount('#app')
script>
v-for其他类型:
代码示例:
<ul>
<li v-for="value in infos">{{ value }}li>
ul>
<ul>
<li v-for="(value, key) in infos">{{ value }}-{{ key }}li>
ul>
<ul>
<li v-for="(value, key, index) in infos">{{ value }}-{{ key }}-{{index}}li>
ul>
v-for中的key:
key属性的作用:
官方的解释对于初学者来说并不好理解,比如下面的问题:
虚拟DOM
其实就是Vue会对于有key和没有key会调用两个不同的方法:
总结:只需要知道使用v-for的使用一定要绑定一个key