尝试得到react-router (v4.0.0)和react-hot loader (3.0.0-beta.6)很好地发挥,但在浏览器控制台得到以下错误:

Warning: React.createElement: type is invalid -- expected a string
(for built-in components) or a class/function (for composite
components) but got: undefined. You likely forgot to export your
component from the file it's defined in.

index.js:

import React from 'react';
import ReactDom from 'react-dom';
import routes from './routes.js';
require('jquery');
import 'bootstrap/dist/css/bootstrap.min.css';
import 'bootstrap/dist/js/bootstrap.min.js';
import './css/main.css';

const renderApp = (appRoutes) => {
    ReactDom.render(appRoutes, document.getElementById('root'));
};

renderApp( routes() );

routes.js:

import React from 'react';
import { AppContainer } from 'react-hot-loader';
import { Router, Route, browserHistory, IndexRoute } from 'react-router';
import store from './store/store.js';
import { Provider } from 'react-redux';
import App from './containers/App.jsx';
import Products from './containers/shop/Products.jsx';
import Basket from './containers/shop/Basket.jsx';

const routes = () => (

    <AppContainer>
        <Provider store={store}>
            <Router history={browserHistory}>
                <Route path="/" component={App}>
                    <IndexRoute component={Products} />
                    <Route path="/basket" component={Basket} />
                </Route>
            </Router>
        </Provider>
    </AppContainer>

);

export default routes;

当前回答

在我的例子中,我添加了相同的自定义组件作为道具,而不是实际的道具

   import AddAddress from '../../components/Manager/AddAddress';
    
    class Add extends React.PureComponent {
      render() {
        const {
          history,
          addressFormData,
          formErrors,
          addressChange,
          addAddress,
          isDefault,
          defaultChange
        } = this.props;
    

错误:

    return (
        <AddAddress
          addressFormData={addressFormData}
          formErrors={formErrors}
          addressChange={addressChange}
          addAddress={AddAddress} // here i have used the Component name as probs in same component itself instead of prob
          isDefault={isDefault}
          defaultChange={defaultChange}
        />
      </SubPage>

解决方案:

return (
    <AddAddress
      addressFormData={addressFormData}
      formErrors={formErrors}
      addressChange={addressChange}
      addAddress={addAddress} // removed the component name and give prob name
      isDefault={isDefault}
      defaultChange={defaultChange}
    />
  </SubPage>

其他回答

我认为在排除这个错误时最重要的一点是,当您试图实例化一个不存在的组件时,它就会显现出来。这个组件不需要导入。在我的例子中,我将组件作为属性传递。我忘记更新其中一个调用,以便在一些重构之后正确地传递组件。不幸的是,由于JS不是静态类型的,我的错误没有被发现,它花了一些时间来弄清楚发生了什么。

要排除此错误,在呈现组件之前检查该组件,以确保它是您所期望的组件类型。

对于未来的谷歌人:

我解决这个问题的方法是将react和react-dom升级到NPM上的最新版本。显然,我正在导入一个使用新片段语法的组件,它在我的旧版本的React中被打破了。

在我的例子中,错误发生在试图使用ContextApi时。我错误地使用了:

const MyContext = () => createContext()

但它应该被定义为:

const MyContext = createContext()

我把它贴在这里,以便未来的访客谁被困在这样一个愚蠢的错误将得到帮助,以避免几个小时的头痛,因为这不是由不正确的导入/导出引起的。

我也有类似的问题。发生这种情况是因为我在父组件中导入了一个被删除并且实际上不存在的子组件。我审查了每个导入的父组件,在这种情况下,父组件是ListaNegra.js

大多数情况下,这表示导入/导出错误。但是要注意,不仅要确保堆栈跟踪中引用的文件本身得到了良好的导出,还要确保该文件正确地导入了其他组件。在我的例子中,错误是这样的:

import React from //注意末尾的.css,这是错误的原因! import SeeminglyUnimportantComponent from './SeeminglyUnimportantComponent.css'; Const组件= (props) => ( < div > < SeeminglyUnimportantComponent / > {/ *……这里的组件代码*/} < / div > ); 导出默认组件;