Merhabalar.

Bu yazımda ref ve useRef() Hook’undan bahsedeceğim.

React’te ref ve useRef, bir bileşenin DOM elemanlarına veya diğer React bileşenlerine doğrudan erişim sağlamak için kullanılır. ref (referans), bir bileşenin “hatırlama” bilgilerini sağlar, ancak bu bilgilerin yeni render’lar tetiklememesi gerektiğini belirtir. 

useRef ise, bir bileşenin DOM düğümlerine veya diğer React bileşenlerine doğrudan erişim sağlamak için kullanılır.

useRef hook’u, bir bileşenin DOM düğümüne doğrudan erişim sağlar. Bu, özellikle bir düğmenin DOM düğümünü manipüle etmek için kullanışlıdır. Örneğin, bir düğmeyi programatik olarak odağa getirmek isterseniz, useRef hook’unu kullanabilirsiniz:

Bu kavramı daha iyi kavrayabilmek için bir Focus isimli uygulama yazalım. Basit bir işi yapacak. Bir Input’um bir butonum olacak ve butona bastığımda imleci input içine focuslayacak. Ama bunu useRef kullanarak gerçekleştireceğiz.

Klasör ve Dosyaları Oluştur

Tüm Proje Kodları

Öncelikle kodların tamamını paylaşıp, üzerinden anlatımı gerçekleştirmek istiyorum.

import { useRef, Fragment } from 'react';

const Focus = () => {

const inputRef = useRef(null);

 const handleClick = () => {
   inputRef.current.focus();
 };

  return (
    <Fragment>
     <input ref={inputRef} type="text" />
     <button onClick={handleClick}>Focus the input</button>
   </Fragment>
  )
}

export default Focus

App.Js Güncelle

Uygulamamda sadece Focus component’i çalışsın istiyorum. O yüzden App.js’yi aşağıdaki gibi güncelleyelim.

import './App.css';

import Focus from './Components/Focus/Focus';

function App() {

  return (

    <div className="Outer">

      <div className="Appp">

        { /* <HelloWorld /> <ProductCard /> <Calculator /> */}

        <Focus />

      </div>

    </div>

  );
}

export default App;

useRef Import

useRef Hook’unu kullanabilmek için öncelikle react kütüphanesinden import’unu gerçekleştiriyoruz.

import { useRef, Fragment } from 'react';

useRef Hook’u Oluştur

Bu adımda hangi DOM elemanına ulaşmak istiyorsak bunun için bir useRef Hook’u oluşturuyoruz.

const inputRef = useRef(null);

inputRef isimli bir useRef oluşturdum ve ilk değerini null verdim.

DOM İçinde Ref Kullanımı

Şimdi oluşturduğum useRef Hook’unu, hangi JSX elementiyle eşlemek istiyorsam, o elementim ref attribute’unu kullanarak bu ismi atayacağım.

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

Yukarıdaki ref tanımlaması sayesinde artık input’un tüm bilgileri inputRef Hook’una aktarıldı. inputRef’in current özelliği ile elementin tüm özelliklerine ulaşacağız.

useRef Hook’unu Kullan

Buradan sonra amacım şu, butona basılınca imleç input’un içine Focus olsun.

Button’un onClick event’ine istediğim işi yapacak fonksiyonu bağlıyorum.

<button onClick={handleClick}>Focus the input</button>

handleClick Fonksiyonu

const handleClick = () => {
   inputRef.current.focus();
 };

Bu fonksiyon sayesinde inputRef’in yakaladığı elementin current özelliğine erişim sağlayıp burada focus() fonksiyonunu tetikleyerek istediğimiz işlemin yapılmasını sağlıyoruz.

Current Nedir?

Bunun için inputRef’i console’a yazdıralım ve çıktısına göz atalım.

Aşağıda gördüğünüz gibi current elementin kendisini temsil ediyor. Böylece bu current üzerinden istediğimiz tüm özelliklerine erişip manipüle edebiliyoruz.

Test

Uygulamamız bu şekilde gözükecektir. Butona bastığım anda fonksiyonum sayesinde, useRef Hook’unun referans aldığı elementin bilgileri elde edildi ve focus fonksiyonu üzerinde yürütüldü. İmleç input içinde yanıp sönüyor olmalı.

Projeyi İlerletelim

Şunu ekleyerek daha iyi anlayalım.

Bir buton daha ekleyelim ve bu butona tıklandığında, input içine Hello World yazdıralım. Aynı zamanda focus buttonunun yazısını It is my turn olarak değiştirelim.

Burada butona da ulaşmam gerektiği için buton içinde bir useRef Hook’u tanımlayalım. Sonra eklediğim butonun onClick olayına handleHelloWorld fonksiyonunu bağlayalım.

Bu fonksiyon istedim işleri yapsın.

import { useRef, Fragment } from 'react';

const Focus = () => {

    const inputRef = useRef(null);
    const buttonRef = useRef(null);

    const handleClick = () => {
        inputRef.current.focus();
    };

    const handleHelloWorld = () => {
        inputRef.current.value = "Hello World";
        buttonRef.current.innerText = " It is my turn";
    };

    return (
        <Fragment>
            <input ref={inputRef} type="text" />
            <button onClick={handleClick} ref={buttonRef}>Focus the input</button>
            <button onClick={handleHelloWorld}>Write Hello World</button>
        </Fragment>
    )
}

export default Focus

İstediğim sonucu aldım.

useRef Hook’unu öğrenmiş olduk.

Bir sonraki yazımda görüşmek üzere.


Murat Bilginer
21 Şubat 1992'de doğdum. Endüstri Mühendisi olarak lisansımı 2016 yılında tamamladım. Industryolog Akademi - NGenius oluşumlarının kurucusuyum. Şu anda kendi şirketim Brainy Tech ile Web ve Mobil Geliştirme, AWS, Google Cloud Platform Sistemleri için DevOps, Big Data Analiz ve Görselleştirme hizmetleri sunmakta ve Online Eğitimler vermekteyiz.