vue-class和style绑定

168 阅读3分钟

绑定Class

在Vue.js中,可以使用v-bind:class指令来绑定一个或多个类名到HTML元素上。以下是一些示例,说明如何使用这个指令。

对象语法

v-bind:class指令传递一个对象时,它可以帮助我们动态切换类名。对象的键是类名,而值则是决定是否应用这个类的布尔值。

<div v-bind:class="{ active: isActive }"></div>

上面的代码会应用active类,只有当isActive数据属性为true时。

我们也可以在对象中提供多个类名,以动态切换多个类:

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

这个例子中,如果isActivetrue,则应用active类;如果hasErrortrue,则应用text-danger类。

而且,v-bind:class指令可以与普通的class属性共存:

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

在这个例子中,如果数据属性满足条件,相应的类名将被添加到元素的类列表中,而不会影响或覆盖已存在的类名。

此外,我们还可以将对象语法和计算属性结合使用:

<div v-bind:class="classObject"></div>
data: {
    isActive: true,
    error: null
},
computed: {
    classObject: function() {
        return {
            active: this.isActive && this.error,
            'text-danger': this.error && this.error.type === 'fatal'
        }
    }
}

在这个例子中,计算属性classObject返回一个对象,根据该对象的属性值动态应用类名。这是一个非常强大的模式,因为它允许我们根据复杂的逻辑动态控制类的应用。

数组语法

我们也可以将一个数组传递给v-bind:class,以应用一个类名列表:

<div v-bind:class="[activeClass, errorClass]"></div>

在这种情况下,如果数组中的任何元素是真(如非空字符串、非零数字等),则该类名将被添加到元素的类列表中。如果数组是空的,则不会添加任何类名。我们可以使用三元表达式在数组语法中实现条件切换:

<div v-bind:class="[isActive ? activeClass : '', errorClass]"></div>

这个例子中,如果isActivetrue,则应用activeClass;否则不应用任何类名。然后应用errorClass。当有多个条件类时,我们可以使用对象语法:

<div v-bind:class="[{ active: isActive }, errorClass]"></div>

这样写更简洁。当数组中的元素是对象时,对象的键是类名,而值则是决定是否应用这个类的布尔值。如果键对应的值为真,则应用相应的类名。

用在组件上

当在一个自定义组件上使用class属性时,这些类将被添加到该组件的根元素上。已经存在的类不会被覆盖。例如:

声明一个组件:

Vue.component('my-component', {
    template: '<p class="foo bar">Hi</p>'
})

使用该组件并提供一个类:

<my-component class="baz boo"></my-component>

渲染的HTML将是:

<p class="foo bar baz boo">Hi</p>

在这个例子中,组件原本的类名是foo bar,但我们又添加了baz boo。最终的结果是这四个类名都被添加到该元素的类列表中。

绑定内联样式

在Vue.js中,可以使用v-bind:style指令将数据绑定到元素的样式属性。下面是v-bind:style的一些用法:

对象语法

v-bind:style的对象语法非常直观,它使用JavaScript对象来定义样式。CSS property的名字可以用驼峰式(camelCase)或短横线分隔(kebab-case,记得用引号括起来)来表示。

例如:

<!-- HTML -->
<div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>

对应的JavaScript代码如下:

// JS
data: {
  activeColor: 'red',
  fontSize: 30
}

通常,直接绑定一个样式对象更好,这样可以使模板更加清晰:

<!-- HTML -->
<div v-bind:style="styleObject"></div>

对应的JavaScript代码如下:

// JS
data: {
  styleObject: {
    color: 'red',
    fontSize: '13px'
  }
}

数组语法

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

<!-- HTML -->
<div v-bind:style="[baseStyles, overridingStyles]"></div>

在这里,baseStylesoverridingStyles都是样式对象。

自动添加前缀

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

多重值

可以为style绑定中的property提供一个包含多个值的数组,通常用于提供多个带前缀的值。例如:

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

在这种情况下,数组中的最后一个值将是最终应用到元素上的值,因为前面的值通常会被浏览器忽略。