Vue.js:使用方法为动态数据切换 CSS class
Vue.js: Toggle CSS class for dynamical data with method
我有以下代码:
<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 class)并且它只显示可折叠的项目而不是另一个。
我尝试将 ID 添加到 v-model 以将其添加到我的方法中,但没有成功。
你应该做一些动态的事情,比如为每个 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>
要使 class 动态变化,您应该添加一个名为 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);
}
这是一个很好的机会来利用 vue 的构建目的 - 组件!
为您的 <b-card>
创建一个新组件,将您需要的道具传递给它。这些组件中的每一个都有自己的一组数据和方法。
<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
}
}
}
我有以下代码:
<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 class)并且它只显示可折叠的项目而不是另一个。
我尝试将 ID 添加到 v-model 以将其添加到我的方法中,但没有成功。
你应该做一些动态的事情,比如为每个 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>
要使 class 动态变化,您应该添加一个名为 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);
}
这是一个很好的机会来利用 vue 的构建目的 - 组件!
为您的 <b-card>
创建一个新组件,将您需要的道具传递给它。这些组件中的每一个都有自己的一组数据和方法。
<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
}
}
}