在 VueJS 中单击时切换 class
Toggle class on click in VueJS
我正在学习 Vuejs,并且我不断发现一些简单的事情,例如删除 class 是一件很痛苦的事情。请告诉我如何允许根据 3 个链接之间的点击添加或删除 .active class。
在下面的示例中,添加工作正常,但它向所有链接添加了 .active,并且在再次单击时不会删除。
<div id="app">
<h2>App</h2>
<ul>
<li><a href="#" class="link" :class="{ active: isActive }" @click="activeLink">Link text</a></li>
<li><a href="#" class="link" :class="{ active: isActive }" @click="activeLink">Link text</a></li>
<li><a href="#" class="link" :class="{ active: isActive }" @click="activeLink">Link text</a></li>
</ul>
</div>
JS
var app = new Vue({
el: '#app',
data: {
isActive: false
},
methods: {
activeLink() {
// the line below did not work
// document.getElementsByClassName("active").isActive = false,
this.isActive = true
}
}
})
JSfiddle 来了,https://jsfiddle.net/s9r4q0gc/
您需要在方法中捕获事件处理程序并使用它来引用被调用方,即在本例中为锚对象。
见 fiddle : https://jsfiddle.net/s9r4q0gc/2/
activeLink(event) {
if(event.target.className == "noclass")
{
event.target.className = "link active";
}
else
{
event.target.className = "noclass";
}
}
更新:
可以试试这个 fiddle 看看它是否正中靶心:https://jsfiddle.net/s9r4q0gc/4/
var app = new Vue({
el: '#app',
data: {
isActive: false
},
methods: {
activeLink(event) {
var checkboxes = document.getElementsByClassName ("noclass");
for (var i=0; i<checkboxes.length; i++) {
checkboxes[i].className = "link active";
//checkboxes[i].className = "link";
}
event.target.className = "noclass";
}
}
})
这是一个替代解决方案,它可能会比您想要的更多地修改您的代码。我认为这可能有用,因为您只是在学习并且可能对替代方案感兴趣。我首先将您的链接声明为 vue 中的对象数组,以便我们可以为每个链接分配一个 active 属性。然后我们可以直接切换活动值内联或使用 toggleActive 函数(当前未使用..如果您更喜欢使用函数而不是内联逻辑,只是为了说明)。
Html:
<div id="app">
<h2>App</h2>
<ul>
<li v-for="l in links">
<a href="#" class="link" :class="{ active: l.active}" @click="l.active = !l.active">{{l.text}}</a>
</li>
</ul>
</div>
Javascript:
var app = new Vue({
el: '#app',
data: {
links: [{
text: "Link text",
active: false
},{
text: "Second text",
active: false
},{
text: "Third text",
active: false
}]
},
methods: {
//To use this function make @click in html to:
//@click="toggleActive(l)"
toggleActive(x) {
x.active = !x.active;
}
}
})
你可以做的是使用 data
属性 来保存当前活动的 link。然后,您将能够进行任何给定的 link 测试,如果它是活动的 link 以及是否应该应用 .active
class。
那么只需在单击 link 时设置 属性 的新值即可。如果单击当前处于活动状态的同一个 link,则会清除 属性,从而从所有 link 中删除 .active
class。否则,class 将添加到被单击的 link。
这是 CodePen 演示我的意思的实际操作,但您的标记可能如下所示:
<li><a href="#" class="link" :class="{ active: activeId == 'link-1' }"
@click.prevent="activeLink('link-1')">Link text</a></li>
<li><a href="#" class="link" :class="{ active: activeId == 'link-2' }"
@click.prevent="activeLink('link-2')">Link text</a></li>
<li><a href="#" class="link" :class="{ active: activeId == 'link-3' }"
@click.prevent="activeLink('link-3')">Link text</a></li>
你的 JS 可能看起来像这样:
data: {
activeId: null
},
methods: {
activeLink(linkIdent) {
this.activeId = this.activeId === linkIdent ? null : linkIdent
}
}
它显然不是一个干净的解决方案,但我坚持您的要求,即解决方案符合您提供的标记。
使用 V-for 和项目数组,这样您就无需静态键入链接。这允许您正在寻找的动态功能。
var app = new Vue({
el: '#app',
data: {
links: [
{text: "Link Text", active: false},
{text: "Link Text", active: false},
{text: "Link Text", active: false}
]
},
methods: {
activate(link) {
link.active = !link.active
}
}
})
.link{
text-decoration: none;
color: #555;
}
.active{
text-decoration: underline;
color: #42b983;
}
<div id="app">
<h2>App</h2>
<ul>
<li v-for="link in links"><a href="#" class="link" :class="{ active: link.active }" @click="activate(link)">Link text</a></li>
</ul>
</div>
我正在学习 Vuejs,并且我不断发现一些简单的事情,例如删除 class 是一件很痛苦的事情。请告诉我如何允许根据 3 个链接之间的点击添加或删除 .active class。
在下面的示例中,添加工作正常,但它向所有链接添加了 .active,并且在再次单击时不会删除。
<div id="app">
<h2>App</h2>
<ul>
<li><a href="#" class="link" :class="{ active: isActive }" @click="activeLink">Link text</a></li>
<li><a href="#" class="link" :class="{ active: isActive }" @click="activeLink">Link text</a></li>
<li><a href="#" class="link" :class="{ active: isActive }" @click="activeLink">Link text</a></li>
</ul>
</div>
JS
var app = new Vue({
el: '#app',
data: {
isActive: false
},
methods: {
activeLink() {
// the line below did not work
// document.getElementsByClassName("active").isActive = false,
this.isActive = true
}
}
})
JSfiddle 来了,https://jsfiddle.net/s9r4q0gc/
您需要在方法中捕获事件处理程序并使用它来引用被调用方,即在本例中为锚对象。
见 fiddle : https://jsfiddle.net/s9r4q0gc/2/
activeLink(event) {
if(event.target.className == "noclass")
{
event.target.className = "link active";
}
else
{
event.target.className = "noclass";
}
}
更新:
可以试试这个 fiddle 看看它是否正中靶心:https://jsfiddle.net/s9r4q0gc/4/
var app = new Vue({
el: '#app',
data: {
isActive: false
},
methods: {
activeLink(event) {
var checkboxes = document.getElementsByClassName ("noclass");
for (var i=0; i<checkboxes.length; i++) {
checkboxes[i].className = "link active";
//checkboxes[i].className = "link";
}
event.target.className = "noclass";
}
}
})
这是一个替代解决方案,它可能会比您想要的更多地修改您的代码。我认为这可能有用,因为您只是在学习并且可能对替代方案感兴趣。我首先将您的链接声明为 vue 中的对象数组,以便我们可以为每个链接分配一个 active 属性。然后我们可以直接切换活动值内联或使用 toggleActive 函数(当前未使用..如果您更喜欢使用函数而不是内联逻辑,只是为了说明)。
Html:
<div id="app">
<h2>App</h2>
<ul>
<li v-for="l in links">
<a href="#" class="link" :class="{ active: l.active}" @click="l.active = !l.active">{{l.text}}</a>
</li>
</ul>
</div>
Javascript:
var app = new Vue({
el: '#app',
data: {
links: [{
text: "Link text",
active: false
},{
text: "Second text",
active: false
},{
text: "Third text",
active: false
}]
},
methods: {
//To use this function make @click in html to:
//@click="toggleActive(l)"
toggleActive(x) {
x.active = !x.active;
}
}
})
你可以做的是使用 data
属性 来保存当前活动的 link。然后,您将能够进行任何给定的 link 测试,如果它是活动的 link 以及是否应该应用 .active
class。
那么只需在单击 link 时设置 属性 的新值即可。如果单击当前处于活动状态的同一个 link,则会清除 属性,从而从所有 link 中删除 .active
class。否则,class 将添加到被单击的 link。
这是 CodePen 演示我的意思的实际操作,但您的标记可能如下所示:
<li><a href="#" class="link" :class="{ active: activeId == 'link-1' }"
@click.prevent="activeLink('link-1')">Link text</a></li>
<li><a href="#" class="link" :class="{ active: activeId == 'link-2' }"
@click.prevent="activeLink('link-2')">Link text</a></li>
<li><a href="#" class="link" :class="{ active: activeId == 'link-3' }"
@click.prevent="activeLink('link-3')">Link text</a></li>
你的 JS 可能看起来像这样:
data: {
activeId: null
},
methods: {
activeLink(linkIdent) {
this.activeId = this.activeId === linkIdent ? null : linkIdent
}
}
它显然不是一个干净的解决方案,但我坚持您的要求,即解决方案符合您提供的标记。
使用 V-for 和项目数组,这样您就无需静态键入链接。这允许您正在寻找的动态功能。
var app = new Vue({
el: '#app',
data: {
links: [
{text: "Link Text", active: false},
{text: "Link Text", active: false},
{text: "Link Text", active: false}
]
},
methods: {
activate(link) {
link.active = !link.active
}
}
})
.link{
text-decoration: none;
color: #555;
}
.active{
text-decoration: underline;
color: #42b983;
}
<div id="app">
<h2>App</h2>
<ul>
<li v-for="link in links"><a href="#" class="link" :class="{ active: link.active }" @click="activate(link)">Link text</a></li>
</ul>
</div>