React-router Webpack HMR。根路由必须呈现单个元素

时间:2017-02-25 02:38:02

标签: javascript reactjs webpack react-router webpack-hmr

我试图弄清楚当HMR启用时,react-router如何在AppContainer内部工作,并且卡在以下错误上。你能解释一下hack正在发生什么吗?

  

不变违规:根路由必须呈现单个元素

Index.js

import React from 'react';
import ReactDOM from 'react-dom';

import { AppContainer } from 'react-hot-loader';
// AppContainer is a necessary wrapper component for HMR

import Routes from './routes/index';
const MOUNT_APP = document.getElementById('root');

const render = () => {
  ReactDOM.render(
    <AppContainer>
      <Routes />
    </AppContainer>,
    MOUNT_APP
  );
};

render();

// Hot Module Replacement API
if (module.hot) {
  module.hot.accept('./routes/index', () => {
    render()
  });
}

路线文件为:

import React from 'react';
import { Router, IndexRoute, browserHistory } from 'react-router';

import Home from './Home';
import SubView from './Sub';

const componentRoutes = {
  component   : Home,
  path        : '/',
  indexRoute  : SubView,
  childRoutes : [

  ]
}

const Routes = () => {
  return (
    <Router history={browserHistory} routes={componentRoutes} />
  );
};

export default Routes;

HomeView组件:

import React from 'react';

const HomeView = () => {
    <div>
      <h4>Welcome</h4>
    </div>
}

export default HomeView;

HomeView路线:

import HomeView from './components/SubView';

export default {
  component: HomeView
}

P.S:SubView等于HomeView。

2 个答案:

答案 0 :(得分:2)

您的HomeView组件不会返回任何内容。您需要将内部jsx包装在return ( ... )

答案 1 :(得分:2)

您需要从组件返回一个元素。现在,HomeView的组件如下所示:

const HomeView = () => {
    <div>
      <h4>Welcome</h4>
    </div>
}

你需要返回标记,而不是像这样把它放在函数体中:

const HomeView = () => {
    return (
         <div>
             <h4>Welcome</h4>
         </div>
    )
}