ไม่สามารถใช้งาน 4 Link ของ React Router ได้

นี่คือรหัสของส่วนประกอบที่เกิดปัญหา:

    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 จะไม่ทำงานสำหรับฉัน อย่างไรก็ตามการป้อน 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 หรือเพียงแค่เราเตอร์?   -  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 ดังนั้นหากฉันพูดถูก คุณจะเห็นหน้าแรกและแดชบอร์ดกำลังแสดงผล   -  person Facundo La Rocca    schedule 08.05.2017
comment
@FacundoLaRocca ฉันใส่ส่วนประกอบ WillMount hook ไว้ทั้งสองอย่างและหลังจากคลิกลิงก์ก็ไม่มีใครทริกเกอร์ พิมพ์ url โดยตรงซึ่งฉันต้องการให้ลิงก์ใช้งานได้กับ swill   -  person Roman Sarder    schedule 08.05.2017
comment
@RomanSarder คุณช่วยโพสต์ส่วนประกอบหลัก / แอพ / ฐานที่เราเตอร์ของคุณปรากฏได้ไหม?   -  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

ฉันคิดว่าคุณอาจต้องใช้สวิตช์เหนือเส้นทางทั้งหมดในส่วนประกอบ เพราะแม้ฉันเคยประสบปัญหาคล้ายกันมาก่อนก็ตาม อย่างไรก็ตามมันใช้งานได้ใน react router v3 หวังว่านี่จะช่วยคุณได้ :) ไชโย

ตอบสนองเราเตอร์ 4

React Router v4 คู่มือการโยกย้ายอย่างไม่เป็นทางการ

person Leela Venkatesh K    schedule 10.05.2017
comment
ใน React Router เวอร์ชันใหม่กว่าจะไม่มีการจับคู่ - person Roman Sarder; 10.05.2017
comment
@RomanSarder ขอบคุณสำหรับสิ่งนั้น ฉันเพิ่งพลาดแท็กเวอร์ชัน 4 - person Leela Venkatesh K; 10.05.2017

ดังนั้นฉันจึงย้อนกลับไปที่ v3 ขอบคุณพวกคุณที่พยายามช่วย!

person Roman Sarder    schedule 02.06.2017