Не удается заставить работать React Router 4 Link

Вот код компонента, в котором возникает проблема:

    import React, { Component } from 'react';
    import { connect } from 'react-redux';
    import { Redirect, Link, withRouter } from 'react-router-dom'
    import * as actions from 'actions';

    class DashBoard extends Component {
        constructor(props) {
            super(props);
        }
        componentDidMount() {
            this.props.dispatch(actions.deleteItems());
            this.props.dispatch(actions.fetchItems());
        }
        render() {
            let { items } = this.props;
            let key = 0;
            let renderItems = () => {
                if (!items) {
                    return
                }
                return items.map((item) => {
                    let { action, author } = item.logs[item.logs.length - 1];
                    return (
                        <div className="dashboard-item">
                            <h3>{item.name}</h3>
                            <div className="info-container">
                                <span>Amount: {item.number}</span>
                                <span>{item.state}</span>
                            </div>
                            <span className="created">{`${action} by ${author}`}</span>
                            <span className="last-log">{`Last log: ${item.logs[0].action} by ${item.logs[0].author}`}</span>
                            <div className="buttons">
                                <Link to='/'>Edit</Link>
                                <Link to={`/items/${item.id}/edit`}>Delete</Link>
                            </div>
                        </div>
                    );
                })
            }

            if (this.props.auth.token) {
                return (
                    <div className="dashboard-container">
                        {renderItems()}
                    </div>
                );
            } else {
                this.props.dispatch(actions.setError('You must log in.'))
                return <Redirect to='/' />
            }
        }
    }

    export default withRouter(connect(
        (state) => {
            return state;
        }

)(DashBoard));

У меня работает перенаправление, но нажатие на ссылку просто меняет URL-адрес в браузере, и на самом деле я все еще вижу компонент панели инструментов. Если я ввожу localhost:3000/items/random id/edit, я получаю правильный результат. Создание и переход по ссылке ничего не дает. Визуально ничего не меняется, кроме адресной строки. Взлом withRouter, похоже, у меня не работает. Однако ввод URL напрямую работает. Как я могу это исправить?

РЕДАКТИРОВАТЬ: определение маршрута

import React, { Component } from 'react';
import { Route, Link } from 'react-router-dom';
import { connect } from 'react-redux';
import Home from 'Home';
import Dashboard from 'Dashboard';
import EditItemForm from 'EditItemForm';
import NewItemForm from 'NewItemForm';

export class Main extends Component {
    constructor(props) {
        super(props);
    }
    render() {
        let { auth, error } = this.props;
        let renderError = () => {
            if (error) {
                return (
                    <div className="error">
                        <p>{error}</p>
                    </div>
                )
            } else {
                return (<div></div>)
            }
        }
        return (
            <div>
                {renderError()}
                <Route exact={true} path="/" component={Home} />
                <Route path="/dashboard" component={Dashboard} />
                <Route path="/items/:id/edit" component={EditItemForm} />
                <Route path="/items/new" component={NewItemForm}/>
            </div>
        );
    }
}

export default connect(
    (state) => {
        return state;
    }
)(Main);

РЕДАКТИРОВАТЬ № 2: Выяснилось, что нажатие на ссылку даже не меняет имя пути в маршруте> местоположение> имя пути, если посмотреть в React DevTools


person Roman Sarder    schedule 08.05.2017    source источник
comment
Вы проверили, существует ли более одного маршрута, соответствующего URL-адресу? Если вы переходите с React-Router v3.x, вы должны изменить способ сопоставления URL-адресов.   -  person Facundo La Rocca    schedule 08.05.2017
comment
Вы используете BrowserRouter или только Router?   -  person Ilya Lopukhin    schedule 08.05.2017
comment
@Syberic, я отредактировал свой пост и добавил основной компонент, в котором определены все маршруты.   -  person Roman Sarder    schedule 08.05.2017
comment
@FacundoLaRocca, я не уверен, что понял, о чем ты говоришь ;(   -  person Roman Sarder    schedule 08.05.2017
comment
Попробуйте поставить несколько точек останова на свои компоненты, я предполагаю, что Dashboard и Home соответствуют URL-адресу, поэтому, если я прав, вы должны увидеть, что Home и Dashboard отображаются.   -  person Facundo La Rocca    schedule 08.05.2017
comment
@FacundoLaRocca, я поставил хук componentWillMount на оба, и после нажатия на ссылку никто не срабатывает. Прямой ввод URL-адреса, который я хочу связать для работы с помоями, работает.   -  person Roman Sarder    schedule 08.05.2017
comment
@RomanSarder Можете ли вы опубликовать компонент Main / App / Base, где появляется ваш маршрутизатор, пожалуйста?   -  person Ilya Lopukhin    schedule 09.05.2017
comment
@RomanSarder я не вижу там настоящего «маршрутизатора», только маршруты   -  person Ilya Lopukhin    schedule 09.05.2017


Ответы (3)


Мне кажется, что в вашем коде нет ничего плохого относительно использования React Router, которое вы показали здесь.

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

Попробуйте сделать поддельный маршрут приветствия и сделать переход с панели управления туда.

Обычно наиболее вероятным, что у вас может быть здесь, является вложенный компонент, который блокирует обновление маршрута. Обычно размещение withRouter в каждом подключенном компоненте должно работать. В качестве альтернативы вы можете попробовать добавить withRouter в каждый компонент, вложенный в маршрут.

Я думаю, что для решения этой проблемы должно быть элегантное объяснение, но, возможно, это поможет вам понять, откуда возникла эта проблема.

Затем попробуйте проверить, поддерживают ли ваши сторонние библиотеки RR4. Удачи!

person piratz    schedule 10.05.2017

Я думаю, что вам может понадобиться использовать переключатель над всеми маршрутами в компоненте, потому что даже у меня была похожая проблема раньше. однако это работает в реагирующем маршрутизаторе v3. Надеюсь, это поможет вам :) ура

React Router 4

Неофициальное руководство по миграции React Router v4

person Leela Venkatesh K    schedule 10.05.2017
comment
В более новых версиях React Router нет Match. - person Roman Sarder; 10.05.2017
comment
@RomanSarder спасибо за это. Я просто пропустил тег версии 4. - person Leela Venkatesh K; 10.05.2017

Поэтому я просто откатился на v3. Спасибо, ребята, за попытку помочь!

person Roman Sarder    schedule 02.06.2017