数据绑定的一个常见需求场景是操纵元素的 CSS class 列表和内联样式。因为 class 和 style 都是 attribute,我们可以和其他 attribute 一样使用 v-bind 将它们和动态的字符串绑定。但是,在处理比较复杂的绑定时,通过拼接生成字符串是麻烦且易出错的。因此,Vue 专门为 class 和 style 的 v-bind 用法提供了特殊的功能增强。除了字符串外,表达式的值也可以是对象或数组。

2.4.1 class 绑定

2.4.1.1 绑定字符串

适用于样式的名字不确定,需要动态指定。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>class 绑定字符串形式</title>
  6. <script src="../js/vue.js"></script>
  7. <style>
  8. .static{
  9. border: 1px solid black;
  10. background-color: beige;
  11. }
  12. .big{
  13. width: 200px;
  14. height: 200px;
  15. }
  16. .small{
  17. width: 100px;
  18. height: 100px;
  19. }
  20. </style>
  21. </head>
  22. <body>
  23. <div id="app">
  24. <h1>{{msg}}</h1>
  25. <div class="static" :class="c1"></div>
  26. </div>
  27. <script>
  28. const vm = new Vue({
  29. el : '#app',
  30. data : {
  31. msg : 'class 绑定字符串形式',
  32. c1 : 'small'
  33. }
  34. })
  35. </script>
  36. </body>
  37. </html>

运行效果:
image.png
使用 vue 开发者工具修改 c1 的 small 为 big:
image.png
通过测试可以看到样式完成了动态的切换。

2.4.1.2 绑定数组

适用于绑定的样式名字不确定,并且个数也不确定。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>class 绑定数组形式</title>
  6. <script src="../js/vue.js"></script>
  7. <style>
  8. .static{
  9. border: 1px solid black;
  10. }
  11. .active{
  12. background-color: green;
  13. }
  14. .text-danger{
  15. color: red;
  16. }
  17. </style>
  18. </head>
  19. <body>
  20. <div id="app">
  21. <h1>{{msg}}</h1>
  22. <div class="static" :class="['active','text-danger']">
  23. 数组形式</div>
  24. <br><br>
  25. <div class="static" :class="[activeClass,errorClass]">
  26. 数组形式</div>
  27. <br><br>
  28. <div class="static" :class="classArray">数组形式</div>
  29. </div>
  30. <script>
  31. const vm = new Vue({
  32. el : '#app',
  33. data : {
  34. msg : 'class 绑定数组形式',
  35. activeClass : 'active',
  36. errorClass : 'text-danger',
  37. classArray : ['active', 'text-danger']
  38. }
  39. })
  40. </script>
  41. </body>
  42. </html>

运行效果:
image.png
使用 vue 开发者工具删除数组中的一个样式:
image.png

2.4.1.3 绑定对象

适用于样式名字和个数都确定,但是要动态决定用或者不用。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>class 绑定对象形式</title>
  6. <script src="../js/vue.js"></script>
  7. <style>
  8. .static{
  9. border: 1px solid black;
  10. }
  11. .active{
  12. background-color: green;
  13. }
  14. .text-danger{
  15. color: red;
  16. }
  17. </style>
  18. </head>
  19. <body>
  20. <div id="app">
  21. <h1>{{msg}}</h1>
  22. <div class="static" :class="{active : true, 'text-dang
  23. : true}">对象形式</div>
  24. <br><br>
  25. <div class="static" :class="classObject">对象形式
  26. iv>
  27. </div>
  28. <script>
  29. const vm = new Vue({
  30. el : '#app',
  31. data : {
  32. msg : 'class 绑定对象形式',
  33. classObject : {
  34. active : true,
  35. 'text-danger' : false
  36. }
  37. }
  38. })
  39. </script>
  40. </body>
  41. </html>

运行效果:
image.png
使用 vue 开发者工具修改 text-danger 为 true:
image.png

2.4.2 style 绑定

2.4.2.1 绑定对象

  1. <div id="app">
  2. <h1>{{msg}}</h1>
  3. <!-- 静态写法 -->
  4. <div class="static" style="font-size: 20px;">对象形式
  5. </div><br><br>
  6. <!-- 动态写法 1 -->
  7. <div class="static" :style="{fontSize: 40 + 'px'}">对象形式
  8. </div><br><br>
  9. <!-- 动态写法 2 -->
  10. <div class="static" :style="styleObject">对象形式
  11. </div><br><br>
  12. </div>
  13. <script>
  14. const vm = new Vue({
  15. el : '#app',
  16. data : {
  17. msg : 'style 绑定对象形式',
  18. styleObject : {
  19. fontSize : '40px'
  20. }
  21. }
  22. })
  23. </script>

2.4.2.2 绑定数组

  1. <div id="app">
  2. <h1>{{msg}}</h1>
  3. <!-- 静态写法 -->
  4. <div class="static" style="font-size: 40px; color: red;">
  5. 组形式</div><br><br>
  6. <!-- 动态写法 1 -->
  7. <div class="static" :style="[{fontSize:'40px'},{color:'red
  8. '}]">数组形式</div><br><br>
  9. <!-- 动态写法 2 -->
  10. <div class="static" :style="styleArray">对象形式
  11. </div><br><br>
  12. </div>
  13. <script>
  14. const vm = new Vue({
  15. el : '#app',
  16. data : {
  17. msg : 'style 绑定对象形式',
  18. styleArray : [
  19. {fontSize:'40px'},
  20. {color:'red'}
  21. ]
  22. }
  23. })
  24. </script>