useRef — bu nədir, istinad hook-u və React-də DOM ilə iş

Müəllif: IT Sectr Dərc olunub: 2026-07-04 Oxuma vaxtı: 9 dəq

useRef — bu, .current xassəsinə malik mutasiya olunan ref obyekti yaradan React hookudur. Komponentin renderləri arasında saxlanılır. useState-dən fərqli olaraq, .current dəyişməsi yenidən renderə səbəb olmur. Bu da useRef-i DOM istinadları, taymerlər və UI-ni yenidən çəkmədən renderləri ötüb keçməli olan istənilən dəyərləri saxlamaq üçün ideal edir. React Documentation (2025)-ə görə, ref obyekti komponentin ömrü boyu bir dəfə yaradılır və renderlər arasında dəyişmir, bu da istinadın sabitliyini təmin edir.

Əsas məqamlar

  • useRef — .current sahəsi ilə mutasiya olunan ref obyekti yaratmaq üçün hook.
  • Yenidən render yoxdur — .current dəyişməsi komponentin yenidən çəkilməsinə səbəb olmur.
  • DOM istinadları — birbaşa DOM qovşağına giriş üçün elementin ref propuna ötürülür.
  • Dəyərlərin saxlanması — taymerlər, əvvəlki dəyərlər və renderlər arasında istənilən məlumatlar üçün uyğundur.
  • Sabit istinad — ref obyekti bağlamalardan fərqli olaraq renderlər arasında dəyişmir.

React-də useRef nədir

useRef — React 16.8-də əlavə edilmiş, tək .current xassəsi ilə mutasiya olunan ref obyekti qaytaran hookdur. İlkin dəyər komponentin montajı zamanı .current-a təyin edilir. Adi dəyişəndən əsas fərqi — ref obyekti yenidən renderləri ötüb keçir: təkrar render zamanı React refi yenidən yaratmır, eyni obyekti qaytarır.

useRef-in daxili implementasiyası useState və useEffect ilə eyni mexanizmdən — fiber qovşağında birləşdirilmiş hooklar siyahısından istifadə edir. Lakin useState-dən fərqli olaraq, React ref obyektinin dəyişmələrini izləmir, yeniləmələri növbəyə qoymur və yenidən render planlaşdırmır. Bu, useRef-i hətta tez-tez dəyişmələrdə belə performansa təsir etməyən son dərəcə yüngül hook edir.

React Team — Hooks FAQ (2025)-ə görə, useRef mahiyyətcə dəyər saxlayan “qutu”dur. Sintaktik şəkər: const ref = useRef(initialValue) const ref = { current: initialValue } ilə ekvivalentdir, fərqi ilə ki, React hər renderdə ref obyektinin eyni olacağına zəmanət verir. Heç bir sehr — sadəcə React tərəfindən idarə olunan sabit istinad.

jsx
import { useRef } from 'react';

function Component() {
    const countRef = useRef(0);
    // countRef.current = 0 ilkin olaraq
    // countRef.current = 5 mutasiyadan sonra
    // Yenidən render baş vermir!
}

DOM elementlərinə useRef vasitəsilə giriş

useRef-in ən geniş yayılmış istifadə ssenarisi — DOM elementinə birbaşa giriş əldə etməkdir. React komponent montaj edildikdən sonra elementRef.current-i DOM qovşağına istinadla təyin edir. Bu, inputa fokus vermək, elementin ölçülərini ölçmək, animasiya kitabxanaları və React renderindən istifadə etməyən kitabxanalarla inteqrasiya üçün lazımdır.

React DOM-a ref istinadlarını avtomatik idarə edir: montaj zamanı faktiki DOM qovşağını təyin edir, montajdan çıxararkən sıfırlayır (null edir). Bu, .current-da həmişə aktual dəyərin olmasını təmin edir və silinmiş elementlərə “asılı” istinadlar vasitəsilə yaddaş sızmalarının qarşısını alır. Heç bir əl təmizləmə tələb olunmur.

jsx
function AutoFocusInput() {
    const inputRef = useRef(null);

    useEffect(() => {
        // Komponent montaj edildikdən sonra inputa fokus ver
        inputRef.current?.focus();
    }, []);

    return <input ref={inputRef} type="text" />;
}

React — Refs and DOM documentation (2025)-ə görə, ref-i deklarativ əməliyyatlar üçün istifadə etməyin — modalların açılması/bağlanması, görünürlüyün idarə edilməsi. Bu məqsədlər üçün state və proplar mövcuddur. Reflər imperativ əməliyyatlar üçün nəzərdə tutulub: fokus, mətn seçimi, üçüncü tərəf kitabxanaları ilə inteqrasiya.

Yenidən render olmadan mutasiya olunan dəyərlərin saxlanması

Əhəmiyyətinə görə ikinci ssenari — ixtiyari dəyərlərin saxlanması, renderlər arasında qorunmalı, lakin dəyişməsi yenidən renderə səbəb olmamalıdır. Tipik nümunələr: taymer identifikatorları (setInterval/setTimeout), sorğuları ləğv etmək üçün flaqalar, müqayisə üçün əvvəlki prop dəyərləri və UI çıxışına təsir etməyən istənilən məlumat.

Bu, xüsusilə useEffect-də faydalıdır: useRef taymer identifikatorunu saxlayır, cleanup isə onu təmizləyir. timerId-ni useState-də saxlamaq hər setTimerId çağırışında nə logika, nə də UI üçün lazım olmayan əlavə yenidən renderə səbəb olardı. useRef bu problemi overhead olmadan və lazımsız yenidən çəkilmələr olmadan həll edir.

jsx
function Timer() {
    const intervalRef = useRef(null);

    const start = () => {
        intervalRef.current = setInterval(() => {
            console.log('tik');
        }, 1000);
    };

    const stop = () => {
        clearInterval(intervalRef.current);
    };

    useEffect(() => stop, []);

    return <><button onClick={start}>Start</button><button onClick={stop}>Stop</button></>;
}

useRef vs useState: nə vaxt hansını istifadə etməli

Əsas dilemma — useRef və useState arasında seçim — bir sualla həll olunur: “Dəyər dəyişdikdə yenidən render lazımdırmı?”. Bəli — useState. Xeyr — useRef. useState komponentin çıxışına təsir edən vəziyyəti saxlayır; useRef daxili logika üçün lazım olan, lakin UI-a təsir etməyən məlumatları saxlayır.

Praktikada developerlər bağlama problemlərindən qaçmaq üçün tez-tez useRef-dən callbackləri saxlamaq üçün istifadə edirlər. Məsələn, əgər useEffect hadisəyə abunə olursa və callback daxilində aktual state lazımdırsa — callback-i useRef-də saxlayın. Hər renderdə ref.current-i yeni funksiya ilə yeniləyin və effekt yenidən abunə olmadan həmişə təzə callback-i çağıracaq.

KriteriyauseRefuseState
Yenidən renderDəyişməyə səbəb olmurHər setState-də səbəb olur
MutasiyaBirbaşa: ref.current = valueSetter vasitəsilə: setState(value)
JSX-də istifadəİstifadə edilmir (effekti yoxdur)Komponentin çıxışında istifadə olunur
NümunəTaymerlər, DOM istinadları, əvvəlki dəyərlərForma məlumatları, UI vəziyyəti, flaqalar

Anti-nümunə mövcuddur: JSX-də lazım olan, lakin dəyişməsi yenidən renderə səbəb olmamalı olan məlumatları saxlamaq üçün useRef-dən istifadə etmək. Bu, desinxronizasiyaya gətirib çıxarır — UI köhnə məlumatları göstərir, halbuki ref.current artıq yenidir. Əgər dəyər UI-da göstərilirsə — useState istifadə edin. Yalnız logika daxilində istifadə olunursa — useRef.

useRef-in useEffect ilə kombinasiyası

useRef + useEffect birləşməsi — propların əvvəlki dəyərlərini izləmək üçün standart nümunədir. Əvvəlki dəyəri ref-də saxlayın, useEffect-də cari ilə müqayisə edin və fərq əsasında qərar qəbul edin. Bu, xüsusilə animasiyalarda, dəyişmədən əvvəl hansı dəyərin olduğunu bilmək lazım olduqda faydalıdır.

jsx
function PriceDisplay({ price }) {
    const prevPriceRef = useRef(price);

    useEffect(() => {
        const prevPrice = prevPriceRef.current;
        if (price > prevPrice) {
            animateUp();
        } else if (price < prevPrice) {
            animateDown();
        }
        prevPriceRef.current = price;
    }, [price]);

    return <span>${price}</span>;
}

React Documentation — Hooks FAQ (2025)-ə görə, bu nümunə “previous value pattern” adlanır. O işləyir, çünki useRef dəyəri renderlər arasında saxlayır, useEffect isə dəyişikliklər təsdiqləndikdən sonra icra olunur. Əvvəlcə DOM yeni price ilə yenilənir, sonra useEffect əvvəlki ilə (hələ də ref-də olan) müqayisə edir və ref.current-i cari dəyərə yeniləyir.

useRef ilə tipik səhvlər

Ən geniş yayılmış səhv — ref.current-in render fazasında oxunması JSX hesablamaq üçün. ref.current dəyişməsi yenidən renderə səbəb olmadığından, komponent köhnəlmiş dəyərdən istifadə edə bilər. Əgər .current dəyəri UI çıxışında iştirak edirsə — useState istifadə edin. Ref və state-i sinxronlaşdırmaq lazımdırsa, state-i ref-dən yeniləmək üçün useEffect-dən istifadə edin.

  • JSX-də Ref — render funksiyası daxilində ref.current oxumaq UI və məlumatların desinxronizasiyasına gətirib çıxarır.
  • Ref-in useEffect asılılığı kimi — ref.current asılılıq massivində olmamalıdır; React onun dəyişməsini izləmir.
  • Unudulmuş null yoxlaması — montajdan çıxararkən ref.current null olur; girişdən əvvəl yoxlayın.
  • Funksiyaların ref-də saxlanması — təzə callback nümunəsindən istifadə edirsinizsə, hər renderdə ref.current-i yeniləyin.
jsx
// ❌ Render zamanı göstərmək üçün ref.current oxumayın
function BadComponent() {
    const valRef = useRef(0);
    return <p>{valRef.current}</p>; // mutasiyada YENILƏNMƏYƏCƏK
}

// ✅ Göstərmək üçün state, logika üçün ref istifadə edin
function GoodComponent() {
    const [val, setVal] = useState(0);
    const valRef = useRef(0);
    return <p>{val}</p>;
}

Digər geniş yayılmış səhv — məlumatlar UI-a təsir etdiyi halda, useRef-i komponentdə vəziyyətin saxlanmasının yeganə yolu kimi istifadə etməkdir. Developerlər “lazımsız” yenidən renderlərdən qaçmaq üçün useRef-i seçirlər, lakin nəticədə yenilənməyən UI əldə edirlər. Düzgün yanaşma: UI məlumatları üçün useState, yalnız renderdə iştirak etməyən köməkçi dəyərlər üçün useRef istifadə edin.

Tez-tez verilən suallar

useRef-i əvvəlki vəziyyəti saxlamaq üçün istifadə etmək olarmı?

Bəli, bu geniş yayılmış nümunədir — previous state pattern. Ref yaradın və onu useEffect-də izlənilən dəyərin hər dəyişməsində yeniləyin. Render və effekt arasında olan anda ref.current müqayisə edilə bilən əvvəlki dəyəri ehtiva edir. Bu, əlavə yenidən renderlər tələb etmir və istənilən məlumat növü ilə işləyir.

Niyə ref.current ilk renderdə null-dur?

React ref.current-ə DOM qovşağının dəyərini yalnız element render edildikdən və real DOM-a əlavə edildikdən sonra təyin edir. İlk render zamanı komponent hələ montaj edilməyib, buna görə ref.current ilkin dəyərə (null) bərabərdir. DOM-a ref.current vasitəsilə giriş yalnız useEffect-də və ya montajdan sonra çağrılan hadisə handlerlərində mümkündür.

useRef və createRef arasında nə fərq var?

createRef hər renderdə yeni ref obyekti yaradır — onu yalnız sinif komponentlərində istifadə etmək lazımdır. useRef refi bir dəfə yaradır və bütün sonrakı renderlərdə eyni obyekti qaytarır. Funksional komponentlərdə yalnız useRef istifadə edin; createRef yenidən render zamanı obyekt yenidən yaradılacağı üçün dəyərin itməsinə səbəb olacaq.

useRef-i proplar vasitəsilə ötürmək olarmı?

Bəli, ref obyekti adi prop kimi ötürülə bilər: <Child inputRef={inputRef} />. Uşaq komponent onu inputRef.current vasitəsilə istifadə edir. Lakin refi birbaşa uşaq komponentin DOM elementinə ötürmək üçün forwardRef — ref-i proplar vasitəsilə ötürməyə imkan verən HOC istifadə edin. forwardRef olmadan ref avtomatik olaraq uşaq komponentin daxilindəki DOM elementinə bağlanmayacaq.

useRef ilə elementin ölçüsünü necə ölçmək olar?

Ref-i elementə bağlayın, sonra useEffect-də ref.current.getBoundingClientRect() və ya ref.current.offsetWidth / offsetHeight oxuyun. Ölçü dəyişmələrini reaktiv izləmək üçün useEffect daxilində ResizeObserver istifadə edin: observer yaradın, dəyişmələrə abunə olun və state-i yeni ölçülərlə yeniləyin. Observer-i cleanup-də söndürməyi unutmayın.

Nəticə

  • useRef — yenidən renderə səbəb olmadan renderlər arasında saxlanılan mutasiya olunan ref obyekti yaratmaq üçün hook.
  • DOM girişi — ref propu birbaşa DOM qovşağına giriş üçün elementə ötürülür; montajdan sonra əlçatandır.
  • Məlumatların saxlanması — taymerlər, callbacklər, flaqalar və UI-a təsir etməyən istənilən dəyərləri ref-də saxlayın.
  • useRef vs useState — dəyişmə UI-ı yenidən çəkməlidirsə useState, yoxsa useRef seçin.
  • Previous value pattern — əvvəlki dəyəri ref-də saxlayın, müqayisə üçün useEffect-də yeniləyin.
  • JSX-də Ref — ref.current-i render fazasında oxumayın; bu UI və məlumatların desinxronizasiyasına gətirib çıxarır.
  • forwardRef — ref-i proplar vasitəsilə uşaq komponentə ötürmək üçün istifadə edin.

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun