Вам просто нужно представить соответствующее состояние, используя свойства в data
. Всякий раз, когда вы испытываете желание манипулировать DOM напрямую, просто обновите какое-то состояние и подключите его к шаблону соответственно.
Надеюсь, эта демонстрация сделает то, что вы хотите:
new Vue({
el: '#app',
data () {
return {
active: 0,
items: [
'Red',
'Green',
'Blue',
'Yellow'
]
}
},
mounted () {
this.startTimer()
},
destroyed () {
this.stopTimer()
},
methods: {
onMouseEnter (index) {
this.stopTimer()
this.active = index
},
onMouseLeave () {
this.startTimer()
},
startTimer () {
if (this.timerId) {
return
}
this.timerId = setInterval(() => {
this.active = (this.active + 1) % 4
}, 500)
},
stopTimer () {
clearInterval(this.timerId)
this.timerId = null
}
}
})
ul {
border: 1px solid #777;
margin: 0;
padding: 0;
}
li {
list-style: none;
padding: 5px;
}
.active {
background: #ccf;
}
<script src="https://unpkg.com/vue@2.6.10/dist/vue.js"></script>
<div id="app">
<ul>
<li
v-for="(item, index) in items"
:key="item"
:class="{ active: active === index }"
@mouseenter="onMouseEnter(index)"
@mouseleave="onMouseLeave"
>
{{ item }}
</li>
</ul>
</div>