reactjs - `routeDepth` 中未指定所需的上下文 `RouteHandler`

标签 reactjs react-router isomorphic-javascript

我花了几个小时尝试构建 React 应用程序原型(prototype),但在尝试实现路由时遇到了困难。我遇到的错误是:

Warning: Failed Context Types: Required context `routeDepth` was not specified in `RouteHandler`.
Warning: Failed Context Types: Required context `router` was not specified in `RouteHandler`.
Warning: owner-based and parent-based contexts differ (values: `undefined` vs `1`) for key (routeDepth) while mounting RouteHandler
Uncaught TypeError: Cannot read property 'getRouteAtDepth' of undefined

这是一个同构应用程序(在服务器和客户端上呈现),显然我读到的所有内容都提到了React 或 React-Router 被加载两次。但我还没有找到解决这个问题的好方法以及导致它的原因(是 Gulp 配置还是只是 React 跨文件导入的方式?)。

这是我所拥有的:

server.js

var express = require('express');
var http = require('http');
var app = express();
var React = require('react');
var Router = require('react-router');

require("babel/register");

var routes = require('./app/routes.js');

app.set('view engine', 'ejs');
app.use(express.static(__dirname + '/public'));

app.use(function(req, res) {
  Router.run(routes, req.path, function(Handler) {
    var html = React.renderToString(React.createElement(Handler));
    var page = res.render(__dirname + '/server/views/index.ejs', {reactOutput: html});
  });
});

var server = app.listen(8080, function(req, res) {
    console.log('Server started');
});

require('./server/routes/routes.js')(app, io);

index.ejs

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
    <meta name="viewport" content="width=device-width, initial-scale=1"/>
    <title>React App</title>
    <link rel="stylesheet" href="/css/style.css"/>
    <link href='http://fonts.googleapis.com/css?family=Lato:100,300,400' rel='stylesheet' type='text/css'>
</head>
<body>
    <div id="app"><%- reactOutput %></div>
    <script src="/bower_components/socket.io-client/socket.io.js"></script>
    <script src="/js/vendor.js"></script>
    <script src="/js/vendor.bundle.js"></script>
    <script src="/js/bundle.js"></script>
</body>
</html>

app.js(在 gulp 运行后将变成 bundle.js)

var React = require('react');
var ReactApp = require('./components/App/ReactApp.js');
var Activity = require('./components/Activity/Activity.js');
var Router = require('react-router');
var routes = require('./routes.js');
var Route = Router.Route;
var Link = Router.Link;

Router.run(routes, Router.HashLocation, function(Handler) {
  React.render(<Handler/>, document.getElementById("app"));
});

routes.js

var React = require('react');
var Router = require('react-router');
var Route = Router.Route;
var Link = Router.Link;

var App = require('./components/App/ReactApp.js');
var ActivitiesList = require('./components/ActivitiesList/ActivitiesList.js');
var Activity = require('./components/Activity/Activity.js');
var Task = require('./components/Task/Task.js');


export default (
  <Route path="/" handler={App}>
    <Route path="/activity" component={Activity}/>
  </Route>
);

谢谢!

最佳答案

我回答自己的问题是因为我做错了几件事,并且认为值得分享:

  1. 由于未知的原因,当我将 ReactApp 组件的语法从 ES5 更改为 ES6 时,引发此问题的错误消失了。 (我没有在问题中发布这个文件);我不知道这是否是 browserify 的要求,但我最终将所有 ES5 语法更改为 ES6,如果您从 React 开始,我建议您执行与大多数 ES6 示例相同的操作。
  2. server.js我对服务器路由文件( require('./server/routes/routes.js') )的要求应该在 Router.run 之前,否则我所有的api请求都会被React-Router拦截;
  3. <Route path="/activity" component={Activity} />我替换了component通过handler .
  4. routes.js替换Router.HashLocation通过Router.HistoryLocation如果你不想要哈希 #在您的网址中。

关于reactjs - `routeDepth` 中未指定所需的上下文 `RouteHandler`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31627618/

相关文章:

reactjs - redux reducer 不更新状态

javascript - 使用路由路由器 v4 强制更新相同的路由

javascript - 如何在不使用任何事件处理程序的情况下重新加载 react 组件?

javascript - 如何延迟 NavLink 的 react ?

asp.net - 服务器端asp.net上的angularjs渲染

express - 在同构的reactjs中检测移动设备

javascript - 如何将同构的 commonJS 代码与 webpack 捆绑在一起

javascript - 流: is not a polymorphic type

javascript - Material-ui 中的褪色卡片导致 Web 应用程序崩溃,引发元素类型无效,预计会出现字符串错误

javascript - 为什么在 React Hooks 中排序后数组不更新?