1、事件监听
1.1、v-on的基本使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../../js/vue.js"></script>
</head>
<body>
<div id="app">
<h2>{{message}}</h2>
<!--第一种:处理普通的操作-->
<!--
<button v-on:click="message++">+</button>
<button v-on:click="message--">-</button>
-->
<!--第二种:可以处理复杂的操作-->
<!--
<button v-on:click="add">+</button>
<button v-on:click="sub">-</button>
-->
<!--第三种:语法糖写法-->
<button @click="add">+</button>
<button @click="sub">-</button>
</div>
<script>
let vm = new Vue({
el: '#app',
data: {
message: '0'
},
methods: {
add() {
return this.message++;
},
sub() {
return this.message--;
}
}
});
</script>
</body>
</html>
1.2、v-on传参问题
- 在不需要传参时,可以省略括号,需要传参时,在括号内传参。
<div id="app">
<!--1、不需要传入方法时,可以省略括号-->
<button @click="btn1click">按钮一:有()</button><br/><br/>
<button @click="btn1click">按钮一:无()</button><br/><br/>
<!--2、需要传入参数时,传入数字时不加单引号也会直接解析成number类型
传入符合规范的名字,但没有加单引号时vue会解析为变量去data找,找不到则报错
-->
<!--传入普通值时,显示普通值,传入this,则当前(el)dom对象-->
<button @click="btn2click('abc')">按钮二:传参</button><br/><br/>
<!--不传值,但显示括号不会报错,需要传的值为undefined-->
<button @click="btn2click()">按钮二:不传参,有括号</button><br/><br/>
<!--不传值,也不显示括号,vue默认会将浏览器生成的event事件作为参数传入-->
<button @click="btn2click">按钮二:不传参,无括号</button><br/><br/>
<!--3、既传入event事件,又传入普通参数-->
<!--什么都不填,则默认第一个传入event对象,第二个传入undefined-->
<button @click="btn3click">按钮三:无括号</button><br/><br/>
<!--传入$event则表示传入的传入为event事件对象-->
<button @click="btn3click('abc',$event)">按钮三:有括号</button>
</div>
<script>
let vm = new Vue({
el: '#app',
data: {
message: ''
},
methods: {
btn1click(){
console.log("点击了btn1");
},
btn2click(name){
console.log("btn2传入的参数值为:",name);
},
btn3click(name,event){
console.log("btn3传入的参数值为:",name,event);
}
}
});
</script>
第一种情况:
第二种情况:
第三种情况:
1.3、v-on修饰符
<div id="app">
<div @click.stop="btnDIV">
<!-- .stop阻止冒泡操作,就是内部元素在点击时,外部元素存在点击事件时也会触发 -->
<button @click.stop="btnButton">点我</button>
<!--压制原有元素的作用,如压制a标签使其提交表单-->
<a class="a_submit" href="#" @click.prevent="aButton">点我</a>
<!--压制默认行为,使其不让表单提交-->
<form @submit.prevent></form>
<!--串联操作-->
<button @click.stop.prevent></button>
<!--键修饰符,监听enter键,还可以使用按键的代码进行监听(像ASCII码)-->
<input @keyup.stop.enter="enterInput"/>
<!--只有第一次点击起作用,后面的无效-->
<button @click.once="buttonOnce"></button>
</div>
</div>
<script>
let vm = new Vue({
el: '#app',
data: {
message: ''
},
methods: {
btnButton() {
console.log("btnButton");
}, btnDIV() {
console.log("btnDIV");
}, aButton() {
$(this).submit();
},enterInput(){
console.log("enterInput");
},buttonOnce(){
console.log("buttonOnce");
}
}
});
</script>
.native:是组件可以操作,未加组件不是不能实现点击等事件。
2、条件判断
2.1、v-if的使用
<div id="app">
<h2 v-if="isShow">{{message}}</h2>
</div>
<script>
let vm = new Vue({
el: '#app',
data: {
message: '为true则显示我',
isShow: false
},
methods: {}
});
</script>
2.2、v-if和v-else的使用
<div id="app">
<h2 v-if="isShow">{{showContent}}</h2>
<h2 v-else>{{hideContent}}</h2>
</div>
<script>
let vm = new Vue({
el: '#app',
data: {
showContent: '为true则显示我',
hideContent: '为false则显示我',
isShow: false
},
methods: {}
});
</script>
3、v-if和v-else-if和v-else的使用
使用标签:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>条件判断</title>
<style>
h2{
display: inline-block;
}
</style>
<script src="../../js/vue.js"></script>
</head>
<body>
<div id="app"><h2>您的成绩:</h2>
<h2 v-if="score>=90">优秀</h2>
<h2 v-else-if="score>=80">良好</h2>
<h2 v-else-if="score>=70">一般</h2>
<h2 v-else-if="score>=60">及格</h2>
<h2 v-else>差劲</h2>
</div>
<script>
let vm = new Vue({
el: '#app',
data: {
score: 90
},
methods: {}
});
</script>
</body>
</html>
使用计算属性:
<div id="app">
<h2>您的成绩:{{result}}</h2>
</div>
<script>
let vm = new Vue({
el: '#app',
data: {
score: 90
},
computed: {
result() {
if (this.score >= 90) {
return "优秀";
} else if (this.score >= 80) {
return "良好";
} else if (this.score >= 70) {
return "一般";
} else if (this.score >= 60) {
return "及格";
} else {
return "差劲";
}
}
}
});
</script>
2.4、实战小案例
2.4.1、实现
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../../js/vue.js"></script>
</head>
<body>
<div id="app">
<span v-if="isUser">
<label for="username">用户账号:</label>
<input type="text" placeholder="用户账号" id="username">
</span>
<span v-else>
<label for="email">用户邮箱:</label>
<input type="text" placeholder="用户邮箱" id="email">
</span>
<button @click="isUser = !isUser">切换样式</button>
</div>
<script>
let vm = new Vue({
el: '#app',
.
message: '',
isUser :true
},
methods: {}
});
</script>
</body>
</html>
8.4.2、小问题
- 当点击切换样式时,用户输入的数据库不会被清空。
原理:
- vue内部存在一个虚拟DOM,虚拟DOM不会直接把需要加载的html输出,而是先在虚拟DOM中渲染。
- 如果存在两个相同的标签,并且不会同时显示时(v-if和v-else),它会处于对性能的考虑,对于标签进行复用。
- vue不会删除标签再重新创建标签,而是将两个标签进行比对,只修改不同的地方(属性),在将不同的数据重新渲染到已存在的标签上,用户的数据vue不会做修改。
- 虚拟DOM使用patch()函数将数据渲染到视图上。
解决方案:设置两个不同的key,即可解决用户输入数据不被处理的问题。
- 使用不同key就不会服复用了。
2.5、v-show
- 和v-if有同样效果,但是实现的方式不同:
- v-if:为false直接从DOM中删除,为true再加回来。
- v-show:为false使用display:none隐藏,为true则删除display:none。
- 开发选择:
- 当显示和隐藏切换频繁时,使用v-show。
- 当显示和隐藏切换不频繁,只有一次时,使用v-if。
<body>
<div id="app">
<h2 v-if="isShow">你好</h2>
<h2 v-show="isShow">你好</h2>
</div>
<script>
let vm = new Vue({
el: '#app',
data:{
isShow:true
}
});
</script>
</body>