Я использую v-for для создания кнопок. Я добавляю класс .active, если isActiveButton() возвращает true:
<button
v-for = "(text, index) in this.buttonOptions"
class = "btn"
:class = "{active: isActiveButton(text)}"
:value='text'
@mousedown.prevent @click = "some_method">
{{text}}
</button>
Как лучше всего добавить класс .active к первой кнопке, если isActive() возвращает false для всеbuttonOptions? Обратите внимание, что buttonOptions является опорой.
редактировать блок кода





Используйте вычисляемый, который фильтрует this.buttonOptions, где isActiveButton имеет значение true и принимает индекс в качестве параметра
Вычисленное свойство - это то, что вам нужно!
var app = new Vue({
el: '#app',
data: {
buttonOptions: ['button1', 'button2', 'button3', 'button4']
},
methods: {
isActiveButton: function (text) {
return (text === text.toUpperCase());
},
some_method: function() {
console.info('Button clicked')
}
},
computed: {
shouldFirstBeActive: function () {
return (this.buttonOptions.filter(el => this.isActiveButton(el))).length === 0
}
}
});.active {
background: #f00;
}<script src = "https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<div id = "app">
<section>
<button
v-for = "(text, index) in buttonOptions"
class = "btn"
:class = "{active: isActiveButton(text) || (shouldFirstBeActive && index === 0)}"
:value='text'
@mousedown.prevent @click = "some_method">
{{text}}
</button>
</section>
</div>Я не знаю, что делают методы isActiveButton, поэтому мне пришлось импровизировать: он проверяет, является ли строка прописной.
В чем хитрость - это вычисленное свойство shouldFirstBeActive, которое возвращает true, если все элементы в массиве buttonOptions не справляются с методом isActiveButton:
return (this.buttonOptions.filter(el => this.isActiveButton(el))).length === 0
Если, например, вы измените button2 на BUTTON2, то isActiveButton вернет true для этого элемента, что преобразует вычисленное свойство shouldFirstBeActive в false.
var app = new Vue({
el: '#app',
data: {
buttonOptions: ['button1', 'BUTTON2', 'button3', 'button4']
},
methods: {
isActiveButton: function (text) {
return (text === text.toUpperCase());
},
some_method: function() {
console.info('Button clicked')
}
},
computed: {
shouldFirstBeActive: function () {
return (this.buttonOptions.filter(el => this.isActiveButton(el))).length === 0
}
}
});.active {
background: #f00;
}<script src = "https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<div id = "app">
<section>
<button
v-for = "(text, index) in buttonOptions"
class = "btn"
:class = "{active: isActiveButton(text) || (shouldFirstBeActive && index === 0)}"
:value='text'
@mousedown.prevent @click = "some_method">
{{text}}
</button>
</section>
</div>
Предполагается, что этот
,появится раньше, чем:value?