本文主要是介绍[Vue之style和class、数组更新与检测、条件渲染、事件修饰符],对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
[Vue之style和class、数组更新与检测、条件渲染、事件修饰符]
style和class
数据的双向绑定
语法
:属性名=js变量/js语法
:class='js变量、字符串、js数组、js对象'
:style='js变量、字符串、js数组、js对象'
:自定义属性='js变量、字符串、js数组、js对象'
示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Vue的双向数据绑定</title>
<script src="./js/vue.js"></script>
</head>
-------------类属性-----------------------------------------------------------------
<style>
.color_red{
background: red;
}
.color_blue{
background: blue;
}
.fonta{
font-size: 80px;
}
-------------类属性-----------------------------------------------------------------
</style>
<body>
-----------测试内容-----------------------------------------------------------------
<div id="test">
属性前加冒号表示数据绑定,就可以写js的变量或语法
<div :class="class_obj">我是div</div>
<hr>
<div :style="style_obj">
我是另一个div
</div>
</div>
-----------测试内容-----------------------------------------------------------------
</body>
<script>
var vm = new Vue({
el: '#test',
data: {
// class_obj: 'div_cls_red', //字符串
// class_obj: ['div_cls_red'], //数组 ---用的多
class_obj: {div_cls_red: true}, //对象
// style_obj: 'background: green'// 字符串
// style_obj: [{background:'red'},] //数组,原来的css样式的- 全都使用驼峰替换
style_obj: {background:'yellow'} //原来的css样式的- 全都使用驼峰替换 ---用的多
//Vue.set(vm.style_obj,'fontSize','90px')
},
})
</script>
</html>
style_obj: 'background: blue'// 字符串
style_obj: [{background: 'blue'},] //数组,原来的css样式的- 全都使用驼峰替换
style_obj: {background:'red'} //原来的css样式的- 全都使用驼峰替换 ---用的多
Vue.set(vm.style_obj,'fontSize','80px')
:class='字符串'
var vm = new Vue({
el: '#test',
data: {
class_obj: 'color_red', //字符串
},
})
:class='字符串'的修改
:class='数组'
var vm = new Vue({
el: '#test',
data: {
class_obj:['color_red','fonta'], //数组 ---用的多
},
})
:class='数组'的修改
:class='数组'补充
var vm = new Vue({
el: '#test',
data: {
# 也可以用列表套字典写法
class_obj:[{color_red:true},{fonta:false}],
},
})
:class='数组'补充的修改方式
:class='对象'
var vm = new Vue({
el: '#test',
data: {
class_obj: {color_blue: true,fonta:true}, //对象
},
})
:class='对象'的修改
数组更新与检测
可以检测到变动的数组操作
push:最后位置添加
pop:最后位置删除
shift:第一个位置删除
unshift:第一个位置添加
splice:切片
sort:排序
reverse:反转
检测不到变动的数组操作
filter():过滤
concat():追加另一个数组
slice():
map():
示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>检测与更新</title>
<script src="./js/vue.js"></script>
</head>
<style>
.color_red{
background: red;
}
.color_blue{
background: blue;
}
.fonta{
font-size: 80px;
}
</style>
<body>
<div id="test">
<div :class="class_obj">这是第一个div</div>
</div>
</body>
<script>
var vm = new Vue({
el:'#test',
data:{
name:'刘鹏飞啊',
class_obj: {color_blue: true,},
},
})
</script>
</html>
示例总结
从上面的图可以看出,有些方法,是不会触发 dom 的操作,比如 对象[key] = value 或者 对象.key = value
虽然属性已经设置了,但是没有触发 dom 操作,这个时候就需要用 Vue 的其他方法。
# 一定会触发dom的比较,如果有数据变了。页面没变,使用该方式赋值
Vue.set(vm.class_obj,'fonta',true) # 给 class_obj 的 fonta 属性 赋值 true
Vue.delete(vm.class_obj,'color_blue') # 删除 class_obj 的 color_blue 属性
更新和检测原因
作者重写了相关方法(只重写了一部分方法,但是还有另一部分没有重写)
vue中使用的是虚拟DOM,会和原生的DOM进行比较,然后进行数据的更新,提高数据的刷新速度(虚拟DOM用了diff算法)
条件渲染
指令 |
释义 |
v-if |
相当于: if |
v-else |
相当于:else |
v-else-if |
相当于:else if |
示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>if的使用</title>
<script src="./js/vue.js"></script>
</head>
<style>
</style>
<body>
<div id="app">
<p v-if="type==0">第 1 行</p>
<p v-else-if="type==1">第 2 行</p>
<p v-else-if="type==2">第 3 行</p>
<p v-else>第 4 行</p>
</div>
</body>
<script>
var vm = new Vue({
el:'#test',
data:{
type:1
},
})
</script>
</html>
在上面的基础进行一次变形
<div id="test">
<button @click="addone">这是一个按钮</button>
<p v-if="typea==1">第 1 行</p>
<p v-else-if="typea==2">第 2 行</p>
<p v-else-if="typea==3">第 3 行</p>
<p v-else>第 4 行</p>
</div>
<script>
var vm = new Vue({
el:'#test',
data:{
typea:1
},
methods:{
addone(){
console.log(this.typea)
this.typea=this.typea+1
}
}
})
</script>
v-if+v-for控制购物车显示与否
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>购物车的显示与否</title>
<script src="./js/vue.js"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
</head>
<style>
</style>
<body>
<div id="test" >
<button @click="showtime">这是一个按钮</button>
<table class="table">
<tr>
<td>名字</td>
<td>价钱</td>
</tr>
<tr v-if="shopping.length==0">
<td>没有数据啊</td>
<td>没有数据啊</td>
</tr>
<tr v-else v-for="shop,index in shopping">
<td>{{shop.name}}</td>
<td>{{shop.price}}</td>
</tr>
</table>
</div>
</body>
<script>
var vm = new Vue({
el:'#test',
data:{
shopping: [],
},
methods:{
showtime(){
this.shopping=[
{'name': '番茄', 'price': 20},
{'name': '土豆', 'price': 30},
{'name': '西红柿', 'price': 20},
{'name': '番茄炒西红柿', 'price': 40},
]
}
}
})
</script>
</html>
v-for遍历补充 key
1、vue中涉及到循环,通常能看到,:key="item"
<p v-for="item in 4" :key="item">
<h3>{{ item }}</h3>
</p>
2、vue中使用的是虚拟DOM,会和原生的DOM进行比较,然后进行数据的更新,提高数据的刷新速度
在v-for循环数组、对象时,建议在控件/组件/标签写1个key属性,属性值唯一
页面更新之后,会加速DOM的替换(渲染)
:key="变量"
参考文档 : https://www.zhihu.com/question/61064119
过滤案例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>过滤案例</title>
<script src="./js/vue.js"></script>
</head>
<style>
</style>
<body>
<div id="test">
<input type="text" v-model="serach" @input="showtime">
<p v-for=" msg,index in newlist">第{{index+1}}个是{{msg}}</p>
</div>
</body>
<script>
//数组过滤的使用(1)
// var ages = [32, 33, 16, 40,8,9,17,18];
// var ages_new=ages.filter(function (item) {
// // console.log(item)
// return item >= 18
// })
// console.log(ages_new)
// 使用箭头函数(es6的语法,箭头函数)
// var ages = [32, 33, 16, 40, 8, 9, 17, 18];
// var ages_new = ages.filter(item => {
// return item >= 18
// })
// console.log(ages_new)
var vm = new Vue({
el: '#test',
data: {
serach:'',
baselist:['a','abc','bcd','bdgd','cfdag','cbfd','cwefd','fdoan','fu','fing','liui','linng','lpq','pzx','pmm',],
newlist:[]
},
methods: {
showtime() {
this.newlist = this.baselist.filter(item => {
var num = this.serach.length
if(this.serach === 'all'){
return true
}
if( num === 0){
return false
}
return item.indexOf(this.serach)>-1
})
}
}
})
</script>
</html>
事件修饰符
事件修饰符 |
释义 |
.stop |
只处理自己的事件,父控件冒泡的事件不处理(阻止事件冒泡) |
.self |
只处理自己的事件,子控件冒泡的事件不处理 |
.prevent |
阻止a链接的跳转 |
.once |
事件只会触发一次(适用于抽奖页面) |
使用修饰符时,顺序很重要;相应的代码会以同样的顺序产生
@事件.self @事件.stop
--------------冒泡事件-------------------------------------------------------------
<div id="app">
<div @click.self="one('第一个div')">第一个div
<div @click="one('第一个div里面的div')">第一个div里面的div
<div @click="one('第一个div里面的div里面的div')">第一个div里面的div里面的div</div>
</div>
</div>
</div>
</body>
<script>
var vm = new Vue({
el: '#test',
data: {},
methods:{
one(msg){
console.log(msg)
}
}
})
</script>
div包裹div里面再包裹一层div
如果都有点击事件,点击里层的,会同时触发外层的事件
--------------阻止冒泡------------------------------------------------------
<div @click.self="one('第一个div')">第一个div
<div @click="one('第一个div里面的div')">第一个div里面的div
<div @click.stop="one('第一个div里面的div里面的div')">第一个div里面的div里面的div
</div>
</div>
关于事件.self和事件.stop
.self 是对于子类行为不作为,也就是说子类中有点击事件,自己也有事件,子类如何都不会触发自己的事件。
.stop 是对父类不作为行为,自己和父类都有点击事件,自己触发之后结束,不会冒泡。
@事件.prevent
<div id="test">
<a href="https://github.com/" @click="one(点击了一下a标签)">点我即可</a>
</div>
<script>
var vm = new Vue({
el: '#test',
data: {},
methods:{
one(msg){
console.log(msg)
}
}
})
</script>
先触发了点击事件,然后跳转
事件添加 prevent
<a href="https://github.com/" @click.prevent="one('点击了一下a标签')">点我即可</a>
@事件.once
<div id="test">
<p @click="one">点了 {{serach}} 次</p>
</div>
<script>
var vm = new Vue({
el: '#test',
data: {
serach:1,
},
methods:{
one(){
this.serach+=1
}
}
})
</script>
事件可以一直触发,有时候为了避免这种情况可以用once
<p @click.once="one">点了 {{serach}} 次</p>
这篇关于[Vue之style和class、数组更新与检测、条件渲染、事件修饰符]的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!