首先请通读官方文档
vue官方文档:Class 与 Style 绑定
mpvue官网手册:class-style部分
mpvue不支持 vue官方文档:Class 与 Style 绑定 中的
classObject
和styleObject
语法。
此外还可以用 computed 方法生成 class 或者 style 字符串,插入到页面中
style的使用
- 方法一
- 方法二
computed: {
styleSelect() {
return this.pageName === 'Buddies' ? 'color:#fff;background-color:#0576ff' : '';
}
},
尝试
- 尝试在computed中使用闭包
Buddies
BuddyRecall
styleSelect() {
return function(pageName, nowName) {
console.log('pageName:'+pageName)
console.log('nowName:'+nowName)
return pageName === nowName ? 'color:#fff;background-color:#0576ff' : '';
}
}
结果:
点击第一个li
,样式未改变,Console
如下:
main.js:124 pageName:Buddies
main.js:125 nowName:Buddies
main.js:124 pageName:Buddies
main.js:125 nowName:BuddyRecall
注意:
一次点击两个computed中的方法都执行了
我以为是闭包的问题(该去学习闭包了cry)
- 尝试使用methods
Buddies
BuddyRecall
methods: {
styleSelect() {
console.log(this.pageName)
return this.pageName === 'Buddies' ? 'color:#fff;background-color:#0576ff' : '';
},
},
结果:
点击第一个li
,样式未改变,Console
如下:
main.js:124 Buddies
main.js:124 Buddies
注意:
与使用了闭包的computed方法相同
一次点击两个methods中的方法都执行了
- 尝试computed不使用闭包
Buddies
BuddyRecall
computed: {
styleSelect() {
console.log(this.pageName)
return this.pageName === 'Buddies' ? 'color:#fff;background-color:#0576ff' : '';
},
},
结果:
点击第一个li
,样式都改变,Console
如下:
main.js:123 Buddies
点击第二个li
,样式都未改变,Console
如下:
main.js:123 BuddyRecall
注意:
computed中的方法对应执行一次
- computed 与methods 对比
Buddies
BuddyRecall
computed: {
styleSelect() {
console.log('now:' + this.pageName)
return this.pageName === 'Buddies' ? 'color:#fff;background-color:#0576ff' : 'color:#0576ff;background-color:#fff';
}
},
methods: {
styleSelect1() {
console.log('Now:' + this.pageName)
return this.pageName === 'BuddyRecall' ? 'color:#fff;background-color:#0576ff' : 'color:#0576ff;background-color:#fff';
}
},
结果:
点击第一个li
,样式改变,Console
如下:
main.js:123 now:Buddies
main.js:132 Now:Buddies
点击第二个li
,样式未改变,Console
如下:
now:BuddyRecall
main.js:132 Now:BuddyRecall
注意:
每次点击computed以及methods中的方法都分别执行了,它们依赖的pageName变量每次点击都改变了
分析
- 2和3可以得出 :
mpvue可以用 computed 方法生成 style 字符串,插入到页面中,但不支持 methods- 1和2得出:
“两个标签style中调用同一个methods的方法执行两次问题
因为在style里调用所以页面渲染就会调用(卒),而我在点击事件中描写的方法会使页面重新渲染- computed中使用闭包与methods效果相同,像示例这种每个标签都使其依赖的变量发生改变,而造成重新渲染,失去了computed的特性,因此不建议使用计算属性传参
- 3得出
同一个computed中的方法(非闭包)在两个style中对应执行一次问题,
这是因为
1.计算属性是基于它们的响应式依赖进行缓存的
2.每当触发重新渲染时,调用方法将总会再次执行函数,详情请看Vue官方文档计算属性缓存vs方法
使用style
解决
针对每个标签写对应的style
或者style+computed
方法,可以看出这种方法使得代码太冗余了
Buddies
BuddyRecall
computed: {
styleSelect1() {
return this.pageName === 'Buddies' ? 'color:#fff;background-color:#0576ff' : '';
},
styleSelect2() {
return this.pageName === 'BuddyRecall' ? 'color:#fff;background-color:#0576ff' : '';
}
},
使用Class
解决
方法之类的使用与style
相同,少写了具体的样式属性(推荐)
- Buddies
- BuddyRecall
.activeLi {
color: #fff;
background-color: #0576ff;
}
问题:
若#top-ul>li
中有要修改的属性,则activeLi的优先级较低不生效
#top-ul>li{
color: #0576ff;
}
解决:
- 将冲突的属性挪到父元素内
#top-ul{
color: #0576ff;
}
- 添加冲突的属性至另一个类中(推荐)s
BuddyRecall
.unActiveLi {
color: #0576ff;
}