【问题标题】:React JS - Route - Element type is invalidReact JS - 路由 - 元素类型无效
【发布时间】:2019-02-17 17:13:46
【问题描述】:

我是 React JS 的新手,正在尝试实现类似于 Angular 示例应用程序的东西。

我有一张客户表,想在表的底部看到选定的客户。

我用 react-router-dom 尝试了以下操作:

// index.js 
import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter } from 'react-router-dom';
import './index.css';
import App from './App';
import registerServiceWorker from './registerServiceWorker';
import 'bootstrap/dist/css/bootstrap.css';

ReactDOM.render((<BrowserRouter><App /></BrowserRouter>), document.getElementById('root'));
registerServiceWorker();


// App.js
import React, { Component } from 'react';
import { Route } from 'react-router-dom/Route';

import Customers from './components/customers';
import Customer from './components/customer';

export default class App extends Component {
    state = {
    };

    render() {
        return (
            <React.Fragment>
                <Customers />
                <Route path={`/customer/:id`} component={Customer} />
            </React.Fragment>
        );
    }
}


// customers.jsx
import React, { Component } from 'react';
import { Link } from 'react-router-dom';

export default class Customers extends Component {
    state = {
        customers: []
    };

    render() {
        return (
            <React.Fragment>
                <header className="jumbotron"><h1>Customer List</h1></header>

                <div className="container">
                    <table className="table table-striped">
                        <thead>
                            <tr>
                                <th>Name</th>
                                <th>Address</th>
                            </tr>
                        </thead>
                        <tbody>
                            {this.state.customers.map(c => (<tr key={c.id}><td><Link to={`/customer/${c.id}`}>{c.name}</Link></td><td>{c.address}</td></tr>))}
                        </tbody>
                    </table>
                    <hr />
                </div>

                <footer className="footer">&copy; 2018</footer>
            </React.Fragment>
        );
    }

    async componentDidMount() {
        const result = await fetch('http://api.com/customers');
        const customers = await result.json();
        this.setState({ customers });
        console.log(this.state.customers);
    }
}


// customer.jsx
import React, { Component } from 'react';

export default class Customer extends Component {
    render() {
        return (<p>Customer</p>);
    };
}

App.js 中添加路由的行(路由路径={/customer/:id} 组件={客户})导致错误。如果我删除该行,我可以看到客户表,但是一旦我添加了该行,就会收到该错误消息。

我是否错过了有关此路由器工作原理的某些内容?

谢谢。

更新

将 App.js 更改为这个非常简单的版本的事件会导致错误

import React, { Component } from 'react';
import { Route } from 'react-router-dom/Route';

export default class App extends Component {
    state = {
    };

    render() {
        return (
            <div>
                <Route exact path='/' render={() => (<h1>Hello</h1>)} />
                <Route exact path='/customer' render={() => (<h1>Customer</h1>)} />
            </div>
        );
    }
}

完整的错误信息是:

元素类型无效:应为字符串(对于内置组件)或类/函数(对于复合组件),但得到:未定义。您可能忘记从定义组件的文件中导出组件,或者您可能混淆了默认导入和命名导入。

【问题讨论】:

  • 你试过用&lt;div&gt;替换&lt;React.Fragment&gt;吗?
  • Customer 组件可能有问题。
  • 您的代码可以正常工作 -> stackblitz.com/edit/react-szzsq7
  • @marzelin,感谢您的意见。我已经尝试了所有方法,但它在我的浏览器上不起作用。关于我应该检查的配置有什么建议吗?
  • 查看错误是构建过程问题而不是浏览器

标签: javascript reactjs react-router-dom


【解决方案1】:

改变这个:

import {Route} from "react-router-dom/Route";

到这里:

import Route from "react-router-dom/Route";

Route 是直接访问时的默认导出:"react-router-dom/Route" 从基础包导入Route 时可以使用命名导出

import {Route} from "react-router-dom";

但不要将两者混为一谈。

【讨论】:

  • 非常感谢您的帮助。
【解决方案2】:

看起来您在 Customer 组件的 render() 方法中有语法错误,当您尝试使用/渲染它时会导致问题。

尝试以下修复:

export default class Customer extends Component {
    render() {
        return (<p> Customer</p>); // <-- remove the whitespace in 
                                   //     closing tag </p> like so
    };
}

【讨论】:

  • 去掉空格后还是一样的错误。感谢您的输入。请注意,如果我删除 Route 标签,页面显示正常。
  • 你使用的是什么版本的 react、react-dom 和 react-router-dom?
  • 反应:^16.5.0,反应域:^16.5.0,反应路由器域:^4.3.1
【解决方案3】:

我觉得问题在于路径中的倒勾。可以试试这个吗

    render() {
          return (
              <React.Fragment>
                   <Customers />
                   <Route path='/customer/:id' component={Customer} />
             </React.Fragment>
           );
      }

    render() {
          return (
              <React.Fragment>
                   <Customers />
                   <Route path={'/customer/:id'} component={Customer} />
             </React.Fragment>
           );
      }

【讨论】:

  • 谢谢。我用单引号和双引号尝试过,有大括号和没有大括号,仍然是同样的错误。请注意,如果我删除 Route 标签,页面显示正常。
  • 看起来问题出在客户组件上,要么没有正确导入,要么没有导出
  • 你在使用 react-router-Redux 吗?
  • 我没有使用 react-router-Redux。另外,我刚刚更新了一条非常简单的路线,但仍然出现错误。谢谢。
猜你喜欢
  • 2021-05-21
  • 2021-08-05
  • 2018-11-04
  • 2022-12-16
  • 2019-09-01
  • 2019-07-04
  • 2018-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多