Class与Style绑定

本文主要介绍如何使用Vue来绑定操作元素的class列表和内联样式(style属性).

因为class和style都是属性,所以通过v-bind命令来处理它们:只需要通过表达式计算出结果即可,不过字符串拼接麻烦且易错。因此,再将v-bind用于class和style属性时,Vue.js做了专门的增强,表达式结果类型除了字符串以外还可以是对象或者数组.

 

1、对象语法

(1)、绑定的数据对象内联在模版中

我们可以通过给html标签追加v-bind:class的指令,以动态的切换class,html代码如下:

<body>
    <div id="pageIndex">
        <div class="static" v-bind:class="{active:isActive,'text-danger':hasError}">aaa</div>
    </div>
</body>

上面代码中的active和text-danger这两个类选择器是否存在取决于数据属性中的isActive和hasError是否为true,为true的话,类选择器就不存在,js代码如下:

var currentPage=new Vue({
      el:"#pageIndex",
      data:{
          isActive:true,
          hasError:true
      }
});

如上代码所示,v-bind:class指令可以和普通class共存,当isActive和hasError发生变化时,class列表也会进行相应的更新,

 

(2)、绑定的数据对象不内联在模版中

<body>
    <div id="pageIndex">
        <div class="static" v-bind:class="classObject">aaa</div>
    </div>
</body>
<script type="text/javascript">
    var currentPage=new Vue({
        el:"#pageIndex",
        data:{
            classObject:{
                "active":true,
                "text-danger":true
            }
        }
    });
</script>

结果和(1)中的一模一样.

 

(3)、绑定的数据对象不内联在模版中,且该数据对象可以通过计算属性得出

<body>
    <div id="pageIndex">
        <div class="static" v-bind:class="classObject">aaa</div>
    </div>
</body>
<script type="text/javascript">
    var currentPage=new Vue({
        el:"#pageIndex",
        data:{
            isActive:true,
            error:null
        },
        computed:{
            classObject:function(){
                return {
                     active:this.isActive && !this.error,
                    'text-danger':this.error && this.error.type === 'fatal'
                }
            }
        }
    });
</script>

 

(4)、绑定内联样式

Vue通过v-bind:style指令给dom元素绑定样式,v-bind:style看着非常像css,但它其实是一个Javascript对象.CSS 属性名可以用驼峰式 (camelCase) 或短横线分隔 (kebab-case,记得用单引号括起来) 来命名:

<body>
    <div id="pageIndex">
        <div v-bind:style="{color:activeColor,fontSize:fontSize+'px'}">aaa</div>
    </div>
</body>
<script type="text/javascript">
    var currentPage=new Vue({
        el:"#pageIndex",
        data:{
            activeColor: 'blue',
            fontSize: 30
        }
    });
</script>

上述语法虽然正确,但是直接绑定一个样式对象会更好,这会让模版更清晰:

<body>
    <div id="pageIndex">
        <div v-bind:style="styleObject">aaa</div>
    </div>
</body>
<script type="text/javascript">
    var currentPage=new Vue({
        el:"#pageIndex",
        data:{
            styleObject:{
                color: 'red',
                fontSize: '13px'
            }
        }
    });
</script>

同样的对象语法常常结合计算属性使用.

 

2、数组语法

(1)、普通用法

Vue提供了一种机制,可以把一个数组传递给v-bind:class,以应用一个class列表:

<body>
    <div id="pageIndex">
        <div v-bind:class="[activeClass, errorClass]">aaa</div>
    </div>
</body>
<script type="text/javascript">
    var currentPage=new Vue({
        el:"#pageIndex",
        data:{
            activeClass:"active",
            errorClass:"text-danger"
        }
    });
</script>

 

(2)、数组语法中使用三元表达式切换列表中的class

如果你想根据条件切换列表中的class,可以使用三元表达式,Vue支持在数组语法中使用三元表达式.

<body>
    <div id="pageIndex">
        <div v-bind:class="[isActive?activeClass:'',errorClass]">aaa</div>
    </div>
</body>
<script type="text/javascript">
    var currentPage=new Vue({
        el:"#pageIndex",
        data:{
            isActive:false,
            activeClass:"active",
            errorClass:"text-danger"
        }
    });
</script>

 

(3)、数组语法中嵌套对象语法

当有多个条件class时上面的在数组语法中使用三元表达式难免有点繁琐,所以这个时候可以在数组语法中嵌套对象语法,使代码尽可能的简洁,代码如下:

<body>
    <div id="pageIndex">
        <div v-bind:class="[{activeClass:isActive},errorClass]">aaa</div>
    </div>
</body>
<script type="text/javascript">
    var currentPage=new Vue({
        el:"#pageIndex",
        data:{
            isActive:true,
            activeClass:"active",
            errorClass:"text-danger"
        }
    });
</script>

 

(4)、绑定内联样式

v-bind:style 的数组语法可以将多个样式对象应用到同一个元素上,代码如下:

<body>
    <div id="pageIndex">
        <div v-bind:style="[baseStyles, overridingStyles]">aaa</div>
    </div>
</body>
<script type="text/javascript">
    var currentPage=new Vue({
        el:"#pageIndex",
        data:{
            baseStyles:{
                color:"blue"
            },
            overridingStyles:{
                background:"yellow"
            }
        }
    });
</script>

注:当 v-bind:style 使用需要添加浏览器引擎前缀的 CSS 属性时,如 transform,Vue.js 会自动侦测并添加相应的前缀。

 

3、多充值

从 2.3.0 起你可以为 style 绑定中的属性提供一个包含多个值的数组,常用于提供多个带前缀的值,例如:

<div :style="{ display: ['-webkit-box', '-ms-flexbox', 'flex'] }"></div>

这样写只会渲染数组中最后一个被浏览器支持的值。在本例中,如果浏览器支持不带浏览器前缀的 flexbox,那么就只会渲染 display: flex

posted @ 2017-11-11 17:38  郑小超  阅读(564)  评论(0编辑  收藏  举报