Poznajemy binding dla class i style tak, aby computed values je wyznaczały dynamicznie. Kolejna łatwa, prosta i przyjemna lekcja. Do dzieła.
Ok, za przykład posłuży nam komponent z pewnego kursu internetowego, który później rozbudujemy:
<template>
<span class="badge" :class="classes">{{ caption }}</span>
</template>
<script>
export default {
props: ['type', 'caption'],
computed: {
classes() {
return {
'badge--admin': this.type === 'admin',
'badge--author': this.type === 'author',
};
},
}
};
</script>
<style scoped>
.badge {
display: inline-block;
padding: 0.5rem 1rem;
border-radius: 30px;
background-color: #ccc;
color: #2e2e2e;
}
.badge--admin {
background-color: #810036;
color: white;
}
.badge--author {
background-color: #002c8a;
color: white;
}
</style>
Od razu widzimy, jak działają computed values w prawdziwym projekcie. :class to binding dla class. Swoją drogą mamy tam zarówno class jak i :class.
To pierwsze – statyczna wartość, która nie ulegnie zmianie. To drugie – dynamiczna wartość, wyliczana przez computed property. Jedno i drugie może istnieć obok siebie, zostanie zbatchowanie w jedną całość.
Ok, dodajemy i używamy w App.vue:
<template>
//(...)
<base-badge type="admin" caption="ADMIN"></base-badge>
<base-badge type="author" caption="author"></base-badge>
</template>
<script>
//(...)
import BaseBadge from './components/BaseBadge.vue';
export default {
name: 'App',
components: {
HelloWorld,
FirstComponent,
PropsComponent,
BaseBadge
}
}
</script>
//(...)
Działa. Prop jest używamy przez computed property, która decyduje o tym, jakie klasy dostanie element. Teraz zrobimy sobie bindowanie stylów CSS:
<template>
<span class="badge" :class="classes" :style="styles">{{ caption }}</span>
</template>
<script>
export default {
props: ['type', 'caption', 'fs', 'm_inline'],
computed: {
classes() {
return {
'badge--admin': this.type === 'admin',
'badge--author': this.type === 'author',
};
},
styles(){
return {
'font-size': this.fs + "px",
'margin-inline': this.m_inline + "px",
'font-weight': this.type === 'admin' ? 'bold' : 'normal'
}
}
}
};
</script>
Teraz wystarczy tylko tego użyć:
<base-badge type="admin" caption="ADMIN" m_inline="16" fs="22"></base-badge>
<base-badge type="author" caption="author" fs="14"></base-badge>
Wszystko działa bezproblemowo.