# v-bind绑定class和style

v-bind用于class和style时,Vue做了专门的增强。表达式结果的类型除了字符串之外,还可以是对象或数组

# 绑定HTML Class

# 对象方法

可以动态的新增或删除class

  • v-bind:class="{active: isActive}" 如果vm.isActive为true则渲染class active
  • v-bind:class也可以与普通class共存
  • v-bind:class="classObject" classObject对象可以写在js里
  • v-bind:class="classObject" classObject也可以是计算属性
<div id="app">
  <!-- <div class="red active"></div> -->
  <div v-bind:class="myclass"></div>

  <!-- 对象语法 -->
  <div v-bind:class="{active: isActive}"></div>
  <div class="red" 
        v-bind:class="{active: isActive, 'text-danger': hasError}">
  </div>
  <div v-bind:class="classObject"></div>
  <div v-bind:class="classObjectComputed"></div>

</div>
<script>
  var vm = new Vue({
    el: '#app',
    data: {
      myclass: "red active",
      isActive: true,
      hasError: false,
      classObject: {
        active: true,
        'text-danger': false
      }
    },
    computed: {
      classObjectComputed: function() {
        return {
          active: this.isActive && !this.error,
          'text-danger': this.error && this.error.type === 'fatal'
        }
      }
    }
  })
</script>

# 数组语法

  • v-bind:class="[activeClass, errorClass]" activeClass、errorClass的值则为class
  • 内部可以使用三元运算符
  • 对于多个条件,可以在数组中使用对象语法
<div id="app">
  <!-- 数组语法 -->
  <!-- <div class="active text-danger"></div> -->
  <div v-bind:class="[activeClass, errorClass]"></div>

  <!-- 内部可以使用三元表达式-->
  <div v-bind:class="[isActive ? activeClass : '', errorClass]"></div>

  <!--多个条件会比较繁琐,在数组中也可以使用对象语法 -->
  <div v-bind:class="[{ active: isActive }, errorClass]"></div>

</div>
<script>
  var vm = new Vue({
    el: '#app',
    data: {
      activeClass: 'active',
      errorClass: 'text-danger',
      isActive: false
    }
  })
</script>

# 用在组件上

<div id="app">
  <!-- <p class="foo bar baz boo"></p> -->
  <my-component class="baz boo"></my-component>

  <!-- <p class="foo bar active"></p> -->
  <my-component v-bind:class="{ active: isActive }"></my-component>
</div>
<script>
  Vue.component('my-component', {
    template: '<p class="foo bar"></p>'
  })

  var vm = new Vue({
    el: '#app',
    data: {
      isActive: true
    }
  })
</script>

# 绑定内联(liline)样式(style)

# 对象语法

  • v-bind:style="{ color: activeColor, fontSize: fontSize + 'px'}" 内嵌写法
  • v-bind:style="styleObject" 对象写在js里
  • 也可以结合返回对象的计算属性使用。
<div id="app">
  <!-- <div style="color: red; font-size: 30px;"></div> -->
  <div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px'}"></div>

  <!-- 将对象写在JS里 -->
  <div v-bind:style="styleObject"></div>
</div>
<script>
  var vm = new Vue({
    el: '#app',
    data: {
      activeColor: 'red',
      fontSize: 30,
      styleObject: {
        color: 'red',
        fontSize: '30px'
      }
    }
  })
</script>

# 数组语法

将多个样式对象应用到同一个元素上

<div id="app">
  <!-- <div style="color: red; font-size: 14px;"></div> -->
  <div v-bind:style="[baseStyles, overridingStyles]"></div>
</div>
<script>
  var vm = new Vue({
    el: '#app',
    data: {
      baseStyles: {
        color: 'red',
        fontSize: '30px'
      },
      overridingStyles: {
        fontSize: '14px',
      }
    }
  })
</script>

# 自动添加浏览器厂商前缀

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

# 多重值

只会渲染数组中最后一个被浏览器支持的值。

<!-- <div style="display: flex;"></div> --> 
<div v-bind:style="{ display: ['-webkit-box', '-ms-flexbox', 'flex'] }"></div>
上次更新: 2020/10/29 22:59:19