Vue.js:使用方法切换动态数据的 CSS 类

Posted

技术标签:

【中文标题】Vue.js:使用方法切换动态数据的 CSS 类【英文标题】:Vue.js: Toggle CSS class for dynamical data with method 【发布时间】:2019-05-15 23:23:09 【问题描述】:

我有以下代码:

<template>
<div id="projects">
  <Header />
  <b-container>
    <div class="row">
      <div :class="colSize" v-for="(data, index) in projects" :key="data._id">
        <b-card :title="data.name" :sub-title="user.jobresponsibilities">
          <p class="card-text">
            data.description
          </p>
          <b-btn v-b-toggle="'collapse'+index" @click="showCollapse(data)">Toggle Collapse</b-btn>
          <b-collapse :id="'collapse'+index">
            <b-card>
              description
            </b-card>
          </b-collapse>
        </b-card>
      </div>

    </div>
  </b-container>
</div>
</template>

<script>
import Header from '@/components/Header'
export default 
  name: 'dashboard',
  components: 
    Header
  ,
  mounted() ,
  methods: 
    showCollapse(data) 
      this.colSize = 'col-8'
    
  ,
  data() 
    return 
      user: this.$store.getters.getUser,
      projects: this.$store.getters.getProject,
      colSize: 'col-4',
      show: false
    
  

</script>

<style lang="scss">
#projects 
    background-color: rgb(243, 243, 243);

</style>

Store.js:https://jsbin.com/kejinihoci/edit?js

我想要实现的是,当我点击切换按钮时,特定的列大小会发生变化(css 类),并且它只显示此项而不是其他项的可折叠。

我尝试向 v-model 添加一个 ID 以将其添加到我的方法中,但它不起作用。

【问题讨论】:

【参考方案1】:

您应该做一些动态的事情,例如为每个 collapse 分配一个唯一的 id (id="'collapse'+index"),并在对应按钮 v-b-toggle="'collapse'+index" 内使用 v-b-toggle 指令:

   <b-btn v-b-toggle="'collapse'+index" class="m-1">Toggle Collapse</b-btn>
      <b-collapse id="'collapse'+index" >
        <b-card>
          description
        </b-card>
      </b-collapse>

要使类动态更改,您应该将一个名为 descShown 的属性添加到您的 projects 数组中。

在您的store 内的getProject 操作中

        let project = resp.data.project
        project=project.map((p)=>
               p.descShown=false;
               return p;
               )
        commit('getProject_success', 
          project
        )

模板内:

    <div :class="['col-8':data.descShown,'col-6':!data.descShown" v-for="(data, index) in projects" :key="data._id">

   ...
  <b-btn v-b-toggle="'collapse'+index" @click="showCollapse(index)">

你的方法应该是这样的:

   showCollapse(index) 
        this.$set(this.projects,index,true);
     

【讨论】:

感谢您的帮助!这听起来合理且有效。但是切换时如何更改 div 的 CSS 类? 你可以保留@click="showCollapse(data)",这样会改变方法中的类名 我试过了,但showCollapse(data) this.colSize = 'col-8' 改变了每张卡片,而不仅仅是我切换的那张:> 你能显示商店代码吗,我会尝试找到一种基于项目数组使类动态化的方法 我添加了一些细节,希望对你有帮助【参考方案2】:

这是一个很好的机会来利用 vue 的构建目标——组件! 为您的&lt;b-card&gt; 创建一个新组件,将您需要的道具传递给它。这些组件中的每一个都有自己的一组数据和方法。

  <div :class="colSize" v-for="(data, index) in projects" :key="data._id">
    <b-card 
        :cardinfo="
           data.name,
           user.jobresponsibilities
        "
    ></b-card>
  </div>

Vue.component('b-card', 
  props: 
    cardinfo: 
        type: Object
    
  

【讨论】:

以上是关于Vue.js:使用方法切换动态数据的 CSS 类的主要内容,如果未能解决你的问题,请参考以下文章

Vue js切换css类

Vue.js:如何使动态创建的 HTML 使用作用域 CSS?

CSS 在动态路由上不能与 vue js 一起使用

Vue.js 动态组件——传递数据

vue动态绑定class

vue中实现 ‘换肤 / 切换样式主题’ 功能的三种方式详解(干货)