React Komponensek 1. rész

Csumi | 2022. 04. 14. 10:13 | Olvasási idő: 3 perc

Címkék: #npm #React #React JS #SPA #Vendégblogger

Ebben a bejegyzésben a React komponensek alapvető előnyeit és a statikus komponensek létrehozását fogjuk megtekinteni.
react_components

Előzmények: a react telepítésén már túl vagyunk, úgyhogy innen tudjuk folytatni az ismerkedést, akár úgy, hogy a Laravel-lel együtt használjuk, akár úgy, hogy egy új React projektet hozunk létre (itt most ez utóbbi történik majd meg).


Új kiindulási (nem Laravel alapú) projekt

https://github.com/gludovatza/my-first-react-app

Ez egy úgynevezett Single-Page Application (SPA), amit lehet akár clone-ozni is, mert ebben fogjuk elvégezni az alábbi (és közeljövőbeli) fejlesztéseket. Aki kicsit jobban át szeretné látni, hogy mi is a különbség a hagyományos webes alkalmazások és az SPA-k között, annak ezt a videót ajánlom:

Ezekután indítsuk is el az alkalmazásunkat:

npm start

Ezután, ha bármilyen módosítást hajtunk majd végre a fájljainkban és mentjük őket, akkor egyből frissülni is fog a böngészőben a http://localhost:3000-es webcímen a projektünk. A böngészőben ezt kell látnunk:


Mi is az a komponens?

A komponensek lehetővé teszik számunkra, hogy a felhasználó által látott felület egyes elemeit újra felhasználhassuk, és segítik, hogy ezeket külön, a többitől elzártan tudjuk kezelni. Alapvetően a komponensek úgy működnek, mint a Javascript függvények. Lehet nekik bemenetként (input) adatokat adni, melyeket "prop"-nak (ezekről a jövőben lesz szó) hívunk és a React a "függvényből" egy leírást ad vissza, hogy mi jelenjen meg a képernyőn.

Komponenst létrehozni két módon is lehetséges: function és class formában is. Elsőnek megnézzük, hogy is néz ki maga a komponens létrehozása mind a két megoldással.

Function formában az alábbi módon hozható létre egy olyan komponens, mely még statikus, azaz a megjelenítéséhez nem kell külső adat és így nem is függ tőlük:

function first(){
  return (
    <div>
      Üdvözöllek az első komponensednél
    </div>
  )
}

export default first

Ugyanez a komponens megoldása class formában az alábbi módon valósítható meg:

class First extends React.Component {
  render() {
    return (
      <h1>
        Én vagyok az első komponensed!
      </h1>
    );
  }
}

A React fejlesztők a lehető legtöbb esetben a function komponens formáját használják a jövőben tanulandó Hook-ok és State-ek miatt. Így a jövőben előszeretettel használjuk ezt mi is. Viszont nem mehetünk el a két módszer összehasonlítása mellett sem, így az alábbi táblázatba összeszedtem egyszerűsítve a különbségeket nektek.

Funkcionális komponensekOsztály alapú komponensek
A funkcionális komponens alapvetően egy egyszerű Javascript function, mely elfogad változókat argumentumként és egy React elemet ad vissza végül.Az osztály alapú komponenst mindig a React-ból származtatjuk. Kell hozzá egy render metódus és ez fogja visszaadni a React elemet végül.
Itt nem található meg a render metódus.Kötelező a render() metódus amely egy JSX-et fog (szintaktikailag azonos a HTML-lel)
Állapot nélküli komponensenként is ismertek, mivel egyszerűen elfogadják az adatokat, és valamilyen formában megjelenítik azokat, amelyek elsősorban a felhasználói felület megjelenítéséért felelősek.Állapottartó összetevőkként is ismertek, mivel logikát és állapotot valósítanak meg.
A React életciklus-módszerek (például a componentDidMount) nem használhatók funkcionális komponensekben.A React életciklus metódusok osztály összetevőkön belül használhatók (például a componentDidMount).
A hookok könnyen használhatók funkcionális alkatrészekben, hogy állapotszerűvé tegyék őket. Példa:

const [name,SetName] = React.useState(' ')

Különböző szintaxist igényel egy osztály komponensen belül a hook megvalósításához. Példa:

constructor(props) {

   super(props);

   this.state = { name: ' ' }

}

Konstruktorokat nem használnak.A konstruktort úgy használják, ahogyan az állapotot tárolni kell.

Hasznos kiegészítő VSCode-hoz

Mielőtt belekezdenénk a React-os munkába, előtte érdemes telepítenünk ezt a kiegészítőt a VSCode-hoz, mert megkönnyítheti a munkánkat: ES7+ React/Redux/React-Native snippets (több mint 5 millióan telepítették már).

Néhány példa

Bevezetőnek hoztam egy egyszerű példát a statikus komponens létrehozására. Hozzunk létre egy egyszerű "kártya" komponenst, amely üdvözöl az oldalon. Első lépésként hozzunk létre egy JSX fájl-t a src/components mappában. Ezt az alábbi módon tehetjük meg:

Legyen a neve: card.jsx (ha szükséges, hozzuk létre előtte az src mappában a components mappát is).

Ha a fájlon belül a "rafce" szöveget beírjuk és egy TAB-ot nyomunk a program legenerálja nekünk az alap function alapú komponens-t. Majd az alább kódot írjuk meg:

import React from 'react'

const Card = () => {
  return (
    <div>
      <h1>Statikus komponens</h1>
      <span>Én vagyok az első komponensed! </span>
      <button>Komponens gombja</button>
    </div>
  )
}

export default Card

Itt látható, hogy az összes HTML tudást fel lehet használni, amelyet már ismerünk.

Egyelőre még nem jelenik meg az oldalon mentés után, mivel nem importáltuk be a fő fájlba (src/App.js), és nem adtuk hozzá a return metódushoz a Card koponenst.

Ezt az alábbi módon tudjuk megtenni:

import Card from './components/card'

function App() {
  return (
    <div className="App">
      <Card/>
    </div>
  );
}

export default App;

Az eredmény a weboldalon:

Ezt a komponens beszúrást akár többször is megismételhetjük és látjuk, hogy az oldalon valóban többször jelenik meg a komponens.

import Card from './components/card'

function App() {
  return (
    <div className="App">
      <Card/>
      <Card/>
      <Card/>
      <Card/>
    </div>
  );
}

export default App;

Így még nem tűnik viszont annyira szépnek az oldal egyelőre, így adjunk hozzá CSS-t.

React-ban a komponensek, illetve a különböző HTML tag-ek class nevet tudnak csak kapni, melyet className="class neve" módon kell megadni nekik.

Hozzunk létre a CSS fájloknak az átláthatóság kedvéért egy css mappát az src-n belül.

Itt hozzuk létre a card.css fájlt, majd másoljuk bele az alábbi kódot minimális "design"-nak:

.card {
    text-align: center;
}
.gomb{
    background-color:green;
    border: none;
    color: white;
    padding: 15px 32px;
    text-align: center;
    text-decoration: none;
    display: inline-block;
    margin: 4px 2px;
    cursor: pointer;
    border-radius:5px;
}

Ilyenkor az alábbi fájlt relatív címzéssel érjük el az aktuális komponens fájljában, illetve a fentebb említett módon érjük el a class-okat (figyeljünk a div és a button tag-ek className attribútumára):

import React from 'react';
import '../css/card.css';

const Card = () => {
  return (
    <div className="card">
      <h1>Statikus komponens</h1>
      <span>Én vagyok az első komponensed! </span>
      <button className="gomb">Komponens gombja</button>
    </div>
  )
}

export default Card

Nagyszerű, már tudunk saját statikus komponenst létrehozni, és kedvünk szerint design-olni, amelyet bármennyiszer, bárhol meg tudunk jeleníteni!

Nincs más hátra, mint akár saját ötlet alapján pár feladatot megvalósítani a következő blog bejegyzésig, ahol már a dinamikus komponensek létrehozását (külső adatok megjelenítése egy-egy komponensben) fogjuk átvenni... tartsatok velünk!

Az itteni módosítások ebben a Github commit-ben érhetők el.