Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用React和Django,我需要React路由器吗?_Django_Reactjs_React Router - Fatal编程技术网

使用React和Django,我需要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

假设我有一个现有的Django webapp,在url.py中有一堆URL。现在假设我想在这个Django应用程序中添加一些网页,新的网页是使用React构建的

据我所知,React有自己的路由功能(在React路由器中),因此,如果我转到
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
。如何将其传递到React
App1
类?

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中时,上下文变量似乎不知从何而来!除息的。但他可以称之为“惯例”,继续前进。呵呵,惯例。我喜欢它。这就是工作安全,哈哈哈