ReactJSとDjangoの組み合わせ - 実際の使用例
質問
私はReactを少しいじっていました、そして、私はそれをかなり好きです。それはAngularよりもはるかに冗長です(ng-repeat with | filterは貴重です)、しかし大丈夫です。
私を悩ませているのは、DjangoテンプレートでどのようにReactを使うかです。すべての javascript を "HTML" マークアップと一緒にテンプレートに入れるべきなのでしょうか。
Angularの実装は非常にシームレスでした。テンプレート/jjangoフォームクラスにいくつかの属性を入れ、そしてjavascriptを分離したファイルに書きました。そのファイルをインクルードすれば完了です。
reactはどのように使うのですか?正しい方法は何ですか?
ありがとうございます。
どのように解決するのですか?
Django テンプレートと一緒に React を使いたいので、React のコードがページの特定の部分にしか影響しないことを想定しています。以下の説明は、その前提で書かれています。
まず第一に、全ての JS コードをテンプレートに入れる必要はありません - 実際、それは混乱するでしょう。
JSベースのビルドプロセスを別に作成することができます。 Webpackを使用して ( このHowtoをチェックする ). これにより、クライアントサイドのコードの機能が強化され、ブラウザで CommonJS モジュールを使用できるようになり、npm から直接引き出すことができます。 React .
Webpack は順番にバンドル (アプリケーションの性質と Webpack の設定によっては複数のバンドル) を生成するので、Django テンプレートに
<script>
タグで Django テンプレートに含める必要があります。
ここで
React.render()
を呼び出して、既存のページレイアウトのどこかに React アプリケーションをレンダリングする必要があります。アプリケーションのマウントポイントとして、特定の id/class 名を持つ空の HTML 要素を使用する必要があります。
しかし、ここで注意点があります: ブラウザや Django テンプレートから CommonJS モジュールに直接アクセスすることはできません。ですから、どちらか一方が
-
を公開する
React
と自分のアプリをwindow
オブジェクトを作成するか、あるいは -
アプリの初期化を処理するためのグルーコードを持つモジュールを作成し、そのメソッドを
window
オブジェクトに公開します。
いずれの場合も、テンプレートから直接初期化コードを呼び出す必要があります (チェックアウトは グルーコードの例 を、そして アプリの初期化を呼び出す ).
この初期化ステップでは、Django テンプレートで利用可能な変数を JS コードに渡すこともできます。
最終的な Django テンプレートはこのようなものになります。
{% load staticfiles %}
{% extends 'base.html' %}
{% block scripts %}
<script type="text/javascript" src="{% static 'path/to/app.bundle.js' %}"></script>
<script type="text/javascript">
// Initialization glue code
window.MyApp.init({el: '.app-mountpoint'});
</script>
{% endblock %}
{% block content %}
<!-- Your template contents -->
<!-- The mount point of your app -->
<div class="app-mountpoint" />
{% endblock %}
そして、グルーのコード。
var React = require('react');
var MyAppComponent = require('MyAppComponent');
window.MyApp = {
init: function (opts) {
var mountPoint = document.querySelector(opts.el);
React.render(<MyAppComponent />, mountPoint);
}
};
このすべてが最初は圧倒されるように聞こえるかもしれませんが(Angularで行ったいくつかのステップと比べるとなおさら)、長い目で見れば報われると信じています。
というわけで、まとめます。
- Reactのコードは別のJSファイルに書く
- Webpack (CommonJS モジュールの活用) を使って React コードをバンドルする。
- Django テンプレートにバンドルをインクルードします。
- Django テンプレートでグルーコードを使用して React コードをレンダリングします。
関連
-
[解決済み] エラー: 未定義のプロパティ 'map' を読み取ることができません。
-
[解決済み】Djangoのクエリセットフィルタリングでnot equalを行うにはどうすればよいですか?
-
[解決済み] Next.jsでWebSocketを利用する
-
[解決済み] reactstrapのドロップダウンで選択されたアイテムを設定する方法は?
-
[解決済み] reactのuseStateフックでコールバックを使う方法 [重複]。
-
[解決済み] Djangoの "slug "とは何ですか?
-
[解決済み] ReactJSでコンポーネントがtext型の非制御入力を制御エラーに変更する場合
-
[解決済み] Djangoのバージョンを確認する方法
-
[解決済み】Djangoでnull=Trueとblank=Trueの違いは何ですか?
-
[解決済み】ReactJS - "setState "が呼ばれるたびにrenderが呼び出されるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Reactコンポーネント内でswitchステートメントを使用するには?
-
[解決済み] Apolloクライアントでログアウトした後、ストアをリセットする
-
[解決済み] reactでonloadを使うには?
-
[解決済み] Next.jsでWebSocketを利用する
-
[解決済み] ReactJsのCreateClassは関数ではない
-
[解決済み] React TypeScriptで作業しているときに、Jestが予期しないトークンに遭遇した
-
[解決済み] ReactJS - SCRIPT1010: 期待される識別子 - IE11 で本番ビルドが実行されない
-
[解決済み] 矢印本体を囲む予期せぬブロックステートメント
-
[解決済み] Cross-envでyarnの実行時にenv変数が変更されない。
-
[解決済み] react-router-domを使用する際に「Function components cannot be given refs」を回避する方法は?