Javascript 在VueJS中单击时切换类
我正在学习Vuejs,我经常发现一些简单的事情,比如删除一个类是一件痛苦的事情。请告诉我如何允许基于3个链接之间的点击添加或删除.active类 在下面的示例中,添加工作正常,但它会将.active添加到所有链接,并且在再次单击时不会删除Javascript 在VueJS中单击时切换类,javascript,vuejs2,Javascript,Vuejs2,我正在学习Vuejs,我经常发现一些简单的事情,比如删除一个类是一件痛苦的事情。请告诉我如何允许基于3个链接之间的点击添加或删除.active类 在下面的示例中,添加工作正常,但它会将.active添加到所有链接,并且在再次单击时不会删除 <div id="app"> <h2>App</h2> <ul> <li><a href="#" class="link" :class="{ active: isActive
<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>
JSFIDLE就在这里,您需要捕获方法中的事件处理程序,并使用它来引用被调用方,即本例中的锚对象 看小提琴: 更新: 你可以试试这把小提琴,看看它是否正中靶心:
var-app=新的Vue({
el:“#应用程序”,
数据:{
isActive:错误
},
方法:{
活动链接(事件){
var复选框=document.getElementsByClassName(“noclass”);
对于(var i=0;i这里有一个替代解决方案,它可能会对您的代码进行超出您所需的修改。我认为这可能很有用,因为您正在学习,并且可能对替代方案感兴趣。我首先将您的链接声明为vue中的对象数组,以便我们可以为每个对象分配一个活动属性。然后我们可以切换active value inline或使用TOGLEActive函数(当前未使用..如果您更喜欢使用函数而不是内联逻辑,请参见图示)
Html:
您可以使用数据属性来保存当前活动链接。然后,如果它是活动链接,并且应该应用.active
类,则可以对任何给定的链接进行测试
然后,只需在单击链接时设置该属性的新值。如果单击了当前活动的同一链接,则该属性将被清除,从而从所有链接中删除.active
类。否则,该类将添加到单击的链接中
这是一个演示我在实际操作中的意思的示例,但您的标记可能会如下所示:
<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>
data: {
activeId: null
},
methods: {
activeLink(linkIdent) {
this.activeId = this.activeId === linkIdent ? null : linkIdent
}
}
这显然不是一个干净的解决方案,但我坚持您的要求,即该解决方案符合您提供的标记。使用V-for和一个项目数组,因此您无需静态键入链接。这允许您寻找动态功能
var-app=新的Vue({
el:“#应用程序”,
数据:{
链接:[
{text:“链接文本”,活动:false},
{text:“链接文本”,活动:false},
{text:“链接文本”,活动:false}
]
},
方法:{
激活(链接){
link.active=!link.active
}
}
})
.link{
文字装饰:无;
颜色:#555;
}
.主动{
文字装饰:下划线;
颜色:#42b983;
}
应用程序
您好,看着您的小提琴,这不会删除。单击其他链接时不会删除类。啊,您想在单击任何其他锚点时删除该类。无法理解。这将在再次单击同一元素时重置类。只是一个切换效果。试试看。是的,我明白了,有没有办法让它在所有三个链接之间切换?我尝试过你的示例,但无法使其发挥作用。请检查更新的小提琴。它正在从所有链接中删除“noclass”,将“链接活动”类分配给它们,并将“noclass”分配给被单击的对象。你可以使用“链接活动”进行操作根据需要。您好,谢谢,但我正在寻找一种可以与我的代码一起工作的解决方案。谢谢,但有没有一种方法可以使用if语句来实现这一点?我已经尝试过,但它针对的是所有项目,而不是正在单击的项目。您的示例中的问题是,没有任何标识哪个链接处于活动状态的方法。它只是为整个应用程序。你必须有某种方法来识别每个链接,然后设置相应的标识符以将该链接标记为活动链接。这就是我的示例所演示的。如果出于某种原因必须使用If
语句,你只需将我的activeLink
函数的主体更改为If即可(this.activeId==LinkId)this.activeId=null;else this.activeId=LinkId;
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";
}
}
})
<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>
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;
}
}
})
<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>
data: {
activeId: null
},
methods: {
activeLink(linkIdent) {
this.activeId = this.activeId === linkIdent ? null : linkIdent
}
}