【问题标题】:Can't get React Router's 4 Link working无法让 React Router 的 4 Link 工作
【发布时间】:2017-05-08 16:08:40
【问题描述】:

出现问题的组件代码如下:

    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 我得到正确的结果。创建和单击链接什么都不做。除了 url 栏,视觉上没有任何变化。 withRouter hack 似乎对我不起作用。但是直接输入 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,发现单击链接甚至不会更改路径 > 位置 > 路径名中的路径名

【问题讨论】:

  • 您是否检查过与 URL 匹配的路由是否不止一个?如果你来自 React-Router v3.x,你必须改变 url 的匹配方式。
  • 你使用 BrowserRouter 还是只使用 Router?
  • @Syberic,我编辑了我的帖子并添加了定义所有路由的主要组件
  • @FacundoLaRocca,我不确定你在说什么;(
  • 尝试在您的组件上放置一些断点,我猜 Dashboard 和 Home 可能与 URL 匹配,所以如果我是对的,您应该会看到 Home 和 Dashboard 正在呈现。

标签: reactjs redux react-router react-router-v4


【解决方案1】:

在我看来,相对于您在此处显示的 React Router 的使用而言,您的代码没有任何问题。

我建议您简化应用程序并发布主路由器组件,这应该没问题,因为您可以看到仪表板,但它会有所帮助。

尝试做一个假的 hello word 路由并从你的仪表板过渡到那里..

通常最有可能的情况是嵌套组件阻止了路由的更新。通常将 withRouter 放在每个连接的组件中应该可以工作。或者,您可以尝试在与路由嵌套的每个组件中添加 withRouter。

我认为应该有一个优雅的原因来解决这个问题,但也许这可以帮助您了解这个问题的根源。

然后尝试检查您的第三方库是否支持 RR4。 祝你好运!

【讨论】:

    【解决方案2】:

    我认为您可能需要在组件中的所有路由之上使用开关,因为即使我之前也遇到过类似的问题。但是,这适用于反应路由器 v3。希望这对你有帮助:) 干杯

    React Router 4

    React Router v4 Unofficial Migration Guide

    【讨论】:

    • 在较新版本的 React Router 中没有 Match。
    • @RomanSarder 对此表示感谢。我只是错过了版本 4 标记。
    【解决方案3】:

    所以我刚刚回滚到 v3。谢谢大家帮忙!

    【讨论】:

      猜你喜欢
      • 2019-11-25
      • 2018-02-25
      • 1970-01-01
      • 2021-01-03
      • 1970-01-01
      • 2016-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多