带有Django的ReactJS-实际用法


74

我对React有点困惑,我很喜欢它。它比Angular更为冗长(带有|过滤器的ng-repeat是无价的),但是还可以。

让我烦恼的是,我应该如何将React与Django模板一起使用。我应该将所有JavaScript连同“ HTML”标记一起放入模板中。

实施Angular非常无缝。我只是将一些属性放到template / django表单类中,然后在单独的文件中编写了javascript。包括该文件,就完成了。

如何对“使用”做出反应?正确的方法是什么?

提前致谢!



谢谢,但是我仍然不知道如何分隔我的应用程序代码。
n1_

4
我们在前端使用django和react。我们只是将django用于我们的其余api和所有react前端。
zackify

好吧,这是我现在可以想象的唯一方式
n1_

Answers:


83

由于您想将React与Django模板一起使用,因此我假设React代码只会影响页面的特定部分。基于该假设编写以下说明。

首先,您不必将所有JS代码都放在模板中-实际上,那是一团糟。

您可以使用Webpack创建一个单独的基于JS的构建过程(参阅此方法)。这增强了客户端代码的功能,从而允许您在浏览器中使用CommonJS模块,您可以直接从npm中提取该模块,包括React

Webpack将依次生成一个包(或多个包,具体取决于应用程序的性质和Webpack配置),您需要<script>像往常一样通过标签将其包含在Django模板中。

现在,您需要进行React.render()调用以在现有页面布局中的某个位置呈现React应用程序。您需要使用具有特定ID /类名称的空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的几步相比,甚至更多),但相信我从长远来看会有所收获。

总结一下:

  1. 在单独的JS文件中编写React代码
  2. 使用Webpack(利用CommonJS模块)捆绑您的React代码
  3. 将捆绑包包含在Django模板中
  4. 使用Django模板中的粘合代码渲染React代码

1
那么基本上,当django渲染诸如form或grid之类的组件以React结尾时,这是一个故事?
n1_

1
Django模板对使用React渲染的组件一无所知,反之亦然。因此,例如{{ form.as_p }},即使您像在Angular中一样在字段中添加属性,React也将无法理解您通过渲染的表单。在这种情况下,Django表单将仅用于验证数据服务器端。
julen 2015年

所以zackify是怎么写的,在这种情况下Django是提供数据的纯后端。整个模板和渲染逻辑都没有用,因为所有HTML都在JS(React组件)中。对?
n1_

1
这取决于您,但这不是您的Django应用具有100%React代码的要求。这主要取决于您要在客户端上构建哪些UI和交互。如上所示,可以同时使用Django模板和React代码。
julen

1
听起来好像对全局对象的引用不正确(window.MyApp或类似);确保您输入正确。在调用之前,还需要包含定义胶水代码的脚本文件。
julen,2015年

9

如果您将前端和后端视为两个不同的独立实体怎么办?我的意思是:

  1. Django应该只是一个API,并以json数据作为响应
  2. 前端只能是nginx服务的静态文件
  3. 您可能必须处理CORS,才能允许两者之间进行通信。一种选择是允许来自您的前端的预检请求,另一种选择是设置nginx代理。这是一个单独的问题,如果需要更多详细信息,则应进行搜索。

我认为这种体系结构使您可以将事物分开,而不处理它们的集成。前端/反应生态系统上的事情已经太复杂了,因此我认为必须考虑配置的简单性。

我也很想知道部署过程将如何寻找该体系结构(使用什么工具?),因此如果您有建议,请添加注释,我将相应地更新响应以为将来的读者提供有用的信息。


4

我实现了与您所要求的类似的东西。我的前端完全在使用Webpack编译的reactjs上,而我的模板是在Django中创建的。

所以我做以下:

  1. 使用react-router并进行响应以创建.jsx / .js代码。
  2. 使用webpack进行编译。
  3. 使用django-webpack

因此,django-webpack的工作原理非常好,并且可以帮助您在django之外隔离编译,以使想法以一种可扩展的好方式工作。


“前端完全在reactjs上,但是模板在Django中创建”是什么意思?如果前端完全在reactjs上,那么您是否完全使用Django模板?(我有一些由Django渲染的表单,现在尝试使用DRF将渲染移至React。试图通过在线提供的有限信息/文档来解决问题-因此询问。)
Anupam

启动项目时,我在django中只有几个模板,但是后来我慢慢移动了整个前端,以Django Rest作为后端做出了反应。现在,我仅将模板用于服务器端呈现(用于SEO)。如果您需要有关迁移的任何帮助,我们将为您提供帮助:)
Harkirat Saluja

谢谢-您是否知道任何演示通过DRF和React渲染Django表单的优秀示例?我一直在花大量时间来解决这个问题,但是一个真实的例子确实可以帮助验证我的理解。这里有一些DRF + React示例,但我专门在寻找一个通过DRF发送表单数据,然后React依次使用数据渲染表单的示例。
Anupam

我没有尝试将django形式与react一起使用,因为我发现redux形式对于我的项目而言确实很棒并且可扩展。我强烈建议您引入图片中的redux,并将您的整个前端移至react-redux
Harkirat Saluja

1
Django模板对SSR没有帮助。为此,您需要Node。完全没有使用Django模板的优势。您可以构建一个完全隔离的ReactJS前端,并且只需通过REST API来往DRF的数据即可。
詹姆斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.