Vue 官方文档2.x教程学习笔记
文章目录
- Vue 官方文档2.x教程学习笔记
- 1 基础
- 1.6 Class 与 Style 绑定
- 1.6.1 绑定HTML Class
1 基础
1.6 Class 与 Style 绑定
操作元素的 class 列表和内联样式是数据绑定的一个常见需求。
因为它们都是 attribute,所以我们可以用 v-bind
处理它们:只需要通过表达式计算出字符串结果即可。
不过,字符串拼接麻烦且易错。因此,在将 v-bind
用于 class
和 style
时,Vue.js 做了专门的增强。表达式结果的类型除了字符串之外,还可以是对象或数组。
1.6.1 绑定HTML Class
【对象语法】
我们可以传给 v-bind:class
一个对象,以动态地切换 class:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<div v-bind:class="{active : isActive}">HTMLClass 绑定</div>
</div>
<script src="../js/vue.js"></script>
<script>
var vm = new Vue({
el: '#app',
data: {
isActive: true
}
})
</script>
</body>
</html>
上面的语法表示 active
这个 class 存在与否将取决于数据 property isActive
的 truthiness【真值】。
浏览器效果
也可以在对象中传入更多字段来动态切换多个 class。此外,v-bind:class
指令也可以与普通的 class 属性共存。
当有如下模板:
当 isActive
或者 hasError
变化时,class 列表将相应地更新。
这样子写的话,有点麻烦,绑定的数据对象都内联式的定义在模板里了。
【其实不必【直接封装成一个对象】】
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<div v-bind:class="classObject"></div>
</div>
<script src="../js/vue.js"></script>
<script>
var vm = new Vue({
el: '#app',
data: {
classObject: {
static: true,
active: true,
'text-danger': true
}
}
})
</script>
</body>
</html>
渲染效果
也可以在这里绑定一个返回对象的计算属性。【这是一个常用且强大的模式】
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<div v-bind:class="classObject"></div>
</div>
<script src="../js/vue.js"></script>
<script>
var vm = new Vue({
el: '#app',
data: {
isActive: true,
error: null
},
computed: {
classObject: function (){
return {
active: this.isActive && !this.error,
'text-danger': this.error && this.error.type === 'fatal'
}
}
}
})
</script>
</body>
</html>
渲染效果
【数组语法】
我们可以把一个数组传给 v-bind:class
,以应用一个 class 列表:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<div v-bind:class="[activeClass , errorClass]"></div>
</div>
<script src="../js/vue.js"></script>
<script>
var vm = new Vue({
el: '#app',
data: {
activeClass: 'active',
errorClass: 'text-danger'
}
})
</script>
</body>
</html>
渲染结果
如果想根据条件切换列表中的 class,可以用三元表达式:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<div v-bind:class="[isActive ? activeClass : '', errorClass]"></div>
</div>
<script src="../js/vue.js"></script>
<script>
var vm = new Vue({
el: '#app',
data: {
isActive: false,
activeClass: 'active',
errorClass: 'text-danger'
}
})
</script>
</body>
</html>
这样写将始终添加 errorClass
,但是只有在 isActive
是 truthy【真】时才添加 activeClass
。
不过,当有多个条件 class 时这样写有些繁琐。所以在数组语法中也可以使用对象语法:
<div v-bind:class="[{ active: isActive }, errorClass]"></div>
【用在组件上】
当在一个自定义组件上使用 class
property 时,这些 class 将被添加到该组件的根元素上面。
这个元素上已经存在的 class 不会被覆盖。
[举个栗子]
声明组件:
Vue.component('my-component', {
template: '<p class="foo bar">Hi</p>>'
})
在使用它的时候添加一些class :
最终的渲染结果
嗯,添加到组件的根元素上了。
对于带数据绑定 class 也同样适用:
当 isActive
为 truthy【真】时,HTML 将被渲染成为:
<p class="foo bar active">Hi</p>