اتصال پویا از کلاس ها و سبک های CSS در Vue 3 ، Svelte 5 و Angular

جداول مطالب
در روز 9 ، من نشان خواهم داد که چگونه Vue 3 ، Sveltekit و Angular کلاس CSS پویا و اتصال سبک را انجام می دهند. نمونه ای از اتصال کلاس CSS و اتصال سبک وجود دارد. هنگامی که یک مورد خریداری می شود ، کلاس اعتصاب اعمال می شود. هنگامی که یک مورد از اولویت بالا در نظر گرفته می شود ، از کلاس اولویت استفاده می شود. هنگامی که کادر انتخاب اولویت بالا در فرم ADD مورد بررسی می شود ، متن توسط سبک وزن فونت جسورانه می شود.
مورد 1: کلاس CSS پویا اتصال به لیست مورد
<script setup lang="ts">
import { Icon } from '@iconify/vue'
import { ref, computed } from 'vue'
type Item = { id: number; label: string; highPriority: boolean; purchased: boolean }
const items = ref<Item[]>([])
const togglePurchase = (item: Item) => {
item.purchased = !item.purchased
}
</script>
<template>
<ul>
<div class="list-item" v-for="item in items" :key="item.id">
<li
:class="[{ priority: item.highPriority }, { strikeout: item.purchased }]"
@click="togglePurchase(item)"
>
{{ item.id }} - {{ item.label }}
</li>
</div>
</ul>
</template>
در Vue 3 ، کلاس CSS یک عنصر می تواند به یک آرایه یا شیء محدود شود. در این مثال ، من یک آرایه را به کلاس CSS منتقل کردم
{ strikeout: item.purchased } – وقتی purchased خاصیت یک مورد درست است ، strikeout کلاس فعال است. در غیر این صورت ، کلاس غیرفعال است. هنگام کلیک بر روی
togglePurchase عملکرد خاصیت را تغییر داد. در نتیجه ، strikeout کلاس از نظر برنامه ای اعمال شد.
{ priority: item.highPriority } – به همین ترتیب ، priority کلاس برای
highPriority خاصیت یک مورد درست است. هنگامی که کاربران کادر انتخاب اولویت بالا را بررسی کرده و مورد را ذخیره می کنند ، ویژگی صحیح است و متن با رنگ متنی متفاوت نمایش داده می شود.
اگر می خواهیم شیء را به کلاس منتقل کنیم ، راه حل است :class="{ priority: item.highPriority, strikeout: item.purchased }"
<script lang="ts">
import Icon from '@iconify/svelte';
type Item = { id: number; label: string; purchased: boolean; higherPriority: boolean };
let items = $state([] as Item[]);
function togglePurchased(item: Item) {
item.purchased = !item.purchased;
newItem = '';
newItemHigherPriority = false;
}
</script>
<ul>
{#each items as item (item.id)}
<div class="list-item">
<li class={[item.purchased && 'strikeout', item.higherPriority && 'priority']}>{item.id} - {item.label}</li>
<button class="btn" onclick={() => togglePurchased(item)} aria-label="purchase an item">
<Icon icon={!item.purchased ? "ic:baseline-check" : "ic:baseline-close" } />
</button>
</div>
{/each}
</ul>
کامپایلر Svelte هشدار دهنده ای را صادر می کند
togglePurchase تابع برای جابجایی purchased خاصیت
مانند Vue 3 ، کلاس CSS یک عنصر می تواند به یک آرایه یا شیء محدود شود. در این مثال ، من یک آرایه را به کلاس CSS منتقل کردم
{ item.purchased && 'strikeout' } – وقتی purchased خاصیت یک مورد درست است ، strikeout کلاس فعال است. در غیر این صورت ، کلاس غیرفعال است.
{ item.highPriority && 'priority' } – به همین ترتیب ، کلاس اولویت برای
highPriority خاصیت یک مورد درست است. هنگامی که کاربران کادر انتخاب اولویت بالا را بررسی کرده و مورد را ذخیره می کنند ، ویژگی صحیح است و متن با رنگ متنی متفاوت نمایش داده می شود.
اگر می خواهیم شیء را به کلاس منتقل کنیم ، راه حل است :class="{{ priority: item.highPriority, strikeout: item.purchased }}"
import { ChangeDetectionStrategy, Component, computed, signal } from '@angular/core';
type Item = { id: number; label: string; purchased: boolean; highPriority: boolean };
@Component({
selector: 'app-shopping-cart',
imports: [],
template: `
`,
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ShoppingCartComponent {
items = signal<Item[]>([]);
newItem = signal('');
newItemHighPriority = signal(false);
togglePurchase(item: Item) {
this.items.update((items) =>
return items.map((element) => (element.id === item.id ? { ...element, purchased: !element.purchased } : element));
});
this.newItem.set('');
this.newItemHighPriority.set(false);
}
}
زاویه ای معرفی کرد @let نحو ، که می تواند یک متغیر موقتی در الگوی HTML ایجاد کند.
@let itemClasses = {
priority: item.highPriority,
strikeout: item.purchased,
};
itemClasses است ، { priority } کی item.highPriority درست است itemClasses است ، { strikeout } کی item.purchased درست است کلاس های مختلف را می توان در یک شی ادغام کرد. وقتی هر دو خاصیت درست باشند ، itemClasses است ، { priority, strikeout }بشر
مشابه اتصال به ویژگی ، از نحو جعبه برای اتصال کلاس استفاده می شود. [class]="itemClasses" عبور می کند itemClasses متغیر موقت به کلاس CSS
مورد 2: اتصال سبک پویا به کادر انتخاب با اولویت بالا
وقتی newItemHighPriority Ref درست است ، font-weight style کادر انتخاب با اولویت بالا روی تنظیم شده است boldبشر در غیر این صورت ، تنظیم شده است normalبشر { font-weight: newItemHighPriority ? 'bold': 'normal' } برای استفاده از سبک درون خطی به ویژگی سبک منتقل می شود.
<script setup lang="ts">
import { Icon } from '@iconify/vue'
import { ref, computed } from 'vue'
const newItemHighPriority = ref(false)
const saveItem = () => { … same logic as before … }
</script>
<template>
<form v-if="isEditing" @submit.prevent="saveItem">
<label>
<input type="checkbox" v-model="newItemHighPriority" />
<span :style="{ 'font-weight': newItemHighPriority ? 'bold' : 'normal' }">
High Priority</span
>
</label>
</form>
</template>
وقتی newItemHighPriority Rune درست است ، font-weight سبک کادر انتخاب با اولویت بالا روی تنظیم شده است boldبشر در غیر این صورت ، تنظیم شده است normalبشر style:font-weight={ newItemHighPriority ? 'bold': 'normal' } مقدار CSS را به font-weight سبک درون خطی
<script lang="ts">
import Icon from '@iconify/svelte';
let newItemHigherPriority = $state(false);
async function handleSubmit(event: SubmitEvent) {
... same logic as before ...
}
</script>
<form method="POST" onsubmit={handleSubmit}>
<label>
<input id="higherPriority" name="higherPriority" type="checkbox" bind:checked={newItemHigherPriority}
/>
<span style:font-weight={newItemHigherPriority ? 'bold' : 'normal'}> Higher Priority</span>
</label>
</form>
وقتی newItemHighPriority سیگنال درست است ، font-weight سبک کادر انتخاب با اولویت بالا روی تنظیم شده است boldبشر در غیر این صورت ، تنظیم شده است normalبشر
هر دو سبک و کلاس از نحو جعبه برای اتصال استفاده می کنند. [style.fontWeight]="newItemHighPriority ? 'bold': 'normal'"بشر بیان سه گانه برمی گردد bold وقتی درست و normal در غیر این صورت
سبک CSS از مورد شتر در زاویه ای استفاده می کند. به عنوان مثال ، “وزن فونت” شخصیت داش را با یک خالی جایگزین می کند و “وزن” سرمایه گذاری می شود. بنابراین ، font-weight تبدیل شده به fontWeightبشر
این سبک همچنین شی را می پذیرد. معادل آن است [style]={ fontWeight: newItemHighPriority: 'bold' : 'normal' }بشر
import { ChangeDetectionStrategy, Component, computed, signal } from '@angular/core';
import { FormsModule } from '@angular/forms';
@Component({
selector: 'app-shopping-cart',
imports: [FormsModule],
template: `
`,
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class ShoppingCartComponent {
newItemHighPriority = signal(false);
saveItem() { … same logic as before … }
}
منابع
مخازن GitHub
صفحات github
ما با موفقیت مؤلفه سبد خرید را به روز کرده ایم تا مقادیر را به کلاسهای CSS یا سبک های درون خطی منتقل کنیم.
`



