Məzmuna keçin

Front-end

Frontend əsaslı müzakirə kateqoriyası

20 Mövzu 24 Yazı

Alt kateqoriyalar


  • JavaScript haqqında demək olar ki, hər şey

    12 Mövzu
    15 Yazı
    Proqramlaşdırmada Duck Typing — tip yoxlamasının obyektin davranışına əsasən aparılması prinsipidir. Bu ifadə məşhur bir sitatdan götürülüb: “Əgər nəsə ördək kimi gəzir, ördək kimi səs çıxarırsa, deməli bu ördəkdir.” 🧪 Duck Typing nə deməkdir? Duck Typing-də obyektin tipi yox, onun interfeysi və ya xüsusiyyətləri/metodları əsas götürülür. Yəni: function printName(entity) { if (typeof entity.sayName === "function") { entity.sayName(); } else { console.log("Bu obyektin sayName funksiyası yoxdur."); } } Burada entity adlı obyektin sayName() funksiyası olub-olmaması yoxlanılır. Onun hansı sinifdən və ya hansı tipdən olması önəmli deyil. Bu, Duck Typing yanaşmasıdır. JavaScript-də Duck Typing nümunələri const user = { name: "Elvin", sayName() { console.log(`Mənim adım ${this.name}`); }, }; const robot = { id: 42, sayName() { console.log("Mən bir robotam."); }, }; function greet(entity) { entity.sayName(); // Duck Typing prinsipi } greet(user); // Mənim adım Elvin greet(robot); // Mən bir robotam. Hər iki obyektin sayName() funksiyası olduğu üçün greet() funksiyası uğurla işləyir. Obyektlərin tipi yox, davranışları ön plandadır. Duck Typing ilə tip sistemi arasındakı fərqlər Xüsusiyyət Tip əsaslı yanaşma (OOP) Duck Typing (JavaScript) Tip yoxlanışı Kompilyasiya zamanı Run-time (işləmə zamanı) Tipə əsaslanma Sinif və interfeys Obyektin davranışı Quraşdırılmış tiplər Zəruridir Məcburi deyil Əsas məqsəd Güvənlik və sabitlik Çeviklik və sadəlik ️ Duck Typing-in riskləri Duck Typing çox çevik olsa da, müəyyən risklər yarada bilər: Run-time səhvlər: Əgər obyekt gözlənilən funksiyanı ehtiva etmirsə, proqram iş zamanı çökə bilər. Oxunmaz kod: Tip təhlükəsizliyi olmadığından, böyük layihələrdə kodun izlənməsi çətinləşə bilər. IDE köməyi az olur: Tip məlumatı olmadığı üçün kod tamamlaması və səhv yoxlamaları zəif ola bilər. Bu səbəblərə görə, TypeScript kimi dillər Duck Typing-in üstünlüklərini qoruyaraq, struktur tip yoxlaması (structural typing) təklif edir. Duck Typing vs Structural Typing (TypeScript) TypeScript-də interface vasitəsilə Duck Typing daha formal şəkildə tətbiq edilir: interface Nameable { sayName(): void; } function greet(entity: Nameable) { entity.sayName(); } const person = { name: "Aysu", sayName() { console.log("Salam, mən Aysu"); }, }; greet(person); // ✅ Keçərli: struktura uyğundur Burada person Nameable interfeysinə uyğun davranır, çünki sayName metoduna malikdir. Bu, TypeScript-də struktur əsaslı Duck Typing-dir. Nəticə JavaScript-də Duck Typing proqramçıya obyektin funksionallığına görə davranmaq imkanı verir. Bu yanaşma, daha çevik və rahat kod yazmağa imkan yaratsa da, səhv ehtimallarını artırır. Böyük layihələrdə ya öz tip yoxlamanızı əlavə etməlisiniz, ya da TypeScript kimi həllərə üstünlük verməlisiniz.
  • Yenə başqa bir TypeScript 🙂

    2 Mövzu
    3 Yazı
    Mapped Types — TypeScript-in qabaqcıl xüsusiyyətlərindən biridir və mövcud obyektlərin açarlarını (yəni keyof) istifadə edərək yeni tip yarada bilməyə imkan verir. Bu xüsusiyyət əsasən reusable və dinamik tiplər yaratmaq üçün istifadə olunur. 1. Əsas sintaksis və istifadə Mapped Type yaratmaq üçün aşağıdakı sintaksisdən istifadə olunur: type MyMappedType<T> = { [P in keyof T]: T[P]; }; Bu o deməkdir ki, T tipində olan obyektin hər bir açarı (P) üçün həmin açarın tipi saxlanılır. Məsələn: type User = { name: string; age: number; }; type ReadonlyUser = { readonly [P in keyof User]: User[P]; }; // nəticə: // { // readonly name: string; // readonly age: number; // } 2. Sadə misallar a) Readonly type Readonly<T> = { readonly [K in keyof T]: T[K]; }; b) Partial type Partial<T> = { [K in keyof T]?: T[K]; }; c) Required type Required<T> = { [K in keyof T]-?: T[K]; }; 3. as ilə Key Rename (Advanced Feature) type RemoveUnderscore<T> = { [K in keyof T as K extends `_${infer R}` ? R : K]: T[K]; }; type User = { _id: string; name: string; }; type CleanUser = RemoveUnderscore<User>; // Nəticə: // { // id: string; // name: string; // } Burada as operatoru ilə _${infer R} pattern-i ilə başlayan açarları R şəklində dəyişmişik. 4. Record Mapped Type kimi type Record<K extends keyof any, T> = { [P in K]: T; }; const roles: Record<"admin" | "user", boolean> = { admin: true, user: false, }; 5. Real həyatdan misal Form input-lar üçün model yaradın: type FormFields = { email: string; password: string; }; type FormErrors = { [K in keyof FormFields]?: string; }; Bu halda FormErrors tipində email və password sahələri olacaq, amma optional və dəyərləri string olacaq.
  • CSS aid olan müxtəlif mövzular

    2 Mövzu
    2 Yazı
    CSS Flexbox (Flexible Box Layout) veb səhifələrdə elementlərin elastik və səmərəli şəkildə yerləşdirilməsi üçün istifadə olunan güclü bir layout modelidir. Flexbox xüsusilə kompleks tərtibatlarda (naviqasiya panelləri, kart düzülüşləri, məzmun bölgüləri və s.) dizaynerlərə və proqramçılara böyük rahatlıq təmin edir. Bu məqalədə Flexbox-un əsas anlayışları, xüsusiyyətləri və istifadəsi ətraflı şəkildə izah olunacaq. Flexbox-un əsas anlayışları Flex Container və Flex Item Flexbox istifadəsi üçün ilk öncə bir konteyner yaradılır. Bu konteyner display: flex; və ya display: inline-flex; ilə aktivləşdirilir: .container { display: flex; } Bu konteyner daxilində olan bütün child elementlər (flex item-lar) artıq flexbox qaydalarına uyğun şəkildə davranacaq. Əsas istiqamət (Main Axis) və Çarpaz istiqamət (Cross Axis) Flexbox-da iki əsas ox anlayışı var: Main Axis – elementlərin düzüləcəyi əsas istiqamət. Cross Axis – əsas oxun əksi istiqamət. flex-direction xüsusiyyəti main axis-in istiqamətini təyin edir: .container { flex-direction: row; /* Default - soldan sağa */ flex-direction: row-reverse; flex-direction: column; flex-direction: column-reverse; } Elementlərin əsas oxa görə yerləşdirilməsi: justify-content Flex item-ları əsas ox üzrə necə yerləşdirmək istədiyinizi təyin edir: .container { justify-content: flex-start; /* Sol tərəfə düzülür */ justify-content: flex-end; /* Sağ tərəfə düzülür */ justify-content: center; /* Ortaya düzülür */ justify-content: space-between;/* Aralarında boşluq, kənarlar sıx */ justify-content: space-around; /* Ətrafında bərabər boşluq */ justify-content: space-evenly; /* Bütün boşluqlar bərabər */ } Elementlərin çarpaz oxa görə yerləşdirilməsi: align-items Cross axis üzrə yerləşdirməni təyin edir: .container { align-items: stretch; /* Default - boyu uyğunlaşdırır */ align-items: flex-start; /* Yuxarıya düzülür */ align-items: flex-end; /* Aşağıya düzülür */ align-items: center; /* Ortaya düzülür */ align-items: baseline; /* Mətnin xəttinə görə düzülür */ } Çox sətirli flex yerləşdirmə: flex-wrap Elementlər bir sətrə sığmadıqda, yeni sətrə keçməsini istəyirsinizsə: .container { flex-wrap: nowrap; /* Default - sarılmır */ flex-wrap: wrap; /* Sarılır */ flex-wrap: wrap-reverse; } Kombinasiya üçün: .container { flex-flow: row wrap; /* flex-direction və flex-wrap birlikdə */ } Çoxlu sətirlərin çarpaz oxa görə yerləşdirilməsi: align-content Çoxlu sətirlər olduqda bütün sətirlərin cross axis üzrə yerləşməsini təyin edir: .container { align-content: flex-start; align-content: flex-end; align-content: center; align-content: space-between; align-content: space-around; align-content: stretch; } Flex item xüsusiyyətləri order: Elementlərin sırasını dəyişmək Elementlərin sırasını dəyişmək üçün: .item { order: 2; /* Default 0-dır, daha kiçik olan daha əvvəl gəlir */ } flex-grow: Elementin böyümə qabiliyyəti Elementin böyümə qabiliyyəti: .item { flex-grow: 1; } Əgər bir neçə element flex-grow: 1; olarsa, boşluq bərabər paylaşılır. flex-shrink: Elementin kiçilmə qabiliyyəti Elementin kiçilmə qabiliyyəti: .item { flex-shrink: 1; } flex-basis: Başlanğıc ölçü Başlanğıc ölçünü təyin edir: .item { flex-basis: 100px; } flex: Qısa yazılış .item { flex: 1 0 100px; /* grow shrink basis */ } align-self: Tək element üçün yerləşmə Xüsusi bir item üçün fərdi yerləşdirmə: .item { align-self: flex-start; align-self: center; align-self: flex-end; align-self: stretch; } Nümunə <div class="container"> <div class="item">1</div> <div class="item">2</div> <div class="item">3</div> </div> .container { display: flex; justify-content: center; align-items: center; height: 100vh; } .item { background: #6c5ce7; color: white; padding: 20px; margin: 10px; } Flexbox, CSS-də çox güclü və geniş istifadə olunan layout texnologiyasıdır. Əgər dizaynınız dinamik və cavab verən olmalıdırsa, Flexbox sizin üçün ideal seçimdir. Tətbiqatlarda daha çevik, daha sadə və daha təmiz kod üçün Flexbox istifadə etməyi öyrənmək böyük üstünlükdür. Flexbox haqqında hazırlanmış bəlkə də ən yaxşı tutorial: https://www.youtube.com/watch?v=wsTv9y931o8
  • React veb və nativ istifadəçi interfeysləri üçün kitabxanadır

    1 Mövzu
    1 Yazı
    React tətbiqlərində performans optimizasiyası üçün tez-tez istifadə olunan React.memo komponenti, düzgün istifadə edildikdə faydalı ola bilər. Lakin, bəzi hallarda bu alət gözlənilməz nəticələrə səbəb ola bilər. Bu məqalədə React.memo-nun necə işlədiyini, hansı hallarda effektiv olduğunu və hansı hallarda problem yaratdığını araşdıracağıq. Memoizasiyanın vəd etdikləri React tətbiqləri yavaşladıqda, proqramçılar tez-tez React.memo, useMemo və useCallback kimi memoizasiya alətlərinə müraciət edirlər. Bu alətlər, lazımsız yenidən renderlərin qarşısını almaqla performansı artırmaq məqsədi daşıyır. Lakin, bu alətlərin istifadəsi düşündüyümüzdən daha mürəkkəb ola bilər. JavaScript-də referans müqayisələri JavaScript-də primitiv dəyərlər (məsələn, ədədlər, sətirlər) dəyərə görə müqayisə olunur, obyektlər isə referansa görə: // Primitiv dəyərlər dəyərə görə müqayisə olunur const a = 1; const b = 1; console.log(a === b); // true // Obyektlər referansa görə müqayisə olunur const objA = { id: 1 }; const objB = { id: 1 }; console.log(objA === objB); // false, fərqli referanslar Bu, React-də problem yarada bilər, çünki komponentlərə ötürülən obyekt və funksiyalar hər renderdə yeni referanslara sahib olur və bu, lazımsız yenidən renderlərə səbəb ola bilər. useMemo və useCallback necə işləyir React, referansların sabit qalmasını təmin etmək üçün useMemo və useCallback hook-larını təqdim edir. useMemo: Məhsuldar (expensive) hesablamaların nəticəsini yadda saxlayır və yalnız asılılıqlar dəyişdikdə yenidən hesablayır. const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]); useCallback: Funksiyaların referansını yadda saxlayır və yalnız asılılıqlar dəyişdikdə yeni funksiyanı yaradır. const memoizedCallback = useCallback(() => { doSomething(a, b); }, [a, b]); React.memo necə işləyir React.memo yüksək səviyyəli bir komponentdir (HOC) və komponentin props-larını səthi (shallow) şəkildə müqayisə edərək, dəyişiklik olmadıqda yenidən renderin qarşısını alır: const MyComponent = React.memo(function MyComponent(props) { // komponentin implementasiyası }); Lakin, əgər komponentə ötürülən props-lar hər renderdə yeni referanslara sahib olursa (məsələn, obyektlər və ya funksiyalar), React.memo bu dəyişiklikləri görəcək və komponenti yenidən render edəcək. React.memo istifadəsində ümumi problemlər 1. Props-ların spreading-i Props-ları yaymaq (spread) React.memo-nun effektivliyini poza bilər: const Child = React.memo(({ data }) => { // komponentin implementasiyası }); const Parent = (props) => { return <Child {...props} />; }; Bu halda, Child komponentinə ötürülən props-ların referansları dəyişə bilər və bu, yenidən renderə səbəb olar. 2. children prop-u problemi JSX-də children də bir prop-dur və hər renderdə yeni referansa sahib olur: const MemoComponent = React.memo(({ children }) => { // implementasiya }); const Parent = () => { return ( <MemoComponent> <div>Some content</div> </MemoComponent> ); }; Bu halda, MemoComponent hər dəfə yenidən render olunacaq. 3. İç-içə memo komponentləri problemi Bir-birinin içində yerləşən memo komponentlər də problem yarada bilər: const InnerChild = React.memo(() => <div>Inner</div>); const OuterChild = React.memo(({ children }) => <div>{children}</div>); const Parent = () => { return ( <OuterChild> <InnerChild /> </OuterChild> ); }; Bu halda, OuterChild hər dəfə yenidən render olunacaq, çünki InnerChild hər dəfə yeni bir JSX elementi yaradır. Həll yolu: useMemo istifadə edərək InnerChild-ı yadda saxlamaq: const Parent = () => { const innerChild = useMemo(() => <InnerChild />, []); return <OuterChild>{innerChild}</OuterChild>; }; Memoizasiyanı nə zaman istifadə etməli React.memo istifadə edin əgər: Komponentiniz saf funksional komponentdirsə və eyni props-larla eyni nəticəni qaytarırsa. Komponent tez-tez eyni props-larla render olunursa. Render prosesi məhsuldardırsa (expensive). Profilinq vasitəsilə performans problemi olduğunu təsdiqləmisinizsə. useMemo istifadə edin əgər: Məhsuldar bir hesablamanı hər renderdə təkrar etmək istəmirsinizsə. Memoizə edilmiş komponentə ötürülən obyekt və ya array-ın sabit referansını saxlamaq istəyirsinizsə. Hesablamanın həqiqətən məhsuldar olduğunu ölçüb təsdiqləmisinizsə. useCallback istifadə edin əgər: Optimallaşdırılmış child komponentlərinə referans bərabərliyinə əsaslanan callback-lar ötürürsünüzsə. Callback useEffect hook-unda asılılıq kimi istifadə olunursa. Memoizə edilmiş komponentlərdə sabit funksional referans saxlamaq istəyirsinizsə. Alternativ: Komponent kompozisiyası Memoizasiyadan əvvəl, komponent strukturunuzu kompozisiya vasitəsilə yaxşılaşdırmağı düşünün. Komponent kompozisiyası tez-tez performans problemlərini daha zərif şəkildə həll edir. Məsələn, məhsuldar bir komponenti memoizə etmək əvəzinə, vəziyyəti daha spesifik bir konteynerə keçirin.
  • Angular, TypeScript əsaslı pulsuz və açıq mənbəli tək səhifəli veb proqram freymvorkudur.

    0 0
    0 Mövzu
    0 Yazı
    Yeni yazı yoxdur.
  • Veb istifadəçi interfeyslərini qurmaq üçün əlçatan, icraedici və çox yönlü freymvork.

    1 Mövzu
    1 Yazı
    Vue-da dinamik hadisə adlarından istifadə edə biləcəyinizi bilirdinizmi? Hadisə dinləyicilərini “hard code” əvəzinə, onları hesablanmış hadisə adları ilə v-on (@) istifadə edərək dinamik şəkildə bağlaya bilərsiniz: <script setup lang="ts"> import { computed, ref } from 'vue'; const event = ref<'mouseover' | 'click'>('mouseover'); const eventHistory = ref<Array<string>>([]); const buttonLabel = computed(() => event.value === 'mouseover' ? 'Hover Me' : 'Click Me' ); const onHandleEvent = () => { eventHistory.value = [ ...eventHistory.value, `${new Date().toISOString()}: ${event.value}`, ]; }; </script> <template> <div class="wrapper"> <div class="wrapper"> <span>Select an event type: </span> <div> <label> <input type="radio" name="event" v-model="event" value="mouseover" /> On Hover </label> <label> <input type="radio" name="event" v-model="event" value="click" /> On Click </label> </div> </div> <button @[event]="onHandleEvent">{{ buttonLabel }}</button> <div class="wrapper" v-if="eventHistory.length > 0"> <strong>Event History:</strong> <span v-for="entry of eventHistory">{{ entry }}</span> </div> </div> </template> <style scoped> .wrapper { display: flex; flex-direction: column; gap: 5px; } </style> Demo https://stackblitz.com/edit/vue-tip-dynamic-event-names?file=src%2FApp.vue