Skip to main content

JSX en state variabelen.

In REACT maken we gebruik van de 'taal' JSX. In deze les leren we wat JSX is.

Verder leren we wat in React een state variabele is en hoe we daar mee kunnen werken.

Met dit alles maken we een kleine applicatie waarmee de CSS-stijl van een <div> kan worden aangepast door code.

JSX

JSX staat voor JavaScript XML en is een mengeling van JavaScript en XML. XML is niets meer dan een formaat waarbij je telkens <begin>..</begin> gebruik. HTML-tags zijn eigenlijk XML tags. De XML tags in JSX lijken heel veel op HTML maar zijn hier en daar net even iets anders.

Een voorbeeld van JSX staat hieronder. Plaats deze code in de app.js die je tijdens de installatie hebt gemaakt.

function App() {
  return (
    <div>
      <h1 className="greeting">>Hello!</h1>
      <h2>Good to see you here.</h2>
      <h2>It is {new Date().toLocaleTimeString()}.</h2>
    </div>
  );
}

export default App;

Dit is bijna allemaal 'gewone' HTML. Alleen class is geen class, maar heet in JSX className.

Verder zien we dat tussen de HTML JavaScript staat. Dit is zo omdat deze JavaScript in de HTML moet worden gezien als tekst staat deze tussen { }.

Kijk naar de volgende code die in app.js staat en probeer te voorspellen wat de code doet, voer het daarna uit en kijk of je begrijpt wat er gebeurt en waarom.

function App() {
  
  var myString = "";
  for (var i=0; i < 10; i++) {
    myString = myString + String(i) + ", ";
  }
  
  return (
    <div className="App">
      {myString}
    </div>
  );

}

export default App;

In deze functie staat een verwijzing naar een CSS class. Laten we deze toevoegen.

Maak een nieuwe file App.css in dezelfde folder als de App.js staat en zet daar het volgende in:

.App {
  text-align: center;
  color: red;
}

Voeg nu de regel: import './App.css'; toe boven de functie App() in App.js

State

In React kun je gegevens bewaren door deze op te slaan in een speciale variabele, de state variabele. Om deze te gebruiken is het makkelijker om onze functie om te zetten in een class. Een class heeft in React twee belangrijke methods (functies); constructor() en render().

De constructor wordt eenmalig aan geroepen en hierin kun je state variabelen initialiseren.

In de render() method bepaald de output gemaakt. Je kunt dit vergelijken met de view (van MVC).

We gaan de bovenstaande functie omzetten naar het object model van React.

import './App.css';

import React from 'react';

class App extends React.Component {
  
  constructor(props) {
    super(props);
  }
  
  getNumbers() {
    var myString = "";
    for (var i=0; i < 10; i++) {
      myString = myString + String(i) + ", ";
    }
  }
  
  render() {
    return (
      <div className="App">
        {myString}
      </div>
    );
  }

}

export default App;

Kijk goed hoe je vanuit de render() methode de getNumber methode aanroept. Dat gaat via een XML tag!

Als je deze code runt dan werkt die niet :( Dat komt omdat myString geen state variabele is. myString is alleen bekend in getNumers() en niet daarbuiten!

In de volgende stap hebben we van myString een state variabele gemaakt.

In de constructor method (deze wordt één keer aangeroepen!) wordt de state variabele gedeclareerd en daarna word de method getNumbers() aangeroepen. Met hetNumbers wordt de myString gevuld.

 

import './App.css';

import React from 'react';

class App extends React.Component {
  
  constructor(props) {
    super(props);
    this.state = {
      myString: ''
    }
    this.getNumbers();
  }
  
  getNumbers() {
    var myString = "";
    for (var i=0; i < 10; i++) {
      this.state.myString = this.state.myString + String(i) + ", ";
    }
  }
  
  render() {
    return (
      <div className="App">
        {this.state.myString}
      </div>
    );
  }

}

export default App;

Dynamische CSS in JSX

We gaan nu een knop maken waarmee we de kleur van de tekst (myString) kunnen aanpassen.

We volgen de volgende stappen:

  1. Knop maken die functie aanroept.
  2. state variabele maken waarin de kleur wordt vastgelegd.
  3. In de functie de state variabele aanpassen.
  4. We maken de stijlen in de css file.
  5. in de render method de style/class aanpassen; is de state variabele red dan gebruiken we een stijl waarin de tekst in rood wordt afgedrukt en is de state variabele green dan gebruiken we een stijl die de tekst groen maakt.
Stap 1, Knop maken

Allereerst maken we een button. Zet deze na de regel waarop de nummers worden afgedrukt.

<br />
<button onClick={() => this.changeColor() } >Change Color</button>

Als je de code nu runt dan krijg je een foutmelding als je op de knop drukt. Dat komt omdat de method changeColor() (nog) niet bestaat.

Stap 2, State variabele maken

voeg myColor toe als string aan de state variabele, let op dat je wel een komma gebruikt tussen de state variabelen.

this.state = {
   myString: '',
   myColor: 'red'
}
Stap 3, State variabele aanpassen in functie

Een state variabele mag en kan alleen worden aangepast met een (ingebouwde functie setState(). Dat werkt als volgt:

changeColor() {
  if ( this.state.myColor === "red") {
    this.setState({ 'myColor': 'green'} );
  } else {
    this.setState({ 'myColor': 'red'} );
  }
}

De setState() method is ingebouwd in React.  De state variabelen  staan in JSON formaat.

Wat deze functie doet is de variabele myColor op green zetten als die rood is, en op rood zetten als die groen is.

Stap 4, css aanpassen

In de css maken we twee extra classes.

.red {
  color: red;
}
.greem {
  color: green;
}
Stap 5, class dynamisch maken

In de app.js file passen we nu de stijl aan. 

<div className={this.state.myColor}>

De class wordt dus de waarde van de state variabele myColor. Deze is green of red. Deze stijlen heb je in de CSS aangemaakt in stap 4.

De class App is nu weg, laten we die ook nog even toevoegen.

<div className={"App "+this.state.myColor}>

Stel myColor is "red"dan staat er dus className="App red". Dit betekent dat CSS classes App en red worden toegepast.

Je kunt in de CSS file bij de classes red en green natuurlijk veel meer aanpassen. Probeer zelf maar!

Opdracht

Verander de method getNumbers().

getNumbers() {
  for (var i=0; i < 10; i++) {
    this.state.myString = this.state.myString + "*";
  }
}

Nu zie je 10 sterretjes in plaats van de nummers.

Maak nu een tweede button. Telkens als je op de button drukt laat je een extra sterretje zien. De string myString wordt dus telkens iets langer.

--