Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

156
Visualizações
La forma más limpia de alternar la clase en la lista a través de setInterval

Me gustaría alternar una clase 'activa' en una lista de elementos:

 <div ref="gallery" class="slider"> <div class="slide active"> <div class="slide"> <div class="slide"> </div>

Usando Vue y Vanilla JS

 Slider() { const slider = document.querySelectorAll('.slider') for (const slide of slider) { setInterval(function () { const current = slide.querySelector('.active') current.classList.remove('active') const next = current.nextElementSibling || slide.firstElementChild next.classList.add('active') }, 5000) } }

Si bien el código anterior funciona , creo que no es tan limpio como podría ser.

Además, y principalmente, si apunto el control deslizante usando una referencia Vue como:

 const slider = this.$refs.gallery

deja de funcionar


La respuesta de tony19 me llevó a reducir aún más el código usando Nuxt:

 export default { data() { return { activeIndex: 0, slides: [ { id: 1, text: 'Slide 1' }, { id: 2, text: 'Slide 2' }, { id: 3, text: 'Slide 3' }, ] } }, mounted() { this.Slider() }, methods: { Slider() { setInterval(() => { this.activeIndex = (this.activeIndex + 1) % this.slides.length }, 3000) } } } <template> <div class="slider"> <div v-for="(slide, index) in slides" :key="slide.id" :class="['slide', { active: index === activeIndex }]"> {{ slide.text }} </div> </div> </template>
about 4 years ago · Juan Pablo Isaza
2 Respostas
Responde à pergunta

0

Puede usar un enlace de clase que establezca la class en active según el índice activo:

  1. Declare una propiedad activeIndex para contener el índice activo.

  2. En el gancho mounted , usa setInterval() con una devolución de llamada que incrementa activeIndex . Rastree la ID del temporizador de setInterval() para que podamos detener el temporizador más tarde.

  3. En el gancho unmounted , detenga el temporizador de intervalos con clearInterval() en la ID del temporizador.

  4. Utilice la sintaxis de objetos para vinculaciones de clases para vincular una clase active solo cuando activeIndex coincida con el índice de la diapositiva de v-for .

 <script setup> import { ref, onMounted, onUnmounted } from 'vue' let timerId = -1 1️⃣ const activeIndex = ref(0) const slides = ref([ { id: 1, text: 'Slide 1' }, { id: 2, text: 'Slide 2' }, { id: 3, text: 'Slide 3' }, ]) 2️⃣ onMounted(() => { timerId = setInterval(() => { activeIndex.value = (activeIndex.value + 1) % slides.value.length }, 3000) }) 3️⃣ onUnmounted(() => { clearInterval(timerId) }) </script> <template> <div ref="gallery" class="slider"> <div v-for="(slide, index) in slides" :key="slide.id" class="slide" 4️⃣ :class="{ active: index === activeIndex }"> {{ slide.text }} </div> </div> </template>

manifestación

about 4 years ago · Juan Pablo Isaza Relatório

0

Hice esta demostración en formato vue.js según su solicitud. Eche un vistazo y vea si esto es lo que realmente quiere lograr.

demostración:

 new Vue({ el: '#app', data: { slideData: [{ name: 'Slide 1', isActive: true }, { name: 'Slide 2', isActive: false }, { name: 'Slide 3', isActive: false }] }, mounted() { this.slideData.forEach((obj) => { setInterval(() => { obj.isActive = !obj.isActive; }, 3000); }); } })
 .active { color: white; background-color: green; }
 <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script> <div id="app"> <div v-for="(slider, index) in slideData" class="slide" :class="{ active: slider.isActive }"> {{ slider.name}} </div> </div>

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda