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() 返回数组的拷贝,从开始索引到结束索引(前含后不含)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。