Vue.js实战学习-v-bind及class与style绑定

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/YKiOS/article/details/88732503

一. 了解v-bind指令

       前面两章已经了解了v-bind的基本用法以及它的语法糖,它的主要用法是动态更新HTML元素上的属性。示例如下:

<div id="app">
    <a v-bind:href="url">链接</a>
    <img v-bind:src="imgUrl">
    <!-- 缩写为 -->>
    <a :href="url">链接</a>
    <img :src="imgUrl">
</div>
<script>
    var app = new Vue ({
       el: '#app',
       data: {
           url: 'https://www.github.com',
           imgUrl: 'http://xxx.xxx.xx/img.png'
       }  
    })
</script>

       链接的href属性和图片的src属性都被动态设置了,当数据变化时,就会重新渲染。

       在数据绑定中,最常见的两个需求就是元素的样式名称class和内联样式style的动态绑定,它们也是HTML的属性,因此可以使用v-bind指令。我们只需要用v-bind计算出表达式最终的字符串就可以,不过有时候表达式的逻辑较复杂,使用字符串拼接方法较难阅读和维护,所以Vue.js增强了对class和style的绑定。

二. 绑定class的几种方式

     1. 对象语法

        给v-bind:class 设置一个对象,可以动态地切换class,如:

<div id="app">
    <div :class="{ 'active': isActive }"></div>
</div>
<script>
    var app = new Vue ({
        el:'#app',
        data: {
            isActive: true
        }
     })
</script>

       上面示例中,类名active依赖于数据isActive,当其为true时,div会拥有类名Active,为false时则没有,所以上例最终渲染完的结果是:      

<div class="active"></div>

       对象中也可以传入多个属性,来动态切换class。另外,:class可以和普通class共存,例如:

<div id="app"> 
    <div class="static" :class="{ 'active': isActive, 'error': isError }"></div>
</div>
<script>
   var app = new Vue({
       el:'#app',
       data: {
          isActive: true,
          isError: false
       }
     })
</script>

      当数据isActive或isError变化时,对应的class类名也会更新。比如当isError为true时,渲染后的结果为:

<div class="static active error"></div>

      当:class的表达式过长或逻辑复杂时,还可以绑定一个计算属性,这是一种很友好和常见的用法,一般当条件多于两个时,都可以使用data或computed,例如使用计算属性:

<div id="app">
    <div :class="classes"></div>
</div>
<script>
   var app = new Vue({
       el: '#app',
       data: {
           isActive: true,
           error: null
       },
       computed: {
           classes: function () {
              return {
                 active: this.isActive && !this.error,
                 'text-fail': this.error && this.error.type === 'fail'
            }
         }
       }
    })
</script>

      除了计算属性,你也可以直接绑定一个Object类型的数据,或者使用类似计算属性的methods。

    2.  数组语法

        当需要应用多个class时,可以使用数组语法,给:class绑定一个数组,应用一个class列表:

<div id="app">
    <div :class="[activeCls, errorCls]"></div>
</div>
<script>
   var app = new Vue({
       el: '#app',
       data: {
         activeCls: 'active',
         errorCls: 'error'
       }

   })
</script>

      渲染后的结果为:

<div class="active error"></div>

      也可以使用三元表达式来根据条件切换 class,例如下面的示例:

<div id="app">
     <div :class="[isActive ? activeCls : '', errorCls]"></div>
</div>
<script>
   var app = new Vue ({
      el: '#app',
      data: {
        isActive: true,
        activeCls: 'active',
        errorCls:  'error'
      }
   })
</script>

      样式error会始终应用,当数据isActive为真时,样式active才会被应用。class有多个条件时,这样写较为繁琐,可以在数组中使用对象语法:

<div id="app">
    <div :class="[{ 'active': isActive }, errorCls]"></div>
</div>
<script>
    var app = new Vue({
        el:'#app',
        data: {
          isActive: true,
          errorCls: 'error'
        }
    })
</script>

     当然, 与对象语法一样,也可以使用data、computed和methods三种方法,以计算属性为例:

<div id="app">
    <button :class="classes"></button>
</div>
<script>
    var app = new Vue ({
        el:'#app',
        data: {
          size: 'large',
          disabled: true
        },
        computed: {
          classes: function () {
            return [
              'btn',
              {
                 ['btn-' + this.size]: this.size !== '',
                 ['btn-disabled'] : this.disabled
              }
            ];
          }
        }
    })
</script>

      示例中的样式btn会始终应用,当数据size不为空时,会应用样式前缀btn-,后加size的值;当数据disabled为真时,会应用样式btn-disabled,所以该示例最终渲染的结果为:

<button class="btn btn-large btn-disabled"></button>

      使用计算属性给元素动态设置类名,在业务中经常用到,尤其是在写服用的组件时,所以在开发过程中,如果表达式较长或逻辑复杂,应该尽可能地使用计算属性。

   3. 在组件上使用

       如果直接在自定义组件上使用class或:class,样式规则会直接应用到这个组件的根元素上,例如声明一个简单的组件:

Vue.component ('my-component', {
    template: '<p class="article">一些文本</p>'
});

      然后在调用这个组件时,应用上面介绍的对象语法或数组语法给组件绑定class,以对象语法为例:

<div id="app">
    <my-component :class="{ 'active': isActive }"></my-component>
</div>
<script>
   var app = new Vue ({
       el: '#app',
       data: {
         isActive: true
       }
   })
</script>

      最终组件渲染后的结果为:

<p class="article active">一些文本</p>

      这种用法仅适用于自定义组件的最外层是一个根元素,否则会无效,当不满足这种条件或需要给具体的子元素设置类名时,应当使用组件的props来传递。

三.  绑定内联样式

       使用v-bind:style (即 :style)可以给元素绑定内联样式,方法与:class类似,也有对象语法和数组语法,看起来很像直接在元素上写CSS:

<div id="app">
    <div :style="{ 'color': color, 'fontSize': fontSize + 'px' }">文本</div>
</div>
<script>
   var app = new Vue({
      el: '#app',
      data: {
        color: 'red',
        fontSize: 14
     }
  })
</script>

      CSS属性名称使用驼峰命名(cameCase) 或短横分隔命名(kebab-case), 渲染后的结果后:

<div style="color :red; font-size: 14px;">文本</div>

      大多数情况下,直接写一长串的样式不便于阅读和维护,所以一般写在data或computed里,以data为例改写上面的示例:

<div id="app">
   <div :style="styles">文本</div>
</div>
<script>
   var app = new Vue({
      el:'#app',
      data: {
        styles: {
          color: 'red',
          fontSize: 14 + 'px'
        }
      }
   })
</script>

     应用多个样式对象时,可以使用数组语法:

<div :style="[styleA, styleB]">文本</div>

      在实际业务中,:style的数组语法并不常用,因为往往可以写在一个对象里面;而较为常用的应当是计算属性。

      另外,使用:style时,Vue.js会自动给特殊的CSS属性名称增加前缀,比如transform。

猜你喜欢

转载自blog.csdn.net/YKiOS/article/details/88732503