What do we need?
A Vue project with SassCSS (I'm using my last project and modified it to use it in this example).
A SCSS base styles, also I added in the repo in assets folder
Step 1
In a ToggleButton.vue
file we will create our button
<template>
<label
:for="'button-'+id"
:class="{ active: isActive }"
class="toggle__button"
@change="OnChange"
>
<span v-if="isActive" class="toggle__label">{{ enableText }}</span>
<span v-if="!isActive" class="toggle__label">{{ disabledText }}</span>
<input
type="checkbox"
:disabled="disabled"
:id="'button-'+id"
v-model="checkedValue"
/>
<span class="toggle__switch"></span>
</label>
</template>
<script>
export default {
props: {
disabled: {
type: Boolean,
default: false
},
labelEnableText: {
type: String,
default: "On"
},
labelDisableText: {
type: String,
default: "Off"
},
id: {
type: String,
default: "primary"
},
defaultState: {
type: Boolean,
default: false
},
item: Object
},
data() {
return {
currentState: this.defaultState
};
},
watch: {
defaultState: function defaultState() {
this.currentState = Boolean(this.defaultState);
}
},
methods: {
OnChange() {
this.$emit("OnChange");
}
},
computed: {
isActive() {
return this.currentState;
},
enableText() {
return this.labelEnableText;
},
disabledText() {
return this.labelDisableText;
},
checkedValue: {
get() {
return this.currentState;
},
set(newValue) {
this.currentState = newValue;
this.$emit("change", newValue);
},
},
}
};
</script>
Step 2
In a CardItem.vue
file we will create a card component
<template>
<div class="carditem">
<div class="carditem__image">
<img :src="pathBase+'futurama'+character.id+'.jpg'" />
</div>
<div class="carditem__info">
<strong class="carditem__title">{{ character.name.first }} {{ character.name.last }}</strong>
<span>{{ character.occupation }}</span>
<span>{{ character.species }}</span>
<slot></slot>
</div>
</div>
</template>
<script>
export default {
name: "CardItem",
props: {
character: {
type: Object,
},
index: Number,
showPage: {
type: Boolean,
default: false,
},
},
data() {
return {
pathBase: "https://res.cloudinary.com/lariicsa/image/upload/v1602727260/futurama/",
charImages: [
{ name: "Philip", url: "" },
{ name: "Turanga", url: "" },
{ name: "Bender", url: "futurama4_pxj04y.jpg" },
{ name: "Hubert", url: "" },
{ name: "Amy", url: "" },
{ name: "Hermes", url: "" },
{ name: "Carol", url: "" },
{ name: "John", url: "" },
{ name: "Zapp", url: "" },
{ name: "Scruffy", url: "" },
{ name: "Cubert", url: "" },
{ name: "Kif", url: "" },
{ name: "Dwight", url: "" },
{ name: "LaBarbara", url: "" },
],
};
},
mounted() {
this.index;
},
};
</script>
Step 3
In App.vue
file, our main view, we will integrate our components
<template>
<div id="app" class="space">
<div class="container">
<div class="row center">
<h1>Futurama</h1>
</div>
<div class="row center">
<div class="row between">
<CardItem
v-for="(character, index) in characters"
:character="character"
:key="index"
:index="index"
>
<ToggleButton
:item="character"
:defaultState="false"
:id="index.toString()"
@OnChange="AddTofavs()"
/>
</CardItem>
</div>
</div>
</div>
</div>
</template>
<script>
import store from "@/fakeStore/characters";
import CardItem from "@/components/CardItem";
import ToggleButton from "@/components/ToggleButton";
export default {
name: "App",
components: {
CardItem,
ToggleButton
},
data() {
return {
characters: store.characters
};
},
methods: {
AddTofavs() {
this.$emit("AddTofavs")
}
}
};
</script>
We are using Watch Vue property to listen the checkbox state.
Also we can use this component with store actions.
Here you can check the Demo Link
Happy wapi Coding! :D
Top comments (0)