文章目录
1、条件渲染
1.1、通过v-if和v-for实现简单购物车
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script src="js/vue.js"></script>
<div id="box">
<h2>根据下标获取对应的水果</h2>
<ul>
<li>{{fruit_list[0]}}</li>
<li>{{fruit_list[1]}}</li>
<li>{{fruit_list[2]}}</li>
<li>{{fruit_list[3]}}</li>
</ul>
<h2>通过循环遍历获取对应的水果</h2>
<ul>
<li v-for="data in fruit_list">{{data}}</li>
</ul>
<h2>根据购物车判断是否存在水果</h2>
<ul v-if="fruit_list.length>0">
<li v-for="data in fruit_list">{{data}}</li> <!--如果fruit_list有值打印水果-->
</ul>
<div v-else>购物车空空如也</div> <!--如果fruit_list为空列表时打印-->
</div>
<script>
var vm = new Vue({
el: '#box',
data: {
fruit_list: ['苹果', '香蕉', '桃子', '哈密瓜'],
},
})
</script>
</body>
</html>
1.2、v-if、v-else-if、v-else的使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script src="js/vue.js"></script>
<div id="box">
<div v-if="number == 1">1</div>
<div v-else-if="number == 2">2</div> <!--在data中number为2,所以打印2-->
<div v-else>3</div>
</div>
<script>
var vm = new Vue({
el: '#box',
data: {
number: 3,
},
})
</script>
</body>
</html>
2、列表渲染
2.1、for循环数组、对象
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script src="js/vue.js"></script>
<div id="box">
<h1>循环数组</h1>
<div>
<p v-for="item in arr">{{item}}</p>
</div>
<h1>循环对象(此处循环得到的是value,python中循环得到的是key)</h1>
<div>
<p v-for="item in obj">{{item}}</p>
</div>
<h1>循环数组的index和value</h1>
<div>
<p v-for="(item,index) in arr">index: {{index}}, value: {{item}}</p>
</div>
<h1>循环对象的key和value</h1>
<div>
<p v-for="(item,key) in obj">key: {{key}}, value: {{item}}</p>
</div>
</div>
<script>
var vm = new Vue({
el: '#box',
data: {
arr: ['篮球', '足球', '羽毛球'],
obj: {name: 'allen', age: 18, gender: 'male'},
},
})
</script>
</body>
</html>
2.2、key值的解释
1、v-for循环数组、对象时,建议在控件(组件,标签)写一个key属性,属性值唯一
2、页面更新以后,加速dom的替换(渲染),虚拟dom的替换diff算法
3、:key="变量"
示例: <p v-for="(item,key) in obj" :key="key(属性值唯一,正常取数据的id对应的属性值)">key: {{key}}, value: {{item}}</p>
2.3、数组更新与检测
1、数据双向绑定,数据变化页面变,页面变化数据变
2、使用以下方法操作数组,可以检测变动:push,pop,shift,unshift,splice,sort,reverse
3、不会检测变动filter(),concat(),slice(),map(),新数组替换旧数组
页面不会更改:vm.arr.concat(['44','55'])
解决vm.arr=vm.arr.concat(['44','55'])
4、页面不会更改:通过索引值更新数组
解决方案一:
vm.arr[0]
"11"
vm.arr[0]='99'
"99"
vm.arr.splice(0,1,'88')
["99"]
解决方案二:
Vue.set(vm.arr,0,'allen')
5、上面能更新是因为作者重写了那些方法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script src="js/vue.js"></script>
<div id="box">
<ul>
<li v-for="data in arr_list">{{data}}</li>
<button @click="clickHandler">点击按钮把篮球换成乒乓球</button>
</ul>
</div>
<script>
var vm = new Vue({
el: '#box',
data: {
arr_list: ['篮球', '足球', '羽毛球']
},
methods: {
clickHandler() {
this.arr_list[0] = '乒乓球'; // 这种方法只能将列表中第一个值改成乒乓球,页面中的li还是篮球
Vue.set(vm.arr_list, 0, '乒乓球'); // 这种方法可以将页面中的li修改成乒乓球
},
}
})
</script>
</body>
</html>
3、事件处理
blur:失去焦点触发
change:失去焦点触发,跟blur一样
input:数据发生变化,就会触发
3.1、input过滤案例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script src="js/vue.js"></script>
<div id="box">
<h1>过滤数据</h1>
<!-- 请输入数据: <input type="text" v-model="mydata" @blur="changeHandler">-->
请输入数据: <input type="text" v-model="mydata" @input="changeHandler">
{{mydata}}
<div>
<ul>
<li v-for="item in new_arrlist">{{item}}</li>
</ul>
</div>
</div>
<script>
var vm = new Vue({
el: '#box',
data: {
arr_list: ['aabbcc', 'abcdef', 'aacdee', 'bbccdd'],
new_arrlist: ['aabbcc', 'abcdef', 'aacdee', 'bbccdd'],
mydata: '',
},
methods: {
changeHandler() {
// 控制arr_list的变化,数据又双向绑定了,页面就会变化
this.new_arrlist = this.arr_list.filter(item => {
return item.indexOf(this.mydata) > -1
})
},
},
})
</script>
</body>
</html>
3.2、简单事件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script src="js/vue.js"></script>
<div id="box">
<div v-show="isShow">
<p>数据1</p>
<p>数据2</p>
<p>数据3</p>
<p>数据4</p>
<p>数据5</p>
</div>
<button @click="isShow=!isShow">点击数据折叠/展开(方式一)</button>
<button @click="clickHandler">点击数据折叠/展开(方式二)</button>
<button @click="clickHandler($event)">点击数据折叠/展开,传递事件,方式二默认也传递事件(方式三)</button>
</div>
<script>
var vm = new Vue({
el: '#box',
data: {
isShow: true,
},
methods: {
clickHandler(ev) {
this.isShow = !this.isShow;
console.log(ev)
},
},
})
</script>
</body>
</html>
3.3、事件修饰符
.stop 阻止事件冒泡
.self 只处理自己的事件,子控件冒泡的事件不处理
.prevent 阻止a链接跳转
.once 只处理一次就解绑(抽奖页面)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script src="js/vue.js"></script>
<div id="box">
<ul @click.self="clickUlHandler"> <!--事件冒泡处理方式三: 给父元素添加.self就不会出现事件冒泡-->
<li v-for="item in arr_list" @click.stop="clickLiHandler">{{item}}</li> <!--事件冒泡处理方式二: .stop就不会出现事件冒泡-->
<li v-for="item in arr_list" @click="clickLiHandler">{{item}}</li>
</ul>
<div>
<a href="http://www.baidu.com" @click="clickHandler">点击但并不想跳转1</a>
<a href="http://www.baidu.com" @click.prevent="clickHandler1">点击但并不想跳转2</a> <!--方式二: 这样设置后点击标签不会跳转-->
</div>
<div>
<button @click.once="clickOnceHandler">点一次事件就消失了</button>
</div>
</div>
<script>
var vm = new Vue({
el: '#box',
data: {
arr_list: ['篮球', '足球', '羽毛球'],
},
methods: {
clickUlHandler() {
console.log('ul被点击了');
},
clickLiHandler(ev) {
// ev.stopPropagation(); // 事件冒泡处理方式一: 这样设置就不会出现事件冒泡,点击事件停止向父组件传递
console.log('li被点击了');
},
clickHandler(ev) {
// ev.preventDefault(); // 方式一: 点击标签并不会跳转,阻止a标签的跳转
},
clickHandler1() {
console.log('被点击了')
},
clickOnceHandler() {
console.log('点一次就消失了')
}
},
})
</script>
</body>
</html>
3.4、按键修饰符
敲击键盘上的按键执行某件事
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script src="js/vue.js"></script>
<div id="box">
敲击回车键(方式一): <input type="text" v-model="myinput" @keyup.enter="KeyHandler">
敲击回车键(方式二): <input type="text" v-model="myinput" @keyup.13="KeyHandler">
</div>
<script>
var vm = new Vue({
el: '#box',
data: {
myinput: '',
},
methods: {
KeyHandler() {
console.log('回车键被按下了')
},
},
})
</script>
</body>
</html>
4、数据双向绑定
4.1、v-model使用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script src="js/vue.js"></script>
<div id="box">
<p><input type="text" v-model="myinput"></p>{{myinput}}
<p><textarea name="" id="" cols="30" rows="10" v-model="mytextarea"></textarea></p>{{mytextarea}}
</div>
<script>
var vm = new Vue({
el: '#box',
data: {
myinput: '',
mytextarea: '',
},
})
</script>
</body>
</html>
5、表单控制
5.1、checkbox选中
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script src="js/vue.js"></script>
<div id="box">
<h1>表单相关之checkbox</h1>
<input type="checkbox" v-model="check">记住密码
</div>
<script>
var vm = new Vue({
el: '#box',
data: {
check: true,
},
})
</script>
</body>
</html>
5.2、多选
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script src="js/vue.js"></script>
<div id="box">
<h1>爱好</h1>
<input type="checkbox" v-model="hobby" value="sport">运动
<input type="checkbox" v-model="hobby" value="reading">阅读
<input type="checkbox" v-model="hobby" value="travel">旅游
<p>{{hobby}}</p>
</div>
<script>
var vm = new Vue({
el: '#box',
data: {
hobby: [],
},
})
</script>
</body>
</html>
5.3、单选
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script src="js/vue.js"></script>
<div id="box">
<h1>性别</h1>
<input type="radio" v-model="gender" value="男">男
<input type="radio" v-model="gender" value="女">女
<input type="radio" v-model="gender" value="保密">保密
<p>{{gender}}</p>
</div>
<script>
var vm = new Vue({
el: '#box',
data: {
gender: '',
},
})
</script>
</body>
</html>
6、 购物车案例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script src="js/vue.js"></script>
<div id="box">
<h1>购物车列表</h1>
<input type="checkbox" v-model="selectAll" @change="CheckHandler">全选/全不选
<ul>
<li v-for="item in data_list">
<input type="checkbox" v-model="my_car" :value="item" @change="handlerOne">
{{item}}
</li>
</ul>
<p>我的购物车清单: {{my_car}}</p>
<p>价格合计: {{get_price()}}</p>
</div>
<script>
var vm = new Vue({
el: '#box',
data: {
data_list: [
{name: '西瓜', price: 10, number: 3, id: '1'},
{name: '苹果', price: 3, number: 4, id: '2'},
{name: '香蕉', price: 80, number: 6, id: '3'}
],
my_car: [],
selectAll: false,
},
methods: {
get_price() {
var total_sum = 0;
for (k in this.my_car) {
total_sum += this.my_car[k]['price'] * this.my_car[k]['number'];
}
return total_sum;
},
CheckHandler() {
if (this.my_car.length > 0) {
this.my_car = []
} else {
this.my_car = this.data_list;
}
},
handlerOne() {
if (this.my_car.length == this.data_list.length) {
this.selectAll = true;
} else {
this.selectAll = false;
}
},
}
})
</script>
</body>
</html>