Vue - 动态绑定Class 与 Style

操作元素的 class 列表和内联样式是数据绑定的一个常见需求。因为它们都是 attribute,所以我们可以用 v-bind 处理它们:只需要通过表达式计算出字符串结果即可。不过,字符串拼接麻烦且易错。因此,在将 v-bind 用于 class 和 style 时,Vue.js 做了专门的增强。表达式结果的类型除了字符串之外,还可以是对象或数组。

一、绑定Class

1.对象语法

我们可以传给 v-bind:class 一个对象,以动态地切换 class:

<div class="box" :class="{active:isActive}"></div>
var app = new Vue({
    el: "#app",
    data: {
        isActive: false,
    },
});

是否为元素添加active类名,取决于isActive的值,在本例中isActive的值为false,所以并为对该元素添加active类名,所以最终渲染结果如下:

<div class="box"></div>

也可以对象中传入更多字段来动态切换多个 class,例如:

<div class="box" :class="{active1:isActive1,'active2':isActive2}"></div>
var app = new Vue({
    el: "#app",
    data: {
        isActive1: true,
        isActive2: false,
    },
});

在本例中isActive1的值为true,所以成功为该元素添加active1类名,isActive2的值为false,所以并未对该元素添加active2类名,所以最终渲染结果如下:

<div class="box active1"></div>

2.三目运算符语法

如果想根据条件切换列表中的 class,可以用三元表达式:

<div class="box" :class="isActive3?'active1':'active2'"></div>
var app = new Vue({
    el: "#app",
    data: {
        isActive3: false,
    },
});

如果isActive3的值为true,则为元素添加类名active1,如果为false,则为元素添加类名active2,在本例中isActive3的值为false,所以应为该元素添加active2类名,所以最终渲染结果如下:

<div class="box active2"></div>

3.数组语法

我们可以把一个数组传给 v-bind:class,以应用一个 class 列表:

<div class="box" :class=[activeClass1,activeClass2]></div>
var app = new Vue({
    el: "#app",
    data: {
        activeClass1:'active1',
        activeClass2:'active2',
    },
});

渲染为:

<div class="box active1 active2"></div>

如果你也想根据条件切换列表中的 class,可以与三元表达式配合使用:

<div class="box" :class="[activeClass3,isActive4?'active4':'']"></div>
var app = new Vue({
    el: "#app",
    data: {
        isActive4: false,
        activeClass3:"active3"
    },
});

渲染为:

<div class="box active3"></div>

不过,当有多个条件 class 时这样写有些繁琐。所以在数组语法中也可以使用对象语法:

<div class="box" :class="[activeClass3,{active4:isActive4}]"></div>

二、绑定Style

1.对象语法

<div class="con" :style="{color:myColor,fontSize:myFontSize + 'px'}"></div>
var app = new Vue({
    el: "#app",
    data: {
        myColor: "pink",
        myFontSize: 20,
    },
});

注意点:CSS property 名需要使用驼峰式来命名。如上例中的font-size属性需要改写为fontSize;如果属性值为数值带有单位的,需要将数值和单位分开写,如上例的20px,需将数字20赋值到myFontSize变量中,而在使用+符号添加上px单位。
为了让模板更加清晰,通常我们会直接绑定到一个样式对象上,如下所示:

<div v-bind:style="styleObject"></div>
var app = new Vue({
    el: "#app",
    data: {
        styleObject: {
          color: "pink",
          fontSize: "20px",
        },
    },
});

2.数组语法

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

<div v-bind:style="[styleObject, overridingStyles]"></div>
var app = new Vue({
    el: "#app",
    data: {
        styleObject: {
          color: "pink",
          fontSize: "20px",
        },
        baseStyles: {
            backgroundColor:'skyblue'
        },
    },
});

3.自动添加前缀

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值