绑定类和样式

一个常见的操作是操控一个元素的类和内联样式。由于它们都是属性,可以使用 v-bind 语法处理:只需计算出期望的字符串即可。但字符串拼接繁琐易错,因此 Vue 提供加强版 v-bind,特殊处理 classstyle。使得表达式不仅可以处理字符串,还可以处理对象或数组。

绑定 HTML 类

对象语法

可以向 v-bind:class 传递对象,动态切换元素类:

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

如上语法表示,active 类存在与否,取决于 isActive 是否为真。

可以在对象中定义多个字段,也可以和普通 class 属性共存:

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

绑定的对象无需内联,写入 data 属性亦可。

<div v-bind:class="classObject"></div>
data: {
  classObject: {
    active: true,
    'text-danger': false
  }
}

还可以使用计算属性返回的对象。这是一个常见的强力技巧:

<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'
    }
  }
}

数组语法

可以向 v-bind:class 传入数组,增加多个对象:

<div v-bind:class="[activeClass, errorClass]"></div>
data: {
  activeClass: 'active',
  errorClass: 'text-danger'
}

将渲染为:

<div class="active text-danger"></div>

在数组语法中,可以嵌套使用对象数组:

<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"></p>

类绑定语法也是如此:

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

isActive 为真值,最终渲染为:

<p class="foo bar active"></p>

绑定内联样式

对象语法

v-bind:style 的对象语法十分简单 - 看起来像 CSS,实际上是 JavaScript 对象。CSS 属性名称可以使用驼峰语法或连线格式。

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

通常建议直接绑定样式对象,这样模板更清晰:

<div v-bind:style="styleObject"></div>
data: {
  styleObject: {
    color: 'red',
    fontSize: '13px'
  }
}

对象语法通常和计算属性一起使用。

数组语法

v-bind:style 的数组语法可以向同一个元素施加多个样式:

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

自动前缀

当使用的 v-bind:style 属性需要浏览器引擎前缀时,比如 transform,Vue 会自动检测属性,并添加合适的前缀。

多个数值 (2.3.0+

从 2.3.0 开始,可以向 style 属性传递一个数组的前缀属性,比如:

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

这样只会渲染浏览器支持的最后一种属性。

REF

results matching ""

    No results matching ""