Class 与 Style 绑定

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

    上面的语法表示 active 这个 class 存在与否将取决于数据 property isActive 的 。

    你可以在对象中传入更多字段来动态切换多个 class。此外,:class 指令也可以与普通的 class attribute 共存。当有如下模板:

    1. <div
    2. class="static"
    3. :class="{ active: isActive, 'text-danger': hasError }"
    4. ></div>

    和如下 data:

    1. data() {
    2. return {
    3. isActive: true,
    4. hasError: false
    5. }
    6. }

    渲染的结果为:

    1. <div class="static active"></div>

    isActive 或者 hasError 变化时,class 列表将相应地更新。例如,如果 hasError 的值为 true,class 列表将变为 "static active text-danger"

    绑定的数据对象不必内联定义在模板里:

    1. <div :class="classObject"></div>
    1. data() {
    2. return {
    3. classObject: {
    4. active: true,
    5. 'text-danger': false
    6. }
    7. }
    8. }

    渲染的结果和上面一样。我们也可以在这里绑定一个返回对象的计算属性。这是一个常用且强大的模式:

      1. return {
      2. isActive: true,
      3. error: null
      4. }
      5. },
      6. computed: {
      7. classObject() {
      8. return {
      9. active: this.isActive && !this.error,
      10. 'text-danger': this.error && this.error.type === 'fatal'
      11. }
      12. }
      13. }

      数组语法

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

      1. data() {
      2. return {
      3. activeClass: 'active',
      4. errorClass: 'text-danger'
      5. }
      6. }
      1. <div class="active text-danger"></div>

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

      1. <div :class="[isActive ? activeClass : '', errorClass]"></div>

      这样写将始终添加 errorClass,但是只有在 isActive 为 truthy 时才添加 activeClass。

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

      1. <div :class="[{ active: isActive }, errorClass]"></div>

      例如,如果你声明了这个组件:

      1. const app = Vue.createApp({})
      2. app.component('my-component', {
      3. template: `<p class="foo bar">Hi!</p>`
      4. })

      然后在使用它的时候添加一些 class:

      1. <div id="app">
      2. </div>

      HTML 将被渲染为:

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

      对于带数据绑定 class 也同样适用:

      当 isActive 为 truthy[1] 时,HTML 将被渲染成为:

      1. <div id="app">
      2. <my-component class="baz"></my-component>
      3. </div>
      1. const app = Vue.createApp({})
      2. app.component('my-component', {
      3. template: `
      4. <p :class="$attrs.class">Hi!</p>
      5. <span>This is a child component</span>
      6. `
      7. })

      你可以在 小节了解更多关于组件属性继承的信息。

      绑定内联样式

      对象语法

      :style 的对象语法十分直观——看着非常像 CSS,但其实是一个 JavaScript 对象。CSS property 名可以用驼峰式 (camelCase) 或短横线分隔 (kebab-case,记得用引号括起来) 来命名:

      1. <div :style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>
      1. data() {
      2. return {
      3. activeColor: 'red',
      4. fontSize: 30
      5. }
      6. }

      直接绑定到一个样式对象通常更好,这会让模板更清晰:

      1. <div :style="styleObject"></div>
      1. data() {
      2. return {
      3. styleObject: {
      4. color: 'red',
      5. fontSize: '13px'
      6. }
      7. }

      同样的,对象语法常常结合返回对象的计算属性使用。

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

      自动添加前缀

      :style 中使用需要 (浏览器引擎前缀) vendor prefixesClass 与 Style 绑定 - 图1 (opens new window) 的 CSS property 时,如 transform,Vue 将自动侦测并添加相应的前缀。

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

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

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

      译者注 [1] truthy 不是 true,详见 的解释。