【问题标题】:Vue: applying css class if specific condition is metVue:如果满足特定条件,则应用 css 类
【发布时间】:2018-11-07 21:47:40
【问题描述】:

我正在使用 vuex 制作自定义图像滑块,我想将特定的类应用于用于导航滑块的点,因此如果点处于活动状态,它将应用一个 dotActive 类。我想为此使用 activeSlider 变量

这是滑块组件:

<template>
<section class="slider_maincontainer">
    <transition-group name="slider-fade">
        <div class="slider_item" v-show="activeSlider===1" style="background-color:red;">
            <!--slider content-->
        </div>
        <div class="slider_item" v-show="activeSlider===2" style="background-color:blue;">
            <!--slider varied content-->
        </div>
        <div class="slider_item" v-show="activeSlider===3" style="background-color:green;">
            <!--another slider-->
        </div>
    </transition-group>
    <button class="slider_buttom_prev" @click="prevSlider()">
        <i class="slider_buttom_icon fas fa-angle-left"></i>
    </button>
    <button class="slider_buttom_next" @click="nextSlider()">
        <i class="slider_buttom_icon fas fa-angle-right"></i>
    </button>
    <div class="slider_dots_container">
    <!--how to apply custom class to this dot depending of activeIndex
        <span class="slider_dots_dot" v-for="slider in slidersCount" :key="slider" @click="goToSlider(slider)"></span>
    </div>
</section>
</template>
<!--SCRIPTS-->
<script>
import { mapState, mapActions } from 'vuex'
export default {
name: 'MainSlider',

computed:{
    ...mapState('MainSlider', ['activeSlider', 'slidersCount']),
},

mounted() {
    console.log(this.$options.name+' component successfully mounted');
    this.startSlider();
},

methods:{
    ...mapActions('MainSlider', ['nextSlider', 'prevSlider']),
}
};
</script>

还有我的 Slider Store:

//STATE
const state = {
  slidersCount: 3,
  sliderInterval: 3000,
  activeSlider: 1,

}

//GETTERS
const getters = {

}

//ACTIONS
const actions = {


    prevSlider ({ commit, state }) {
        if(state.activeSlider == 1){
            commit( 'TO_LAST_SLIDER' );
        }
        else{
            commit( 'PREV_SLIDER' );
        }
    },


    nextSlider ({ commit, state }) {
        if(state.activeSlider == state.slidersCount){
            commit( 'TO_FIRST_SLIDER' );
        }
        else{
            commit( 'NEXT_SLIDER' );
        }
    },


    goToSlider ({ commit, sliderIndex }) {
        commit('GO_TO_SLIDER', sliderIndex)
        
    },



}

//MUTATIONS
const mutations = {


    PREV_SLIDER (state) {
        state.activeSlider--;
    },

    NEXT_SLIDER (state) {
        state.activeSlider++;
    },

    GO_TO_SLIDER (state, sliderIndex) {
        state.activeSlider = sliderIndex;
    },

    TO_FIRST_SLIDER (state) {
        state.activeSlider = 1;
    },

    TO_LAST_SLIDER (state) {
        state.activeSlider = state.slidersCount;
    },


}

export default {
    namespaced: true, state, getters, actions, mutations
  }

我知道如果每个 dom 滑块与一个对象相关联并使用 v-for,这会变得更容易,但是我不能用原始 dom 元素做到这一点,我没有从后端获取滑块图像或任何东西。

【问题讨论】:

标签: javascript vue.js vuejs2


【解决方案1】:

你可以用这个:

:class="{'activeDotClass':variableThatReturnsTrueOrFalse}"

您所做的基本上是在 {} 中使用 javascript。记得用“:”绑定:class

这里有更多关于类和样式绑定的内容: https://vuejs.org/v2/guide/class-and-style.html

【讨论】:

    【解决方案2】:

    只有当activeSliderspanslider 索引匹配时,您才能使用class binding 激活特定spandotActive 类:

    <span v-for="slider in sliderCount"
          :class="{ dotActive: slider === activeSlider }">
    

    new Vue({
      el: '#app',
      data: () => ({
        activeSlider: 1,
        sliderCount: 3,
      }),
      methods: {
        slide(diff) {
          let slider = (this.activeSlider + diff) % (this.sliderCount + 1);
    
          // wrap around
          if (slider === 0) {
            slider = (diff > 0)
              ? 1
              : this.sliderCount;
          }
    
          this.activeSlider = slider;
        },
      }
    })
    #app {
      display: flex;
      justify-content: center;
      flex-direction: column;
      align-items: center;
    }
    .button_container {
      margin: 20px; 
    }
    .slider_dots_container {
      width: 5%;
      display: flex;
      justify-content: space-around;
    }
    .slider_dots_dot {
      border: solid 2px lightgray;
      border-radius: 50%;
      height: 1px;
    }
    .dotActive {
      border-color: black;
    }
    <script src="https://unpkg.com/vue@2.5.17"></script>
    
    <div id="app">
      <div class="button_container">
        <button @click="slide(-1)">Prev</button>
        <button @click="slide(1)">Next</button>
        {{activeSlider}}
      </div>
      <div class="slider_dots_container">
        <span v-for="slider in sliderCount"
              :key="slider"
              class="slider_dots_dot"
              :class="{ dotActive: slider === activeSlider }">
        </span>
      </div>
    </div>

    【讨论】:

      【解决方案3】:

      您可以按如下方式使用类绑定:

      <div v-bind:class="{ active: isActive }"></div>
      

      其中“isActive”是一个布尔变量,用于控制“active”类是否处于活动状态。

      这个例子直接摘自网上@www.vuejs.org 找到的Vue.js官方文档

      【讨论】:

        猜你喜欢
        • 2021-07-26
        • 2017-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-24
        • 2021-05-10
        • 1970-01-01
        相关资源
        最近更新 更多