梦入琼楼寒有月,行过石树冻无烟

Vue.js V-bind at class and style 绑定

在 Vue.js 中,v-bind 指令提供了 :class/style 参数进行处理,并对此针对性的进行了增强表达式类型除了字符串之外,还可以是对象或是数组。

Class 绑定

通常我们可以使用 :class 对象以动态的切换 class,但这个 class 的使用与否取决与属性 isActive 的 Truthy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<style>
.active {
padding: 1.5em;
border: 1px solid #e4e4e4;
}
.err {
border: 1px solid red;
color: red;
padding: 1.5em;
}
</style>
<div id="app">
<p v-bind:class="{active: isActive, err: isError}">{{message}}</p>
</div>
<script>
const app = Vue.createApp ({
data() {
return {
message: 'This is v-bind:class',
isActive: true,
isError: false
}
}
})
const vm = app.mount('#app')
</script>

Truthy(真值),在 JavaScript 的定义中,值得是布尔值的上下文转换后的值为 true,除下述意外皆为真值。也就是说当我们在 :class 中使用的是 :class="{active: true}" 才会使用该样式。

name
false
0
“”
null
undefined
Nan

对于上下文 (context) 是一个任务中不不可少的一组数据,当数据任务中断时,这次之后仍然可以在同一个位置继续执行。

任务可以是进程或线程

数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<style>
.active {
padding: 1.5em;
border: 1px solid #e4e4e4;
}
.err {
border: 1px solid red;
color: red;
padding: 1.5em;
}
</style>
<div id="app">
<p v-bind:class="[headerActive, paddingError]">{{message}}</p>
</div>
<script>
const app = Vue.createApp ({
data() {
return {
message: 'This is v-bind:class',
headerActive: 'active',
paddingError: false
}
}
})
const vm = app.mount('#app')
</script>

三元表达式

在下述的例子中,假设 isActive 的 Truthy 为 false,则直接使用 paddingError 作为样式,反之使用 headerActive 作为其 Class,这提供了两种写法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<style>
.active {
padding: 1.5em;
border: 1px solid #e4e4e4;
}
.err {
border: 1px solid red;
color: red;
padding: 1.5em;
}
</style>
<div id="app">
<p v-bind:class="[isActive ? headerActive : '', paddingError]">{{message}}</p>
<!-- <p v-bind:class="[{headerActive: isActive},paddingError]">{{message}}</p>-->
</div>
<script>
const app = Vue.createApp ({
data() {
return {
message: 'This is v-bind:class',
headerActive: 'active',
paddingError: 'err',
isActive: true
}
}
})
const vm = app.mount('#app')
</script>

Style 对象语法

v-bind 的 style 语法非常的类似于 class ,需要注意的是 CSS 属性名可以使用驼峰式(camelCase)或短横线分割(kebab-case)的进行命名:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<div id="app">
<p v-bind:style="{border: borderBold, padding: '1.5em'}">{{message}}</p>
</div>
<script>
const app = Vue.createApp ({
data() {
return {
message: 'This is v-bind:style',
borderBold: '1px solid #e4e4e4'
}
}
})
const vm = app.mount('#app')
</script>

数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<div id="app">
<p v-bind:style="[borderStyle, paddingStyle]">{{message}}</p>
</div>
<script>
const app = Vue.createApp ({
data() {
return {
message: 'This is v-bind:style',
borderStyle: 'border:1px solid #e4e4e4',
paddingStyle: 'padding:1em'
}
}
})
const vm = app.mount('#app')
</script>
⬅️ Go back