用到的代码: https://github.com/liyang1234...
vue.js API传送门: https://cn.vuejs.org/v2/api/
v-on指令
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>v-on指令</title>
</head>
<body>
<div id="app">
<button v-on:click="clickhandler">btn</button>
</div>
<script src="vue.min.js"></script>
<script>
let vm = new Vue({
el: '#app',
data: {},
methods: {
clickhandler(){
console.log(Math.random());
}
}
});
</script>
</body>
</html>
点击按钮产生了随机数,v-on:可以用@代替。
点击按钮,数字自增
<div id="app">
<button v-on:click="clickhandler">btn</button>
<h1>{{num}}</h1>
</div>
<script src="vue.min.js"></script>
<script>
let vm = new Vue({
el: '#app',
data: {
num: 0
},
methods: {
clickhandler(){
this. num++;
}
}
});
</script>
点击按钮数字增加
但是有时候我们是要传参数的
<div id="app">
<button v-on:click="clickhandler(2)">btn</button> <!-- 相当于函数调用 2是实参 -->
<h1 v-text="num"></h1>
</div>
<script src="vue.min.js"></script>
<script>
let vm = new Vue({
el: '#app',
data: {
num: 0
},
methods: {//相当于函数声明
clickhandler(n){
this. num += n;
}
}
});
</script>
这样就是每点击一次增加2
获取事件源用$event
<div id="app">
<button v-on:click="clickhandler(2,$event)">btn</button> <!-- 相当于函数调用 2是实参 -->
<h1 v-text="num"></h1>
</div>
<script src="vue.min.js"></script>
<script>
let vm = new Vue({
el: '#app',
data: {
num: 0
},
methods: {//相当于函数声明
clickhandler(n,e){
this. num += n;
console.log(e);
}
}
});
</script>
可以在按钮上绑定多个事件
<div id="app">
<button v-on:click="clickhandler(2,$event)">btn</button> <!-- 相当于函数调用 2是实参 -->
<h1 v-text="num"></h1>
<button v-on="{mousedown: doThis, mouseup: doThat}">btn2</button>
</div>
<script src="vue.min.js"></script>
<script>
let vm = new Vue({
el: '#app',
data: {
num: 0
},
methods: {//相当于函数声明
clickhandler(n,e){
this. num += n;
console.log(e);
},
doThis(e){
console.log('doThis');
},
doThat(e){
console.log('doThat');
}
}
});
</script>
按下鼠标输出doThis 放开鼠标输出doThat
冒泡
<style>
#div1{
width: 400px;
height: 400px;
background: red;
}
#div2{
width: 200px;
height: 200px;
background: green;
}
</style>
</head>
<body>
<div id="app">
<button v-on:click="clickhandler(2,$event)">btn</button> <!-- 相当于函数调用 2是实参 -->
<h1 v-text="num"></h1>
<button v-on="{mousedown: doThis, mouseup: doThat}">btn2</button>
<div id="div1" @click="clickDiv1">
<div id="div2" @click="clickDiv2"></div>
</div>
</div>
<script src="vue.min.js"></script>
<script>
let vm = new Vue({
el: '#app',
data: {
num: 0
},
methods: {//相当于函数声明
clickhandler(n,e){
this. num += n;
console.log(e);
},
doThis(e){
console.log('doThis');
},
doThat(e){
console.log('doThat');
},
clickDiv1(){
console.log('div1');
},
clickDiv2(){
console.log('div2');
}
}
});
</script>
点击div2 再点击div1
先捕获后冒泡,冒泡从里往外,先输出div2,再输出div1。
阻止冒泡
<div id="div1" @click="clickDiv1">
<div id="div2" @click="clickDiv2($event)"></div>
</div>
clickDiv1(){
console.log('div1');
},
clickDiv2(e){
console.log('div2');
e.stopPropagation();
}
点击div2,只输出div2
使用vue的方法 @click.stop
<div id="div1" @click="clickDiv1">
<div id="div2" @click.stop="clickDiv2($event)"></div>
</div>
clickDiv1(){
console.log('div1');
},
clickDiv2(e){
console.log('div2');
}
同样可以阻止冒泡
阻止浏览器默认行为
baidu
点击超链接会默认跳转到百度网页,
<a href="http://www.baidu.com" @click="baidu($event)">baidu</a>
baidu(e){
e.preventDefault();
}
点击超链接之后不会跳转了
vue提供的修饰符 .prevent
<a href="http://www.baidu.com" @click.prevent="baidu($event)">baidu</a>
同样能阻止默认行为
两个修饰符可以连着写
<a href="http://www.baidu.com" @click.stop.prevent="baidu($event)">baidu</a>
<input type="text" @keyup="keyuphandler($event)">
keyuphandler(e){
if(e.keyCode == 13){//13是回车
console.log('hahahahh');
}
}
当在输入框中按回车键时,输出一串 。。。
keyCode总结:https://www.cnblogs.com/daysm...
.once修饰符表示只能一次
<button v-on:click.once="clickhandler(2,$event)">btn</button>
按钮只能点击一次
v-model指令
原理
<div id="app">
用户名: <input type="text" v-model="username">
<h4>用户名是:{{username}}</h4>
</div>
<script src=vue.min.js></script>
<script>
new Vue({
el: '#app',
data: {
username: ''
}
});
</script>
input框里输入什么就显示什么
原理:<input>相当于View层,通过v-model绑定上data里面的username,将数据自动同步到Model层,双花括号将两者联系起来,Model层将数据同步到“用户名是:”的View层,这就是双向数据绑定。
v-model只限制于能使用的标签:<input><select><textarea>
v-model自动将radio设成单选
性别: <input type="radio">男
<input type="radio">女
现在是单选框可以多选
性别: <input type="radio" name="sex">男
<input type="radio" name="sex">女
添加name属性可以实现单选
现在用v-model试一下
性别: <input type="radio" value="男" v-model="sex">男
<input type="radio" value="女" v-model="sex">女
<h4>用户的性别是:{{sex}}</h4>
后台接收数据接的是value
多选框
爱好:<input type="checkbox" value="篮球" v-model="hobbys">篮球
<input type="checkbox" value="足球" v-model="hobbys">足球
<input type="checkbox" value="排球" v-model="hobbys">排球
<h4>用户的爱好是:{{hobbys}}</h4>
data: {
hobbys:[]
}
下拉列表
公司:<select name="" id="" v-model="company">
<option value="百度">百度</option>
<option value="百度">阿里巴巴</option>
<option value="百度">腾讯</option>
</select>
<h4>用户的公司是:{{company}}</h4>
data:{
company:' '
}
textarea
<textarea value="自我介绍" cols="30" rows="10" id="" v-model="description"></textarea>
<h4>我的描述是:{{description}}</h4>
data: {
description:''
}
几个修饰符
.lazy 当鼠标挪出input框的时候才回显
用户名: <input type="text" v-model="username">
<h4>用户名是:{{username}}</h4>
用户名lazy: <input type="text" v-model.lazy="username">
<h4>用户名是:{{username}}</h4>
.number
年龄:<input type="text" v-model="age">
<h4>用户的年龄是:{{age}}</h4>
得到的数据类型是 string
年龄:<input type="text" v-model.number="age">
<h4>用户的年龄是:{{age}}</h4>
得到的数据类型是 number
将type改成number,输入框可以有增加减少功能
年龄:<input type="number" v-model.number="age">
<h4>用户的年龄是:{{age}}</h4>
.trim去掉首尾空格
用户名trim: <input type="text" v-model.trim="username">
<h4>用户名是:{{username}}</h4>
v-bind绑定属性
<body>
<div id="app">
<img src="imgSrc" alt="">
</div>
<script src="vue.min.js"></script>
<script>
new Vue({
el: '#app',
data: {
imgSrc: 'https://cn.vuejs.org/images/logo.png'
}
});
想把ImgSrc的地址作为img标签中的图片,但是会报错:
<img v-bind:src="imgSrc" alt="">OK了
v-bind的简写形式是冒号:
小例子
.aa{
width: 100px;
height: 100px;
background: #F00;
}
<div class="aa"></div>
.aa{
width: 100px;
height: 100px;
background: #F00;
}
v-bind的方式
.aa{
width: 100px;
height: 100px;
background: #F00;
}
<div :class="className"></div>
data:{
className:'aa'
}
值控制是否显示
.aa{
width: 100px;
height: 100px;
background: #F00;
}
<div :class="className"></div>
<div :class="{aa:isAA}"></div>
data:{
isAA: true
}
意思是样式显示取决于isAA是否为true
样式写在对象中
<div :style="styleObj"></div>
styleObj: {
width: '100px',
height: '100px',
background: '#0f0'
}
其他指令
v-pre指令原样输出
<body>
<div id="app">
<h1>{{msg}}</h1>
</div>
<script src="vue.min.js"></script>
<script>
new Vue({
el: '#app',
data: {
msg: 'Hello'
}
});
</script>
<h1 v-pre>{{msg}}</h1>
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。