برنامه نویسی

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

    `

  • نوشته های مشابه

    دیدگاهتان را بنویسید

    نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

    دکمه بازگشت به بالا