5

vue Class 与 Style 绑定

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

尽管可以用 Mustache 标签绑定 class,比如 class="{{ className }}",但是我们不推荐这种写法和 v-bind:class 混用。两者只能选其一!

对象语法

我们可以传给 v-bind:class 一个对象,以动态地切换 class。注意 v-bind:class 指令可以与普通的 class 特性共存:
    <div v-bind:class="{ active: isActive }"></div>
我们也可以在对象中传入更多属性用来动态切换多个 class 。此外, v-bind:class 指令可以与普通的 class 属性共存。如下:
<div class="static"

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

渲染为:

    <div class="static active"></div>
当 isActive 或者 hasError 变化时,class 列表将相应地更新。例如,如果 hasError 的值为 true , class列表将变为 "static active text-danger"。
也可以直接绑定数据里的一个对象:
    <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 ,以应用一个 class 列表:
    <div v-bind:class="[activeClass, errorClass]">
data: {

  activeClass: 'active',
  
  errorClass: 'text-danger'
}

渲染为:

    <div class="active text-danger"></div>
如果你也想根据条件切换列表中的 class ,可以用三元表达式:
    <div v-bind:class="[isActive ? activeClass : '', errorClass]">
此例始终添加 errorClass ,但是只有在 isActive 是 true 时添加 activeClass 。
不过,当有多个条件 class 时这样写有些繁琐。可以在数组语法中使用对象语法:
    <div v-bind:class="[{ active: isActive }, errorClass]">
  • 用在组件上

当你在一个定制的组件上用到 class 属性的时候,这些类将被添加到根元素上面,这个元素上已经存在的类不会被覆盖。
例如,如果你声明了这个组件:
Vue.component('my-component', {

     template: '<p class="foo bar">Hi</p>'
  
})
然后在使用它的时候添加一些 class:
    <my-component class="baz boo"></my-component>
HTML 最终将被渲染成为:
    <p class="foo bar baz boo">Hi</p>
同样的适用于绑定 HTML class :
    <my-component v-bind:class="{ active: isActive }"></my-component>
当 isActive 为 true 的时候,HTML 将被渲染成为:
<p class="foo bar active"></p>
  • 绑定内联样式

对象语法

v-bind:style 的对象语法十分直观——看着非常像 CSS ,其实它是一个 JavaScript 对象。 CSS 属性名可以用驼峰式(camelCase)或短横分隔命名(kebab-case):
<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]">
    
自动添加前缀
当 v-bind:style 使用需要特定前缀的 CSS 属性时,如 transform,Vue.js 会自动侦测并添加相应的前缀。
  • 条件渲染

v-if

v - if (插入 删除节点)

<div id="app">

        <h1 v-if="grsde>=90">优秀</h1>
        
        <h1 v-else-if="gradde>=60">及格</h1>
        
        <h1 v-else>不及格</h1>
 
    <template v-if="ok">
    
            <div>hello</div>
            
            <div>wrold</div>
            
            <div>nice to meet you</div>
            
    </template>       
    
</div>
    <script>
        var vm = new Vue({
            
            el:'#app',
            
            data:{
                
                ok:true,
                grade:80
            }
        });
    
    </script>

if...else结构

    <h1 v-if="grsde>=90">优秀</h1>
    
    <h1 v-else>不及格</h1>
if...else if...else结构,if-else用嵌入的方式放进去
<div id="app">

        <h1 v-if="grsde>=90">优秀</h1>
        
        <h1 v-else-if="gradde>=60">及格</h1>
        
        <h1 v-else>不及格</h1>
</div>        
v-else 元素必须立即跟在 v-if 或 v-show 元素的后面——否则它不能被识别。

template v-if

如果想切换多个元素,可以把一个<template>元素当作包装元素,并在上面使用v-if,最终的渲染结果不会包含它。
<template v-if="ok">
    
    <div>hello</div>
    
    <div>wrold</div>
    
    <div>nice to meet you</div>
            
</template>  

用key管理可复用的元素

Vue 会尽可能高效地渲染元素,通常会复用已有元素而不是从头开始渲染。这么做,除了使 Vue 变得非常快之外,还有一些有用的好处。例如,如果你允许用户在不同的登录方式之间切换:
这样也不总是符合实际需求,所以 Vue 为你提供了一种方式来声明“这两个元素是完全独立的——不要复用它们”。只需添加一个具有唯一值的 key 属性即可:
<template v-if="loginType === 'username'">

    <label>Username</label>
    
    <input placeholder="Enter your username">
    
</template>

<template v-else>

    <label>Email</label>
    
    <input placeholder="Enter your email address">
    
</template>
在上面的代码中切换 loginType 将不会清除用户已经输入的内容。因为两个模版使用了相同的元素,<input> 不会被替换掉——仅仅是替换了它的的 placeholder
Vue 为你提供了一种方式来声明“这两个元素是完全独立的——不要复用它们”。只需添加一个具有唯一值的 key 属性即可:

<template v-if="loginType === 'username'">

    <label>Username</label>
      
    <input placeholder="Enter your username" key="username-input">
      
</template>

<template v-else>

    <label>Email</label>
  
    <input placeholder="Enter your email address" key="email-input">
  
</template>
现在,每次切换时,输入框都将被重新渲染
注意: 元素仍然会被高效地复用,因为它们没有添加 key 属性

v-show

另一个用于根据条件展示元素的选项是 v-show 指令。用法大致一样:
不同的是有 v-show 的元素会始终渲染并保持在 DOM 中。v-show 是简单的切换元素的 CSS 属性 display。注意 v-show 不支持 <template> 语法。
    <h1 v-show="ok">Hello!</h1>
不同的是带有 v-show 的元素始终会被渲染并保留在 DOM 中。v-show 是简单地切换元素的 CSS 属性 display
v-if 也是惰性的:如果在初始渲染时条件为假,则什么也不做——在条件第一次变为真时才开始局部编译(编译会被缓存起来)。相比之下,v-show 简单得多——元素始终被编译并保留,只是简单地基于 CSS 切换。
一般来说,v-if 有更高的切换消耗而 v-show 有更高的初始渲染消耗。因此,如果需要频繁切换 v-show 较好,如果在运行时条件不大可能改变 v-if 较好。
注意: v-show 不支持 语法,也不支持 v-else

v-if 和 v-for 一起使用

当 v-if 与 v-for 一起使用时,v-for 具有比 v-if 更高的优先级。这意味着 v-if 将分别重复运行于每个 v-for 循环中。当你想为仅有的 一些 项渲染节点时,这种优先级的机制会十分有用
<ul>
    <li v-for="item in todo" v-if="item.ok">{{item.text}}</li>
</ul>
var vm=new Vue({

 data:{
 
     items:[
     
        {text:"chifan",isOk:true},
        
        {text:"shuijue",isOk:false},
        
        {text:"kandianshi",isOk:true},
        
        {text:"dayouxi",isOk:true},
        
        {text:"kandianying",isOk:false},
     ]                   
 }
});  
如果你的目的是有条件地跳过循环的执行,那么可以将 v-if 置于外层元素 (或 <template>)上。
  • 列表渲染

v-for

可以使用 v-for 指令基于一个数组渲染一个列表。这个指令使用特殊的语法,形式为 item in items,items 是数据数组,item 是当前数组元素的别名:

示例 --- 直接上代码:

<ul id="example-1">

  <li v-for="item in items">
  
    {{ item.message }}
    
  </li>
  
</ul>
var example1 = new Vue({

  el: '#example-1',
  
  data: {
  
    items: [
    
      { message: 'Foo' },
      
      { message: 'Bar' }
    ]
  }
});

结果:

{% raw %}

{{item.message}}

{% endraw %}
在 v-for 块内我们能完全访问父组件作用域内的属性,另有一个特殊变量 $index,正如你猜到的,它是当前数组元素的索引:
<ul id="example-2">
  <li v-for="item in items">
    {{ parentMessage }} - {{ $index }} - {{ item.message }}
  </li>
</ul>
var example2 = new Vue({

  el: '#example-2',
  
  data: {
  
    parentMessage: 'Parent',
    
    items: [
    
      { message: 'Foo' },
      
      { message: 'Bar' }
    ]
  }
})

结果:

{% raw%}

{{ parentMessage }} - {{ $index }} - {{ item.message }}

{% endraw %}
另外,你可以为索引指定一个别名(如果 v-for 用于一个对象,则可以为对象的键指定一个别名):
<div v-for="(index, item) in items">
  {{ index }} {{ item.message }}
</div>

v-for把对象属性渲染列表

<div id="app">
    <div v-for="value in xx"> {{value}}</div>               
</div>
    <script>
         var vm=new Vue({
             el:"#app",
             data:{
                xx:{
                    firstName: 'John',
                    lastName: 'Doe',
                    age: 30 
                }           
             }
         });

    </script>  
也可以提供第二个的参数为键名:
<div id="app">
    <div v-for="(value,key) in xx">{{key}} is {{value}}</div>               
</div>
<script>
     var vm=new Vue({
     
         el:"#app",
         
         data:{
            xx:{
                firstName: 'John',
                lastName: 'Doe',
                age: 30 
            }           
         }
     });

</script>  
第三个参数为索引:
<div id="app">
    <div v-for="(value,key,index) in xx">{{index}}{{key}} is {{value}}</div>               
</div>
<script>
     var vm=new Vue({
         el:"#app",
         data:{
            xx:{
                firstName: 'John',
                lastName: 'Doe',
                age: 30 
            }           
         }
     });

</script>  
  • 数组的更新检测

变异方法(修改了原始数组):
vue.js包装了被观察数组的变异方法,故它们能出发视图更新,即当利用这些方法变更数组时,被渲染的内容会实时更新,被包装的方法有:

push() 数组末尾添加

pop() 数组末尾取出

shift() 数组开头取出

unshift() 数组开头添加

splice() 删除并插入

sort() 排序

reverse() 数组顺序颠倒

    <ul id="demo">
        <li v-for = "item in items">
            {{item}}
        </li>
    </ul>
    <script>
        var vm = new Vue({
            el:'#demo',
            data:function(){
                return {items:[4,2,3].splice(0,2)};
            }
 
        })
    </script>
替换数组(返回一个新数组):
数组从一个数组变为另一个数组时(记得,数组是按引用传递的),数据绑定依然生效;但前提是使用以下方法:

filter() 过滤,参数是一个函数,取其返回值为true的元素被添加到新数组

concat() 合并两个数组,返回的数组是合并后的

slice() 返回数组的拷贝,从开始索引到结束索引(前含后不含)

对象更新检测

( 待更新……………… )


搜狗搜到你
533 声望31 粉丝

“工欲善其事,必先利其器”。 思考、书籍和社会实践使我不断走向成熟,对知识的渴望,对理想的追求,人际关系的扩展,思维方式的变更,造就了我不断完善的专业技能和日趋成熟的思想,培养了我务实进取、认真负责的...