使用React和Django,我需要React路由器吗?
假设我有一个现有的Django webapp,在url.py中有一堆URL。现在假设我想在这个Django应用程序中添加一些网页,新的网页是使用React构建的 据我所知,React有自己的路由功能(在React路由器中),因此,如果我转到使用React和Django,我需要React路由器吗?,django,reactjs,react-router,Django,Reactjs,React Router,假设我有一个现有的Django webapp,在url.py中有一堆URL。现在假设我想在这个Django应用程序中添加一些网页,新的网页是使用React构建的 据我所知,React有自己的路由功能(在React路由器中),因此,如果我转到mydomain.com/page1/,它将服务于一件事,如果我转到mydomain.com/page2/,它将服务于另一件事 但如果我不想使用路由器呢?换句话说,如果我要添加10个新页面,每个页面都有自己的URL,那么为什么我不能在Django的URL.py
mydomain.com/page1/
,它将服务于一件事,如果我转到mydomain.com/page2/
,它将服务于另一件事
但如果我不想使用路由器呢?换句话说,如果我要添加10个新页面,每个页面都有自己的URL,那么为什么我不能在Django的URL.py文件中设置它呢
当前在urls.py
中,我有一个url定义如下:
url(r'^testview/', views.testview),
def testview(request):
return render(request, 'testview.html', {})
import React from 'react';
import ReactDOM from 'react-dom';
import App from '../somewhere';
const render = Component => {
ReactDOM.render(
<App>
<Component />
</App>,
document.getElementById(Component.name)
)
}
export default render;
在views.py
中,我对testview的定义如下:
url(r'^testview/', views.testview),
def testview(request):
return render(request, 'testview.html', {})
import React from 'react';
import ReactDOM from 'react-dom';
import App from '../somewhere';
const render = Component => {
ReactDOM.render(
<App>
<Component />
</App>,
document.getElementById(Component.name)
)
}
export default render;
我的Django模板存储在文件夹BASE\u DIR/myproject/templates/
中,我在BASE\u DIR/myproject/settings.py中设置了templates变量,以便Django知道在哪里可以找到模板。
因此,在上面的视图方法中,testview.html
指的是BASE\u DIR/myproject/templates/testview.html
。该文件的内容包括:
{% extends "base.html" %}
{% load render_bundle from webpack_loader %}
{% block main %}
<div id="App1"></div>
{% render_bundle 'vendors' %}
{% render_bundle 'App1' %}
{% endblock %}
这很好,但是如果我想要10个不同的页面呢?我是否需要新的应用程序文件,如App2.jsx
,App3.jsx
等,每个页面一个
最后,假设我想将Django变量传递给我的React应用程序,例如:
def testview_with_time(request):
now = datetime.datetime.now()
return render(request, 'testviewtime.html', {
'currtime': '%s' % str(now),
})
这里我传递变量currtime
。如何将其传递到ReactApp1
类?React router
是一种用于单页应用程序的前端路由器。如果你不建水疗中心,你就不需要了
您可以在任何地方连接react父组件,这种方式非常灵活,但是是的,如果您想使用Django视图进行服务器端渲染,并使用react增强部分组件,那么是的,您需要App2.jsx
,App3.jsx
,等等(不过我建议选择更好的名称)
另外,如果你这样做,不要使用react来构建整个页面,只在你需要额外交互性的地方使用它,比如小部件或其他东西。如果您在react中呈现整个页面,而不使应用程序成为SPA,那么您将失去JS客户端应用程序和服务器端呈现的好处
不能将django视图中的变量传递给react组件,因为它们是在浏览器上呈现的。react组件中需要的任何数据都必须通过AJAX
请求获取,就像任何其他JS库一样,我认为您获得的信息是正确的。
我同意@SrThompson的回答,但我要做一些细微的改变:
从Django开始。在您的testview.html
中:
{% extends "base.html" %}
{% load render_bundle from webpack_loader %}
{% block main %}
<div id="{{component_name}}"></div>
{% render_bundle 'vendors' %}
{% render_bundle component_name %}
{% endblock %}
此呈现函数将传递的组件作为参数呈现给具有id='Component'
的元素,就像您在Django中的上下文变量中设置的一样。您还可以在每个渲染组件的顶部获得App
组件,就像正常的react应用程序一样。例如,只需使用render(App1.jsx)
调用它们
通过这种方式,您将不得不担心只创建一个.hmtl文件来呈现react组件。关于传递上下文变量的想法,有一个答案值得一看,它提供了一个解决方案:这肯定会起作用,尽管它对我来说有点太粗糙。如果这是OP想要的解决方案,那就太好了。这两种方式都有很好的贡献。我同意这看起来有点粗糙。主要是因为,当您在某些App.jsx中时,上下文变量似乎不知从何而来!除息的。但他可以称之为“惯例”,继续前进。呵呵,惯例。我喜欢它。这就是工作安全,哈哈哈