React-Grundlagen

Auf diser Seite habe ich Einsteiger-Infos zu React zusammengestellt. Weiterführende Infos gibt es in der React-Snippet-Sammlung.

React ist eine Bibliothek, kein Framework. Wird oft für Views in einer MVC-Architektur verwendet.

Und für den Rest von MVC?

Links:

TODO Code-Beispiele mit ES6-Klassen statt React.createClass. Siehe React-Snippets.

Rendering und JSX

Beispiel-Komponente:

var MyComponent = React.createClass({
  render: function() {
    return <div>
      <button onClick={this.onMyButtonClick}>Click here</button>
    </div>
  },
  onMyButtonClick: function() {
    ...
  }
});

TODO Autobinding durch React.createClass

Die Methode render verwendet ein JSX-Template. Dieses wird in JavaScript-Code transformiert - während der Entwicklung direkt im Browser (mit dem JSX Transformer), im Produktivsystem wird vorkompiliert (z.B. mit Babel).

Obiges Beispiel sieht transformiert so aus:

React.DOM.div({},
  React.DOM.button({onClick: this.onMyButtonClick}, 'Click here')); 

JSX ist dabei nur ein Vorschlag. Man kann React auch mit einer anderen Template-Engine verwenden.

Die Ideen hinter JSX:

Der State

Der Zustand einer Komponente wird im Attribut state festgehalten. Der state ist in der Komponente gekapselt.

React macht kein dirty-checking wie Angular. Das Rendering wird durch den expliziten Aufruf von setState ausgelöst.

Beispiel:

var ButtonCounter = React.createClass({
  getInitialState: function() {
    return({count: 0});
  },

  add: function() {
    this.setState({count: this.state.count + 1});
  },

  render: function() {
    return(
      <div>
        <button onClick={this.add}>+</button>
        <p>Count: {this.state.count}</p>
      </div>
    );
  }
});

Props

Props werden einer Komponente von außen übergeben und können auch nur von außen verändert werden.

Beispiel:

var ColorBar = React.createClass({
  style: function() {
    return {
      width: 50,
      backgroundColor: this.props.color
    };
  },

  render: function() {
    return <div style={this.style()}></div>
  }
});

var App = React.createClass({
  getInitialState: function() {
    return {colors: ['red', 'green', 'blue']};
  },

  render: function() {
    function createBar(color) {
      return <ColorBar color={color} />
    }

    return <div>{this.state.colors.map(createBar)}</div>
  },

  componentDidMount: function() {
    var me = this
    window.setInterval(function() {
      var colors = me.state.colors;
      me.setState({colors: [ colors[1], colors[2], colors[0]]});
    }, 500);
  }
});

React.render(<App />,
  document.querySelector('#react-container'));

Virtueller DOM

Siehe: Artikel Virtuelles DOM mit React.js - Details zur Implemetierung des virtuellen DOM

Die render-Methoden ändern nicht das echte DOM, sondern ein virtuelles DOM. Das virtuelle DOM ist eine Struktur aus einfachen JavaScript-Objekten. Siehe: Beispiel-Code, der virtuelles DOM ausgibt.

Bei jedem Tick werden Unterschiede zum bisherigen virtuellen DOM ermittelt. Dadurch muss nicht jede geänderte View komplett gerendert werden, das echte DOM wird nur an den Stellen angepasst, an denen sich wirklich etwas getan hat.