Da Sie React zusammen mit Django-Vorlagen verwenden möchten, gehe ich davon aus, dass der React-Code nur bestimmte Teile Ihrer Seite betrifft. Die folgenden Erklärungen basieren auf dieser Annahme.
Zunächst müssen Sie nicht den gesamten JS-Code in die Vorlage einfügen - das wäre in der Tat ein Chaos.
Sie können mit Webpack einen separaten JS-basierten Erstellungsprozess erstellen ( siehe dieses Howto ). Dadurch werden die Funktionen Ihres clientseitigen Codes verbessert, sodass Sie CommonJS-Module im Browser verwenden können, die Sie direkt von npm abrufen können, einschließlich React .
Webpack generiert wiederum ein Bundle (oder mehrere Bundles, abhängig von der Art Ihrer Anwendung und der Webpack-Konfiguration), die Sie <script>
wie gewohnt über Tags in Ihre Django-Vorlagen aufnehmen müssen .
Jetzt müssen Sie den React.render()
Aufruf tätigen , um Ihre React-Anwendung irgendwo im vorhandenen Seitenlayout zu rendern. Sie müssen ein leeres HTML-Element mit einer bestimmten ID / einem bestimmten Klassennamen als Einhängepunkt für die Anwendung verwenden.
Aber hier kommt die Einschränkung: Sie können nicht direkt über den Browser oder Django-Vorlagen auf CommonJS-Module zugreifen. Also entweder du,
- aussetzen
React
und Ihre App dem window
Objekt aussetzen , oder
- Erstellen Sie ein Modul mit Klebercode, um die App-Initialisierung durchzuführen, und stellen Sie diese Methode dem
window
Objekt zur Verfügung.
In jedem Fall müssen Sie den Initialisierungscode direkt aus den Vorlagen aufrufen (siehe Beispiel für Klebercode und Aufruf der App-Initialisierung ).
Mit diesem Initialisierungsschritt können Sie auch in Django-Vorlagen verfügbare Variablen an den JS-Code übergeben.
Die endgültige Django-Vorlage sieht ungefähr so aus:
{% load staticfiles %}
{% extends 'base.html' %}
{% block scripts %}
<script type="text/javascript" src="{% static 'path/to/app.bundle.js' %}"></script>
<script type="text/javascript">
window.MyApp.init({el: '.app-mountpoint'});
</script>
{% endblock %}
{% block content %}
<!-- Your template contents -->
<!-- The mount point of your app -->
<div class="app-mountpoint" />
{% endblock %}
Und der Klebercode:
var React = require('react');
var MyAppComponent = require('MyAppComponent');
window.MyApp = {
init: function (opts) {
var mountPoint = document.querySelector(opts.el);
React.render(<MyAppComponent />, mountPoint);
}
};
Ich weiß, dass all dies am Anfang überwältigend klingen mag (noch mehr im Vergleich zu den wenigen Schritten, die Sie mit Angular gemacht haben), aber glauben Sie mir, es zahlt sich auf lange Sicht aus.
Also zusammenfassend:
- Schreiben Sie den React-Code in separate JS-Dateien
- Verwenden Sie Webpack (mit CommonJS-Modulen), um Ihren React-Code zu bündeln
- Fügen Sie das Bundle in Ihre Django-Vorlagen ein
- Rendern Sie den Reaktionscode mithilfe des Klebercodes in Django-Vorlagen