模板中的 VueJS 绑定 class 不起作用
VueJS binding class in template not working
我正在学习 VueJS,我想制作选项卡组件。我有一个 main.js 和 index.html 文件如下:
Vue.component('tabs', {
template: "<div><div class='tabs is-medium'><ul><li v-for='tabb in tabs' :class='{'is-active': tabb.selected}'><a href='#'>{{ tabb.name }}</a></li></ul></div><div class='tabs-details'> <slot></slot></div></div>",
data() {
return {tabs: []};
},
created() {
this.tabs = this.$children;
}
});
Vue.component('tab', {
template: '<div><slot></slot></div>',
props: {
name: {required: true },
selected: { default: false }
}
})
new Vue({
el: '#root'
});
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title></title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.5/css/bulma.min.css">
</head>
<body>
<div id="root">
<tabs>
<tab name="Tab1" :selected="true">
<h1>Tab1 content</h1>
</tab>
<tab name="Tab2">
<h1>Tab2 content</h1>
</tab>
<tab name="Tab3">
<h1>Tab3 content</h1>
</tab>
</tabs>
</div>
<script src="https://unpkg.com/vue@2.6.10/dist/vue.js"></script>
</body>
</html>
问题出在 class 绑定部分 (:class='{'is-active': tabb.selected}'
)。代码在删除或未使用绑定且 class 值保持不变 (class='is-active'
) 时有效。我想知道为什么绑定 class 不起作用?
注意:模板中到处都使用单引号,因为它(显然)是我在 Atom 编辑器中将所有内容保留在模板中(因此在“”之间)的唯一方法。
你不能这样写:
:class='{'is-active': tabb.selected}'
您将单引号用于两个不同的目的。 Vue 一遇到第二个 '
就会认为属性值已经结束。这最终相当于:
:class='{'
通常的约定是对模板使用反引号(不要与单引号混淆),如下所示:
template: `
<div>
<div class="tabs is-medium">
<ul>
<li v-for="tabb in tabs" :class="{'is-active': tabb.selected}">
<a href="#">{{ tabb.name }}</a>
</li>
</ul>
</div>
<div class="tabs-details">
<slot></slot>
</div>
</div>
`,
如果您真的不能使用反引号,那么只需转义一些双引号即可。所以其中之一:
:class=\"{'is-active': tabb.selected}\"
或:
:class='{\"is-active\": tabb.selected}'
我正在学习 VueJS,我想制作选项卡组件。我有一个 main.js 和 index.html 文件如下:
Vue.component('tabs', {
template: "<div><div class='tabs is-medium'><ul><li v-for='tabb in tabs' :class='{'is-active': tabb.selected}'><a href='#'>{{ tabb.name }}</a></li></ul></div><div class='tabs-details'> <slot></slot></div></div>",
data() {
return {tabs: []};
},
created() {
this.tabs = this.$children;
}
});
Vue.component('tab', {
template: '<div><slot></slot></div>',
props: {
name: {required: true },
selected: { default: false }
}
})
new Vue({
el: '#root'
});
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title></title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.5/css/bulma.min.css">
</head>
<body>
<div id="root">
<tabs>
<tab name="Tab1" :selected="true">
<h1>Tab1 content</h1>
</tab>
<tab name="Tab2">
<h1>Tab2 content</h1>
</tab>
<tab name="Tab3">
<h1>Tab3 content</h1>
</tab>
</tabs>
</div>
<script src="https://unpkg.com/vue@2.6.10/dist/vue.js"></script>
</body>
</html>
问题出在 class 绑定部分 (:class='{'is-active': tabb.selected}'
)。代码在删除或未使用绑定且 class 值保持不变 (class='is-active'
) 时有效。我想知道为什么绑定 class 不起作用?
注意:模板中到处都使用单引号,因为它(显然)是我在 Atom 编辑器中将所有内容保留在模板中(因此在“”之间)的唯一方法。
你不能这样写:
:class='{'is-active': tabb.selected}'
您将单引号用于两个不同的目的。 Vue 一遇到第二个 '
就会认为属性值已经结束。这最终相当于:
:class='{'
通常的约定是对模板使用反引号(不要与单引号混淆),如下所示:
template: `
<div>
<div class="tabs is-medium">
<ul>
<li v-for="tabb in tabs" :class="{'is-active': tabb.selected}">
<a href="#">{{ tabb.name }}</a>
</li>
</ul>
</div>
<div class="tabs-details">
<slot></slot>
</div>
</div>
`,
如果您真的不能使用反引号,那么只需转义一些双引号即可。所以其中之一:
:class=\"{'is-active': tabb.selected}\"
或:
:class='{\"is-active\": tabb.selected}'