اتصال پویا از کلاس ها و سبک های 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 یا سبک های درون خطی منتقل کنیم.
`