#javascript #reactjs #react-router #react-router-dom
#JavaScript #reactjs #реагировать-маршрутизатор #react-router-dom
Вопрос:
Я использую « Link
» в своем компоненте для навигации и передачи соответствующих данных через реквизиты другому компоненту. Ниже приведен основной компонент, AllSuppliers
который использует ссылку для перехода к EditSupplier
компоненту.
import React,{useEffect,useState} from 'react'
import axios from 'axios';
import { BrowserRouter as Router, Route, Link } from "react-router-dom";
import { EditSupplier } from "./EditSupplier";
function AllSuppliers() {
const [suppliers, setstate] = useState([])
useEffect(() => {
axios.get('http://localhost:62815/api/values/GetAllSuppliers')
.then(x => {
setstate(x.data)
}
)
.catch(error => {
alert(error);
});;
},[]);
return (
<>
<table style={{width: '50%'}}>
<thead>
<tr>
<th>
Supplier Id
</th>
<th>
Supplier Name
</th>
<th>
Edit
</th>
</tr>
</thead>
{
suppliers.map((supplier)=> {
return <tr>
<td>
{supplier.sup_Id}
</td>
<td>
{supplier.sup_ShortCode}
</td>
<td>
<Router>
<Link to={{ pathname: '/EditSupplier', supplierProps: { name: 'bar'} }}>Edit</Link>
</Router>
</td>
</tr>
})
}
</table>
</>
)
}
export default AllSuppliers
При нажатии на ссылку редактирования компонент не переходит. Меняется только URL-адрес браузера.
Как видно на изображении, изменяется только URL-адрес браузера, но не может видеть содержимое EditSuppliers
. Содержимое изображения взято из AllSuppliers
компонента. В чем может быть причина?
РЕДАКТИРОВАТЬ 1 :-
Я попытался обернуть свое приложение с помощью маршрутизатора в App.js как —
import './App.css';
import AllSuppliers from './Components/AllSuppliers'
import { BrowserRouter as Router, Route, Link } from "react-router-dom";
function App() {
return (
<div className="App">
<Router>
<AllSuppliers></AllSuppliers>
</Router>
</div>
);
}
export default App;
Я наблюдал такое же поведение.
Также я попытался обернуть маршрутизатор внутри AllSuppliers
— до и после <table> </table>
Я наблюдал такое же поведение и в этом случае.
Правка 2 :-
AllSuppliers.Js
import React,{useEffect,useState} from 'react'
import axios from 'axios';
import { BrowserRouter as Router, Route, Link } from "react-router-dom";
import { EditSupplier } from "./EditSupplier";
function AllSuppliers() {
const [suppliers, setstate] = useState([])
useEffect(() => {
axios.get('http://localhost:62815/api/values/GetAllSuppliers')
.then(x => {
setstate(x.data)
}
)
.catch(error => {
alert(error);
});;
},[]);
return (
<>
<table style={{width: '50%'}}>
<thead>
<tr>
<th>
Supplier Id
</th>
<th>
Supplier Name
</th>
<th>
Edit
</th>
</tr>
</thead>
{
suppliers.map((supplier)=> {
return <tr>
<td>
{supplier.sup_Id}
</td>
<td>
{supplier.sup_ShortCode}
</td>
<td>
<Link to={{ pathname: '/EditSupplier', supplierProps: { name: 'bar'} }}>Edit</Link>
</td>
</tr>
})
}
</table>
</>
)
}
export default AllSuppliers
Комментарии:
1. Где
AllSuppliers
отображается по отношению к вашему основномуRouter
?2. AllSuppliers отображается непосредственно из App.js
Ответ №1:
Проблема
При отображении каждой ссылки вы переводите каждую ссылку в свой собственный Router
контекст supplier
.
suppliers.map((supplier)=> {
return (
<tr>
<td>{supplier.sup_Id}</td>
<td>{supplier.sup_ShortCode}</td>
<td>
<Router> // <-- router context
<Link
to={{
pathname: '/EditSupplier',
supplierProps: {
name: 'bar',
},
}}
>
Edit
</Link>
</Router>
</td>
</tr>
);
})
Проблема здесь в том, что каждый Link
из них будет использовать контекст маршрутизации ближайшего Router
над ним в ReactTree, поэтому вы увидите изменение URL в адресной строке, но Router
обработка всех маршрутов вашего приложения не обновляется.
Похоже, вам также не хватает какой-либо фактической маршрутизации в вашем приложении.
function App() {
return (
<div className="App">
<Router>
<AllSuppliers></AllSuppliers>
</Router>
</div>
);
}
Решение
Удалите посторонние Router
компоненты. Просто убедитесь, что существует хотя бы одна Router
оболочка вашего приложения для предоставления контекста маршрутизации.
suppliers.map((supplier)=> {
return (
<tr>
<td>{supplier.sup_Id}</td>
<td>{supplier.sup_ShortCode}</td>
<td>
<Link
to={{
pathname: '/EditSupplier',
supplierProps: {
name: 'bar',
},
}}
>
Edit
</Link>
</td>
</tr>
);
})
Определите маршруты для отображения вашего приложения.
function App() {
return (
<div className="App">
<Router>
<Switch>
<Route path="/EditSupplier" component={EditSupplier} />
<Route path="/" component={AllSuppliers} />
</Switch>
</Router>
</div>
);
}
Комментарии:
1. Не могли бы вы взглянуть на Edit1 , где я удалил маршрутизатор из каждой ссылки и разместил его снаружи. Но я наблюдаю такое же поведение.
2. @CSharper
Router
переносApp
илиAllSuppliers
был бы правильным. Вы удалили всеRouter
компоненты, обертывающие каждыйLink
из них? Вам действительно нужен только одинRouter
для всего приложения.3. Да, я удалил. В Edit2 я вставил измененные AllSuppliers.js
4. @CSharper где ваш основной
Router
, где определены вашиRoute
компоненты? Если у вас нет маршрутов, то никакое количествоLink
s не заставит что-либо еще отображать.
Ответ №2:
Прежде всего, вы должны настроить routes
app.js
. Тогда будет работать только ваша ссылка
import './App.css';
import AllSuppliers from './Components/AllSuppliers'
import { EditSupplier } from "./Components/EditSupplier";
import { BrowserRouter as Router, Route, Link ,Switch} from "react-router-dom";
function App() {
return (
<div className="App">
<Router>
<Switch>
<Route exact path='/' component={AllSuppliers} />
<Route exact path='/EditSupplier' component={EditSupplier} />
</Switch>
</Router>
</div>
);
}
export default App;
В вашем коде
<Router>
<AllSuppliers></AllSuppliers>
</Router>
Вы просто визуализируете один компонент AllSuppliers
. Всякий раз, когда изменяется маршрут, вы увидите только AllSuppliers