1. ホーム
  2. reactjs

[解決済み] React.createElement: type is invalid -- expected a string.

2022-01-28 18:15:20

質問

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;

どのように解決するのですか?

ほとんどの場合、不正なエクスポート/インポートが原因です。

よくあるエラーです。

// File: LeComponent.js
export class LeComponent extends React.Component { ... }

// File: App.js
import LeComponent from './LeComponent';

可能なオプション

// File: LeComponent.js 
export default class LeComponent extends React.Component { ... }

// File: App.js
import LeComponent from './LeComponent';

いくつかの間違いの可能性がありますが、そのエラーは60%の確率でインポート/エクスポートの不一致が原因です、毎回。

編集

通常、あなたは すべき 障害が発生したおおよその場所を示すスタックトレースを取得します。これは通常、最初の質問にあるメッセージの直後です。

もし表示されない場合は、その原因を調査する価値があるかもしれません(ビルドの設定に抜けがあるのかもしれません)。いずれにせよ、表示されない場合、唯一の対処法は、以下のように絞り込むことです。 どこ エクスポート/インポートに失敗しています。

悲しいかな、スタックトレースなしでこれを行う唯一の方法は、エラーが出なくなるまで手動で各モジュール/サブモジュールを削除し、スタックを遡って作業することです。

編集2

コメントにより、確かにインポートの問題であり、特に存在しないモジュールをインポートしたことが原因であることが判明しました。