React.Component — κλασικά στοιχεία και πώς λειτουργούν

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-07-04 Χρόνος ανάγνωσης: 9 λεπ

React.Component — η βασική κλάση για τη δημιουργία στοιχείων με κληρονομικότητα στο React. Πριν από την εμφάνιση των hooks στην έκδοση 16.8, τα κλασικά στοιχεία ήταν ο μόνος τρόπος διαχείρισης κατάστασης και κύκλου ζωής. Σύμφωνα με το React, 2024, τα κλασικά στοιχεία εξακολουθούν να υποστηρίζονται, αν και τα λειτουργικά στοιχεία με hooks συνιστώνται για νέα έργα.

Κύρια σημεία

  • React.Component — η βασική κλάση από την οποία κληρονομούν τα κλασικά στοιχεία μέσω του extends Component.
  • Κατάσταση διαχειρίζεται μέσω του this.state και ενημερώνεται μόνο μέσω του this.setState — η άμεση μετάλλαξη απαγορεύεται.
  • Κύκλος ζωής περιλαμβάνει τις μεθόδους componentDidMount, componentDidUpdate και componentWillUnmount.
  • this σε μεθόδους κλάσης απαιτεί δέσμευση περιβάλλοντος — μέσω bind, συναρτήσεων βέλους ή class fields.
  • Μετάβαση σε λειτουργικά στοιχεία είναι δυνατή σταδιακά: τα hooks και οι κλάσεις μπορούν να συνυπάρχουν στο ίδιο έργο.

Τι είναι το React.Component;

React.Component — μια αφηρημένη κλάση που παρέχει ενσωματωμένες μεθόδους για εργασία με κατάσταση, props και κύκλο ζωής του στοιχείου. Για να δημιουργήσετε ένα κλασικό στοιχείο, πρέπει να ορίσετε μια κλάση που κληρονομεί από το React.Component και να υλοποιήσετε τη μέθοδο render.

Το React.Component εμφανίστηκε στην πρώτη έκδοση του React (2013) και παρέμεινε ο κύριος τρόπος δημιουργίας στοιχείων για πέντε χρόνια. Το οικοσύστημα του React χτίστηκε γύρω από κλάσεις: στοιχεία υψηλότερης τάξης (HOC), render props, περιβάλλον — όλα αυτά τα μοτίβα υλοποιήθηκαν μέσω σύνταξης κλάσεων.

Με την κυκλοφορία του React 16.8 το 2019, η ομάδα του React παρουσίασε τα hooks ως εναλλακτική λύση για τις κλάσεις. Τα hooks έλυναν τις ίδιες εργασίες — κατάσταση, εφέ, περιβάλλον — αλλά χωρίς κληρονομικότητα και περίπλοκη δέσμευση περιβάλλοντος. Το React.Component παραμένει πλήρως υποστηριζόμενο, αλλά για νέα έργα συνιστάται η λειτουργική προσέγγιση.

Δημιουργία κλασικού στοιχείου

Ελάχιστο κλασικό στοιχείο — μια κλάση με μία μόνο μέθοδο render που επιστρέφει ένα στοιχείο React. render — η μόνη υποχρεωτική μέθοδος. Πρέπει να είναι μια καθαρή συνάρτηση των this.props και this.state: το ίδιο σύνολο props και κατάστασης δίνει το ίδιο αποτέλεσμα.

js
import React, { Component } from 'react';

class Welcome extends Component {
  render() {
    return <h1>Hello, {this.props.name}</h1>;
  }
}

Κατασκευαστής και αρχικοποίηση κατάστασης

Ο κατασκευαστής εκτελείται πριν από την προσάρτηση. Σε αυτόν καλείται το super(props) για τη μεταβίβαση props στη γονική κλάση και αρχικοποιείται το this.state. Η χρήση του κατασκευαστή για άλλους σκοπούς — συνδρομές, κλήσεις API — δεν συνιστάται: γι' αυτό υπάρχει το componentDidMount.

js
class Counter extends Component {
  constructor(props) {
    super(props);
    this.state = { count: 0 };
  }

  render() {
    return <p>Count: {this.state.count}</p>;
  }
}

Διαχείριση κατάστασης μέσω this.state και this.setState

this.state — το αντικείμενο που περιέχει τα δεδομένα του στοιχείου. Η άμεση αλλαγή του (this.state.count = 1) απαγορεύεται — δεν προκαλεί εκ νέου απόδοση και σπάει την προβλεψιμότητα. Η κατάσταση πρέπει να ενημερώνεται μέσω του this.setState, το οποίο δημιουργεί ένα νέο αντικείμενο κατάστασης και ενεργοποιεί την εκ νέου απόδοση.

Το setState μπορεί να δεχτεί ένα αντικείμενο ή μια συνάρτηση. Η λειτουργική μορφή προτιμάται όταν η νέα κατάσταση εξαρτάται από την προηγούμενη: this.setState(prev => ({ count: prev.count + 1 })). Το React μπορεί να ομαδοποιήσει πολλαπλές κλήσεις setState σε ένα batch για βελτιστοποίηση απόδοσης.

js
class Toggle extends Component {
  constructor(props) {
    super(props);
    this.state = { isOn: false };
  }

  handleClick() {
    this.setState(prev => ({ isOn: !prev.isOn }));
  }

  render() {
    return (
      <button onClick={() => this.handleClick()}>
        {this.state.isOn ? 'ON' : 'OFF'}
      </button>
    );
  }
}

Μια σημαντική ιδιότητα του setState — είναι ασύγχρονο. Μετά την κλήση του setState, η κατάσταση δεν ενημερώνεται αμέσως. Αν χρειαστεί να εκτελέσετε μια ενέργεια μετά την ενημέρωση, δώστε μια callback ως δεύτερο όρισμα: this.setState(newState, () => console.log(this.state)).

Μέθοδοι κύκλου ζωής

Τα κλασικά στοιχεία έχουν προκαθορισμένες μεθόδους που το React καλεί σε συγκεκριμένες στιγμές. Προσάρτηση — constructor → render → componentDidMount. Ενημέρωση — render → componentDidUpdate. Αποπροσάρτηση — componentWillUnmount.

ΜέθοδοςΦάσηΣκοπός
constructorΠροσάρτησηΑρχικοποίηση state και δέσμευση μεθόδων
renderΚάθε φοράΕπιστροφή στοιχείων React (υποχρεωτικό)
componentDidMountΜετά την προσάρτησηΑιτήματα API, συνδρομές, χρονομετρητές
componentDidUpdateΜετά την ενημέρωσηΑντίδραση σε αλλαγή props/κατάστασης
componentWillUnmountΠριν από τη διαγραφήΚαθαρισμός συνδρομών, χρονομετρητών, αποχώρηση από συμβάντα

ComponentDidMount — αίτημα δεδομένων

componentDidMount — το κύριο μέρος για παρενέργειες μετά την πρώτη απόδοση. Εδώ εκτελούνται αιτήματα HTTP, δημιουργούνται συνδέσεις WebSocket και ξεκινούν χρονομετρητές. Αν δεν καθαρίσετε τη συνδρομή στο componentWillUnmount, προκύπτει διαρροή μνήμης.

js
class UserProfile extends Component {
  componentDidMount() {
    fetch(`/api/users/${this.props.userId}`)
      .then(res => res.json())
      .then(data => this.setState({ user: data }));
  }

  componentWillUnmount() {
    // Ακύρωση αιτήματος κατά την αποπροσάρτηση
  }

  render() {
    return <div>{this.state.user?.name}</div>;
  }
}

Δέσμευση περιβάλλοντος this σε μεθόδους

Στην JavaScript, οι μέθοδοι κλάσης δεν είναι δεσμευμένες στο στιγμιότυπο από προεπιλογή. Αν μεταβιβάσετε μια μέθοδο ως callback — σε χειριστή συμβάντος, χρονομετρητή — το this θα είναι undefined (σε αυστηρή λειτουργία) ή window (χωρίς αυστηρή λειτουργία). Χωρίς δέσμευση, το this.setState θα προκαλέσει σφάλμα.

Υπάρχουν τρεις τρόποι δέσμευσης: bind στον κατασκευαστή, συνάρτηση βέλους στο callback και class field με συνάρτηση βέλους. Ο πρώτος τρόπος — η επίσημη σύσταση του React: bind μία φορά στον κατασκευαστή, χωρίς αναδημιουργία της συνάρτησης σε κάθε απόδοση.

js
// Μέθοδος 1: bind στον κατασκευαστή (συνιστάται)
class MyComponent extends Component {
  constructor(props) {
    super(props);
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick() {
    this.setState({ clicked: true });
  }

  render() {
    return <button onClick={this.handleClick}>Click</button>;
  }
}

Class field — μοντέρνα σύνταξη με αυτόματη δέσμευση. Η συνάρτηση βέλους στην ιδιότητα της κλάσης συλλαμβάνει το this από το πεδίο ορατότητας του κατασκευαστή. Μειονέκτημα — η μέθοδος δημιουργείται σε κάθε στιγμιότυπο, όχι στο πρωτότυπο, αυξάνοντας τη μνήμη για εκατοντάδες στοιχεία του ίδιου τύπου.

Σύγκριση κλασικών και λειτουργικών στοιχείων

Η επιλογή μεταξύ κλάσης και συνάρτησης — δεν είναι μόνο θέμα σύνταξης. Τα λειτουργικά στοιχεία με hooks λύνουν προβλήματα εγγενή στις κλάσεις: αντιγραφή λογικής σε διαφορετικές μεθόδους κύκλου ζωής (componentDidMount + componentDidUpdate), πολυπλοκότητα με το this και αδυναμία εξαγωγής σχετικής λογικής σε επαναχρησιμοποιήσιμο μπλοκ.

Τα λειτουργικά στοιχεία είναι ευκολότερα στη δοκιμή — δεν έχουν εσωτερική κατάσταση (που πριν από τα hooks ήταν μόνο σε κλάσεις) και δεν απαιτούν προσάρτηση στο DOM για έλεγχο των callback. Το React συνιστά λειτουργικά στοιχεία για όλα τα νέα έργα, η τεκμηρίωση και τα παραδείγματα γράφονται με αυτά.

Τα κλασικά στοιχεία παραμένουν η καλύτερη επιλογή για εργασία με παλαιό κώδικα. Αν το έργο ξεκίνησε πριν από το 2019, πιθανότατα περιέχει χιλιάδες κλασικά στοιχεία. Η επανεγγραφή όλων σε hooks σε ένα sprint είναι ριψοκίνδυνη. Το React εγγυάται συμβατότητα προς τα πίσω: τα κλασικά στοιχεία δεν θα αφαιρεθούν.

Στρατηγική μετάβασης από κλάσεις σε hooks

Η σταδιακή μετάβαση ξεκινά με ανάλυση του στοιχείου. Τα απλά στοιχεία χωρίς κατάσταση (stateless) μεταφράζονται πρώτα — αντικαθίστανται εύκολα με συναρτήσεις. Στη συνέχεια — στοιχεία με ένα-δύο πεδία κατάστασης, όπου το useState αντικαθιστά άμεσα το this.state και το this.setState.

Τα σύνθετα στοιχεία με πολλαπλές μεθόδους κύκλου ζωής μεταφράζονται μέσω του useEffect. Η λογική από componentDidMount + componentDidUpdate χωρίζεται σε ξεχωριστά useEffect με διαφορετικές εξαρτήσεις. Το componentWillUnmount αντικαθίσταται από συνάρτηση επιστροφής μέσα στο useEffect. Για σύνθετη λογική κατάστασης, χρησιμοποιήστε το useReducer.

Εργαλεία αυτόματης μετάβασης — @phenomnomnominal/ts-react-class-to-hook ή σενάρια codemod — μπορούν να μετατρέψουν αυτόματα απλές κλάσεις. Για σύνθετες περιπτώσεις, η μετάβαση παραμένει χειρωνακτική εργασία που απαιτεί κατανόηση της λογικής του αρχικού στοιχείου.

Συχνές Ερωτήσεις

Είναι υποχρεωτική η κλήση super(props) στον κατασκευαστή;

Ναι. Το super(props) μεταβιβάζει τα props στο γονικό React.Component. Χωρίς αυτήν την κλήση, το this.props θα είναι undefined μέσα στον κατασκευαστή. Στο render και στις μεθόδους κύκλου ζωής, τα props είναι διαθέσιμα ακόμη και χωρίς super, αλλά αυτό είναι παρενέργεια υλοποίησης.

Γιατί το setState είναι ασύγχρονο;

Το React ομαδοποιεί πολλαπλές κλήσεις setState σε ένα batch για να μειώσει τον αριθμό των περιττών εκ νέου αποδόσεων. Αν το setState ήταν σύγχρονο, κάθε κλήση θα προκαλούσε άμεση απόδοση, μειώνοντας την απόδοση σε μαζικές ενημερώσεις.

Μπορούν να χρησιμοποιηθούν hooks μέσα σε κλασικό στοιχείο;

Όχι. Τα hooks λειτουργούν μόνο σε λειτουργικά στοιχεία. Για έργα με κλασικά στοιχεία, όλα τα παλιά μοτίβα είναι διαθέσιμα: render props, HOC και Consumer για περιβάλλον. Η μετάβαση σε hooks απαιτεί μετατροπή της κλάσης σε συνάρτηση.

Τι είναι το PureComponent και σε τι διαφέρει από το Component;

Το React.PureComponent υλοποιεί το shouldComponentUpdate με ρηχή (shallow) σύγκριση props και κατάστασης. Σε αντίθεση με το Component, που πάντα αναδημιουργεί σε setState, το PureComponent παραλείπει την αναδημιουργία αν τα δεδομένα δεν έχουν αλλάξει. Αυτή είναι μια βελτιστοποίηση για στοιχεία χωρίς σύνθετη ένθεση.

Πώς χειριζόμαστε ένα σφάλμα σε κλασικό στοιχείο;

Χρησιμοποιήστε τις componentDidCatch και getDerivedStateFromError. Η componentDidCatch(error, info) καταγράφει το σφάλμα. Η getDerivedStateFromError ενημερώνει την κατάσταση για εμφάνιση fallback-UI. Αυτές οι μέθοδοι λειτουργούν μόνο σε κλασικά στοιχεία — οι συναρτήσεις χρειάζονται ένα στοιχείο περιτυλίγματος ErrorBoundary.

Σύνοψη

  • React.Component — βασική κλάση για στοιχεία με κληρονομικότητα, κατάσταση και μεθόδους κύκλου ζωής.
  • this.state αρχικοποιείται στον κατασκευαστή, ενημερώνεται μόνο μέσω this.setState — η άμεση μετάλλαξη απαγορεύεται.
  • componentDidMount — το κύριο μέρος για αιτήματα API, συνδρομές και χρονομετρητές μετά την πρώτη απόδοση.
  • componentWillUnmount — υποχρεωτικός καθαρισμός συνδρομών και χρονομετρητών για πρόληψη διαρροής μνήμης.
  • Δέσμευση this είναι υποχρεωτική: bind στον κατασκευαστή — συνιστώμενος τρόπος για μεθόδους callback.
  • Hooks αντικατέστησαν τα κλασικά στοιχεία για νέα έργα, αλλά οι κλάσεις παραμένουν πλήρως υποστηριζόμενες.
  • Μετάβαση σε hooks εκτελείται σταδιακά: πρώτα τα stateless στοιχεία, τα σύνθετα — μέσω useReducer και useEffect.

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης