Yazı

React 15'ten 18'e Yükseltme


React 15.6 versiyonuyla yazılan ve Class Componentler içeren uygulamamızı uzun bir süredir React 16 sürümü üstüne güncelleme fikrimiz vardı React 18 versiyonu çıkmasına rağmen bu geçişi sağlayamamıştık. Şimdi ise direk React 18’e güncelleme işine kalkıştık ve bir çok bağımlılığı güncellememize rağmen binlerce satır class componentimizi tam anlamıyla yeni yapıya daha uygun mimariye taşıyamadık. Yine de bu yolda bizim de attığımız ilk bir kaç adımı paylaşmak istedim.


1. React ve ReactDOM Paketlerini Güncellemek

React 18’in sunduğu yeniliklerden faydalanmak için önce paketlerimizi güncellemeliyiz

Komutlar:

npm install react@18 react-dom@18

Not: Eğer projende eski bir paket bağımlılığı varsa, bu güncelleme sırasında bazı uyarılar alabilirsiniz.

Eski kütüphaneler (örneğin, animasyon ya da form yönetim kütüphaneleri) sorun çıkarması muhtemel yapılardır, bunları teker teker yükseltin ya da başka paketlerle değiştirin.


2. ReactDOM.render Yerine ReactDOM.createRoot Kullanmak

React 18’de, ReactDOM.render yerini yeni ReactDOM.createRoot API’sine bırakıyor.

Eskiden Nasıl Yapıyorduk?

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';

ReactDOM.render(<App />, document.getElementById('root'));

React 18 ile Birlikte:

import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<App />);

Neden? Yeni API, React 18’in Concurrent Mode’unu destekliyor ve performansı artırıyor.


3. Class Componentleri Functional Componentlere Taşıma

React 15’in yazıldığı dönemlerde class componentler yaygındı. Biz de uygulamamızı Class Component cehennemine çevirdik :) Ancak React Hooks’un tanıtılmasıyla functional componentler daha güçlü bir hale geldi. Peki, class componentleri nasıl functional hale getirebiliriz?

Örnek: Bir Sayaç Componenti

Class Component:
import React from 'react';

class Counter extends React.Component {
  state = { count: 0 };

  increment = () => {
    this.setState({ count: this.state.count + 1 });
  };

  render() {
    return (
      <div>
        <p>Sayaç: {this.state.count}</p>
        <button onClick={this.increment}>Arttır</button>
      </div>
    );
  }
}

export default Counter;
Functional Component:
import React, { useState } from 'react';

function Counter() {
  const [count, setCount] = useState(0);

  const increment = () => {
    setCount(count + 1);
  };

  return (
    <div>
      <p>Sayaç: {count}</p>
      <button onClick={increment}>Arttır</button>
    </div>
  );
}

export default Counter;

Neden Functional Component? Daha az kod, daha rahat okunabilirlik ve Hooks sayesinde güçlü bir state yönetimine kavuşursunuz.


4. Lifecycle Metotları Yerine Hooks Kullanımı

Örnek: componentDidMount ve componentDidUpdate

Class Component:
class MyComponent extends React.Component {
  componentDidMount() {
    console.log('Bileşen yüklendi!');
  }

  componentDidUpdate() {
    console.log('Bileşen güncellendi!');
  }

  render() {
    return <div>Merhaba React!</div>;
  }
}
Functional Component:
import React, { useEffect } from 'react';

function MyComponent() {
  useEffect(() => {
    console.log('Bileşen yüklendi!');
    return () => console.log('Bileşen temizleniyor!');
  }, []); // [] bağımlılık dizisi sadece ilk çalışmada tetiklenir.

  useEffect(() => {
    console.log('Bileşen güncellendi!');
  });

  return <div>Merhaba React!</div>;
}

5. Concurrent Rendering’e Dikkat

React 18’deki en büyük yeniliklerden biri concurrent rendering. Bu, kullanıcı etkileşimlerini daha akıcı hale getirir ama yan etkilerini kontrol etmek gereklidir.

class MyComponent extends React.Component {
  state = { count: 0 };

  componentDidUpdate() {
    console.log('Güncelleme oldu!');
    document.title = `Sayaç: ${this.state.count}`;
  }

  render() {
    return (
      <button onClick={() => this.setState({ count: this.state.count + 1 })}>
        Arttır
      </button>
    );
  }
}

Bu örnekte, gereksiz güncellemelerden kaçınmak için yan etkileri kontrol etmeliyiz.