Вы описываете 2 различных типа изменений состояния.
В первом сценарии, когда пользователь B имеет значение , а не на странице /job/:id
, и он щелкает ссылку, вы получаете изменение URL-адреса, которое вызывает изменение состояния в маршрутизаторе и передает его через к вашему компоненту, чтобы вы могли видеть комментарий.
Во втором сценарии, когда пользователь B уже уже находится на странице /job/:id
и поступает новый комментарий, URL-адрес менять не нужно, поэтому нажатие на ссылку не изменится URL и не вызовет изменения состояния в маршрутизаторе, поэтому вы не увидите новый контент.
Возможно, я бы попробовал что-то подобное (псевдокод, потому что я не знаю, как вы получаете новые комментарии или подписываетесь через веб-сокет):
import React from "react";
import ReactDOM from "react-dom";
import { BrowserRouter as Router, Switch, Route } from "react-router-dom";
class Home extends React.Component {
render() {
return (
<div>
<h1>The home page</h1>
{/* This is the link that the user sees when someone makes a new comment */}
<Link to="/job/123">See the new comment!</Link>
</div>
);
}
}
class Job extends React.Component {
state = { comments: [] };
fetchComments() {
// Fetch the comments for this job from the server,
// using the id from the URL.
fetchTheComments(this.props.params.id, comments => {
this.setState({ comments });
});
}
componentDidMount() {
// Fetch the comments once when we first mount.
this.fetchComments();
// Setup a listener (websocket) to listen for more comments. When
// we get a notification, re-fetch the comments.
listenForNotifications(() => {
this.fetchComments();
});
}
render() {
return (
<div>
<h1>Job {this.props.params.id}</h1>
<ul>
{this.state.comments.map(comment => (
<li key={comment.id}>{comment.text}</li>
))}
</ul>
</div>
);
}
}
ReactDOM.render(
<BrowserRouter>
<Switch>
<Route exact path="/" component={Home} />
<Route path="/job/:id" component={Job} />
</Switch>
</BrowserRouter>,
document.getElementById("app")
);
Теперь страница будет обновляться в обоих сценариях.