React JS - Route - Недопустимый тип элемента

Я новичок в React JS и пытаюсь реализовать что-то похожее на пример приложения Angular.

У меня есть таблица клиентов, и я хочу видеть выбранного клиента внизу таблицы.

Я пробовал следующее с помощью response-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, которая добавляет маршрут (Route path = {_ 2_} component = {Customer}), вызывает ошибку. Если я удалю эту строку, я могу увидеть таблицу клиентов, но как только я добавлю эту строку, я получаю это сообщение об ошибке.

Я что-то пропустил по работе этого роутера?

Спасибо.

ОБНОВЛЕНИЕ

Событие, меняющее 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>
        );
    }
}

Полное сообщение об ошибке:

Недопустимый тип элемента: ожидается строка (для встроенных компонентов) или класс / функция (для составных компонентов), но получено: undefined. Скорее всего, вы забыли экспортировать компонент из файла, в котором он определен, или перепутали импорт по умолчанию и именованный импорт.


person Fernando    schedule 13.09.2018    source источник
comment
вы пробовали заменить <React.Fragment> на <div>?   -  person marzelin    schedule 13.09.2018
comment
может что-то не так с Customer компонентом.   -  person marzelin    schedule 13.09.2018
comment
ваш код работает без ошибок - ›stackblitz.com/edit/react-szzsq7   -  person marzelin    schedule 13.09.2018
comment
@marzelin, спасибо за ваш вклад. Я перепробовал все способы, но в моем браузере они не работают. Есть предложения по конфигурации, которую я должен проверить?   -  person Fernando    schedule 13.09.2018
comment
глядя на ошибку, это скорее проблема процесса сборки, а не браузера   -  person marzelin    schedule 13.09.2018
comment
Я не вижу ошибок компиляции или сборки на консоли. Он говорит, что скомпилировано успешно! Есть ли шаг в javascript?   -  person Fernando    schedule 13.09.2018


Ответы (3)


измените это:

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

к этому:

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

Маршрут является экспортом по умолчанию при прямом доступе к нему: "react-router-dom/Route" Вы можете использовать именованный экспорт при импорте Route из базового пакета

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

Но не смешивайте их.

person marzelin    schedule 13.09.2018
comment
Большое спасибо за вашу помощь. - person Fernando; 13.09.2018

Я чувствую, что проблема в обратных тиках на пути. Вы можете попробовать с этим

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

OR

    render() {
          return (
              <React.Fragment>
                   <Customers />
                   <Route path={'/customer/:id'} component={Customer} />
             </React.Fragment>
           );
      }
person Hemadri Dasari    schedule 13.09.2018
comment
Спасибо. Я пробовал это с одинарными и двойными кавычками, с фигурными скобками и без них, все та же ошибка. Обратите внимание, что если я удалю тег Route, страница будет отображаться нормально. - person Fernando; 13.09.2018
comment
Похоже, проблема связана с компонентом клиента: либо он не импортируется должным образом, либо не экспортируется. - person Hemadri Dasari; 13.09.2018
comment
Вы используете React-Router-Redux? - person Hemadri Dasari; 13.09.2018
comment
Я не использую response-router-Redux. Кроме того, я только что обновил очень простой маршрут и все еще получаю ошибку. Спасибо. - person Fernando; 13.09.2018

Похоже, у вас есть синтаксическая ошибка в методе render() компонента Customer, которая будет вызывать проблемы при попытке использовать / визуализировать это.

Попробуйте следующее исправление:

export default class Customer extends Component {
    render() {
        return (<p> Customer</p>); // <-- remove the whitespace in 
                                   //     closing tag </p> like so
    };
}
person Dacre Denny    schedule 13.09.2018
comment
По-прежнему та же ошибка после удаления пробела. Спасибо за вклад. Обратите внимание, что если я удалю тег Route, страница будет отображаться нормально. - person Fernando; 13.09.2018
comment
какую версию react, react-dom и response-router-dom вы используете? - person Dacre Denny; 13.09.2018
comment
реагировать: ^ 16.5.0, реагировать-дом: ^ 16.5.0, реагировать-маршрутизатор-дом: ^ 4.3.1 - person Fernando; 13.09.2018