单击时如何更改特定(此)按钮 class。使用 Vue.js 2.0
How to change a specific (this) button class when click on. Using Vue.js 2.0
单击任何按钮时,它们都将变为活动状态。所以我想要的只是应该改变点击的那个。
var vm = new Vue({
el: '#toolBtns',
data: {
isActive: false
},
computed: {
activeClass: function () {
return {
active: this.isActive
};
}
}
});
<div class="btn-group" role="group" id="toolBtns">
<button class="btn" type="button" @click="isActive = !isActive" :class="activeClass">Btn1</button>
<button class="btn" type="button" @click="isActive = !isActive" :class="activeClass">Btn2</button>
<button class="btn" type="button" @click="isActive = !isActive" :class="activeClass">Btn3</button></div>
您可能需要一个变量来查找当前 select 哪个按钮。您可以使用该变量动态绑定正确的 class: 和 : :class="{active: activeBtn === 'btn1' }"
。
这种方法的好处是您只有一个变量而不是数组来保存当前 select 哪个按钮,因此您不必每次 select 一个按钮时都在数组上迭代。
var vm = new Vue({
el: '#toolBtns',
data: {
activeBtn:''
}
});
.active{
background-color:red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.1.10/vue.js"></script>
<div id="toolBtns">
<div class="btn-group" role="group" id="toolBtns">
<button class="btn" type="button" @click="activeBtn = 'btn1'" :class="{active: activeBtn === 'btn1' }">Btn1</button>
<button class="btn" type="button" @click="activeBtn = 'btn2'" :class="{active: activeBtn === 'btn2' }">Btn2</button>
<button class="btn" type="button" @click="activeBtn = 'btn3'" :class="{active: activeBtn === 'btn3' }">Btn3</button></div>
</div>
查看工作 fiddle here。
上述解决方案的方向是正确的,但由于直接使用索引,因此很容易出错。
正如上面的答案所建议的那样,做一个 v-for 基本上可以解决你的问题。
var vm = new Vue({
el: '#toolBtns',
data: {
buttons:[{name:'Btn1',active:false},{name:'Btn2',active:false},
{name:'Btn3',active:false}]
},
methods: {
toggleActiveClass:function(index){
this.buttons[index].active=!this.buttons[index].active;
}
}
});
<div class="btn-group" role="group" id="toolBtns">
<button v-for="(btn, index) in buttons" type="button"
@click="toggleActiveClass(index)"
:class="{active: btn.active}">{{btn.name}}
</button>
</div>
工作fiddle:https://jsfiddle.net/z11fe07p/547/
您不需要设置'isActive: false',也不需要为每个项目绑定isActive。你可以这样做: 1、声明一个数组,叫做'candidates',那么每个被点击的项目都会被推入候选人。 2,声明一个名为 'contains()' 的函数,它检查一个项目是否在 candidates 数组中。 3、为每一项绑定contains()。 4、在CSS中,给'clicked'一些样式。
html代码:
<body>
<div id="toolBtns">
<button v-for="item in buttons" v-on:click="provide(item)" v-bind:class="{clicked: contains(candidates, item)}" type="button">{{ item.name }}
</button>
</div>
</body>
javascript代码:
var toolBtns = new Vue({
el: '#toolBtns',
data:
{
buttons: [
{name: 'Btn1'},
{name: 'Btn2'},
{name: 'Btn3'},
],
candidates: [],
},
methods:
{
provide: function(item)
{
if(this.candidates.indexOf(item) == -1)
{
this.candidates.push(item);
}
else
{
this.candidates.splice(this.candidates.indexOf(item), 1);
}
},
contains: function(arr, item)
{
return arr.indexOf(item) != -1;
},
}
});
CSS代码
.clicked{
background-color: red;
}
这是 jsfiddle 示例 https://jsfiddle.net/JoyAndBrave/anzdzq4L/6/
单击任何按钮时,它们都将变为活动状态。所以我想要的只是应该改变点击的那个。
var vm = new Vue({
el: '#toolBtns',
data: {
isActive: false
},
computed: {
activeClass: function () {
return {
active: this.isActive
};
}
}
});
<div class="btn-group" role="group" id="toolBtns">
<button class="btn" type="button" @click="isActive = !isActive" :class="activeClass">Btn1</button>
<button class="btn" type="button" @click="isActive = !isActive" :class="activeClass">Btn2</button>
<button class="btn" type="button" @click="isActive = !isActive" :class="activeClass">Btn3</button></div>
您可能需要一个变量来查找当前 select 哪个按钮。您可以使用该变量动态绑定正确的 class: 和 : :class="{active: activeBtn === 'btn1' }"
。
这种方法的好处是您只有一个变量而不是数组来保存当前 select 哪个按钮,因此您不必每次 select 一个按钮时都在数组上迭代。
var vm = new Vue({
el: '#toolBtns',
data: {
activeBtn:''
}
});
.active{
background-color:red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.1.10/vue.js"></script>
<div id="toolBtns">
<div class="btn-group" role="group" id="toolBtns">
<button class="btn" type="button" @click="activeBtn = 'btn1'" :class="{active: activeBtn === 'btn1' }">Btn1</button>
<button class="btn" type="button" @click="activeBtn = 'btn2'" :class="{active: activeBtn === 'btn2' }">Btn2</button>
<button class="btn" type="button" @click="activeBtn = 'btn3'" :class="{active: activeBtn === 'btn3' }">Btn3</button></div>
</div>
查看工作 fiddle here。
上述解决方案的方向是正确的,但由于直接使用索引,因此很容易出错。 正如上面的答案所建议的那样,做一个 v-for 基本上可以解决你的问题。
var vm = new Vue({
el: '#toolBtns',
data: {
buttons:[{name:'Btn1',active:false},{name:'Btn2',active:false},
{name:'Btn3',active:false}]
},
methods: {
toggleActiveClass:function(index){
this.buttons[index].active=!this.buttons[index].active;
}
}
});
<div class="btn-group" role="group" id="toolBtns">
<button v-for="(btn, index) in buttons" type="button"
@click="toggleActiveClass(index)"
:class="{active: btn.active}">{{btn.name}}
</button>
</div>
工作fiddle:https://jsfiddle.net/z11fe07p/547/
您不需要设置'isActive: false',也不需要为每个项目绑定isActive。你可以这样做: 1、声明一个数组,叫做'candidates',那么每个被点击的项目都会被推入候选人。 2,声明一个名为 'contains()' 的函数,它检查一个项目是否在 candidates 数组中。 3、为每一项绑定contains()。 4、在CSS中,给'clicked'一些样式。
html代码:
<body>
<div id="toolBtns">
<button v-for="item in buttons" v-on:click="provide(item)" v-bind:class="{clicked: contains(candidates, item)}" type="button">{{ item.name }}
</button>
</div>
</body>
javascript代码:
var toolBtns = new Vue({
el: '#toolBtns',
data:
{
buttons: [
{name: 'Btn1'},
{name: 'Btn2'},
{name: 'Btn3'},
],
candidates: [],
},
methods:
{
provide: function(item)
{
if(this.candidates.indexOf(item) == -1)
{
this.candidates.push(item);
}
else
{
this.candidates.splice(this.candidates.indexOf(item), 1);
}
},
contains: function(arr, item)
{
return arr.indexOf(item) != -1;
},
}
});
CSS代码
.clicked{
background-color: red;
}
这是 jsfiddle 示例 https://jsfiddle.net/JoyAndBrave/anzdzq4L/6/