Məzmuna keçin

Front-end

Frontend əsaslı müzakirə kateqoriyası

18 Mövzu 22 Yazı

Alt kateqoriyalar


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

    11 14
    11 Mövzu
    14 Yazı
    codexC
    Regular ifadələr (Regular Expressions və ya qısaca Regex) JavaScript-də mətnlə işləmək üçün çox güclü bir alətdir. Onlar mətn axtarışı, dəyişdirmə, doğrulama və parçalama işlərini sadələşdirir. Bu məqalədə regulər ifadələrin əsas prinsiplərindən başlayaraq, onların real layihələrdə necə istifadə olunduğuna qədər geniş şəkildə izah veriləcək. Regular ifadə nədir? Regular ifadə — müəyyən bir mətn nümunəsini tapmaq və onun üzərində əməliyyat aparmaq üçün istifadə olunan xüsusi simvollardan ibarət sintaksisdir. Məsələn, bir sənəddə bütün e-poçt ünvanlarını tapmaq üçün istifadə oluna bilər. 🧱 Regulər ifadələrin yaradılması JavaScript-də regex yaratmağın iki üsulu var: 1. Regex literal: const pattern = /abc/; 2. RegExp konstruktoru: const pattern = new RegExp("abc"); İkinci üsul əsasən dinamik ifadələr yaratmaq üçün istifadə olunur. 🧪 Əsas Regex simvolları və strukturu Simvol Təsvir . Hər hansı bir simvol (yeni sətrdən başqa) \d Rəqəm (0-9) \w Hərf, rəqəm və alt xətt \s Boşluq simvolu ^ Sətirin başlanğıcı $ Sətirin sonu * 0 və ya daha çox + 1 və ya daha çox ? 0 və ya 1 dəfə {n} Dəqiq sayda təkrarlanma [abc] Sadalanan simvollardan biri [^abc] Sadalanan simvollardan başqa biri (a | b) “a” və ya “b” Bayraqlar (Flags) Regex-lər əlavə parametrlərlə işləyə bilər: g (global): Bütün uyğunluqları tapmaq üçün i (ignoreCase): Böyük-kiçik hərf fərqini nəzərə almamaq üçün m (multiline): Çoxsətirli rejim üçün u (unicode): Unicode dəstəyi üçün Praktik nümunələr 1. E-poçt doğrulaması: const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; 2. Telefon nömrəsi doğrulaması: const phoneRegex = /^\+994\d{9}$/; 3. Mətn daxilində söz axtarmaq: const sentence = "Salam dünya"; const result = /dünya/.test(sentence); // true Regex ilə əvəzləmə String.prototype.replace() metodu regex ilə birlikdə güclü bir vasitəyə çevrilir: const text = "Salam, 123"; const cleaned = text.replace(/\d/g, ""); // "Salam, " Regex və match(), test(), exec() test() — uyğunluq olub olmadığını true/false qaytarır match() — uyğunluqları massiv şəklində qaytarır exec() — bir uyğunluğu obyekt kimi qaytarır let pattern = /Hello/; let input = "Hello, World!"; let result = input.match(pattern); console.log(result); [image: 1747297574761-6d02769f-a459-415f-9f91-30d4a109a141-image.png] const pattern = /\(\d{3}\) \d{3}-\d{4}/g; const string = "My phone numbers are (123) 456-7890 and (555) 555-1212."; let matches; while (matches = pattern.exec(string)) { console.log(matches); } [image: 1747297512776-b1bbaf1b-2039-42e2-b1a8-db10504a9196-image.png] Real layihələrdə regex istifadəsi Form doğrulama: istifadəçi məlumatlarının düzgünlüyünü yoxlamaq Data parsing: log fayllarından və ya mətndən məlumat çıxarma Text search: mətnlərdə açar sözlərin tapılması Syntax highlighting: kod redaktorlarında sözlərin rənglənməsi Router Matching: URL marşrutlarının uyğunlaşdırılması (məsələn, /product/:id kimi) Bəzi tələ və çətinliklər Regex-lər oxunması və yazılması çətin ola bilər, buna görə sadə ifadələrlə başlamaq məsləhətdir. Performans məsələlərinə diqqət yetirin: çox kompleks ifadələr performansı azalda bilər. Regex ilə hər problemi həll etməyə çalışmayın – bəzən sadə string metodları kifayət edir. Nəticə JavaScript-də regulər ifadələr, effektiv və çevik mətn işləmə vasitəsidir. Onları mənimsəmək, xüsusilə form doğrulama və məlumat emalı ilə məşğul olan proqramçılar üçün vacibdir. Sadə regex-lərlə başlayın və tədricən daha mürəkkəb nümunələrə keçin.
  • Yenə başqa bir TypeScript 🙂

    2 3
    2 Mövzu
    3 Yazı
    codexC
    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 2
    2 Mövzu
    2 Yazı
    codexC
    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 1
    1 Mövzu
    1 Yazı
    codexC
    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 1
    1 Mövzu
    1 Yazı
    codexC
    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