React Router Pass Param для компонента
const rootEl = document.getElementById('root');
ReactDOM.render(
<BrowserRouter>
<Switch>
<Route exact path="/">
<MasterPage />
</Route>
<Route exact path="/details/:id" >
<DetailsPage />
</Route>
</Switch>
</BrowserRouter>,
rootEl
);
Я пытаюсь получить доступ к id в компоненте DetailPage, но он недоступен. Я попробовал
<DetailsPage foo={this.props}/>
передать параметры в DetailsPage, но напрасно.
export default class DetailsPage extends Component {
constructor(props) {
super(props);
}
render() {
return (
<div className="page">
<Header />
<div id="mainContentContainer" >
</div>
</div>
);
}
}
Итак, любая идея о том, как передать идентификатор в DetailsPage?
Ответы
Ответ 1
Если вы хотите передать реквизиты компоненту внутри маршрута, самый простой способ - использовать render
, например:
<Route exact path="/details/:id" render={(props) => <DetailsPage globalStore={globalStore} {...props} /> } />
Вы можете получить доступ к реквизитам внутри DetailPage
, используя:
this.props.match
this.props.globalStore
{...props}
необходимо передать оригинальные реквизиты Route, иначе вы получите this.props.globalStore
внутри DetailPage
.
Ответ 2
Я использовал это для доступа к ID в моем компоненте:
<Route path="/details/:id" component={DetailsPage}/>
И в деталях:
export default class DetailsPage extends Component {
render() {
return(
<div>
<h2>{this.props.match.params.id}</h2>
</div>
)
}
}
Это сделает любой идентификатор внутри h2, надеюсь, что это поможет кому-то.
Ответ 3
Использовать метод render:
<Route exact path="/details/:id" render={(props)=>{
<DetailsPage id={props.match.params.id}/>
}} />
И вы должны иметь доступ к id с помощью:
this.props.id
Внутри компонента DetailsPage
Ответ 4
Используйте компонент:
<Route exact path="/details/:id" component={DetailsPage} />
И вы должны иметь доступ к id
, используя:
this.props.match.params.id
Внутри компонента DetailsPage
Ответ 5
Другое решение состоит в использовании хуков состояния и жизненного цикла в перенаправленном компоненте и оператора поиска в свойстве to
компонента <Link />
. Параметры поиска могут быть позже доступны через new URLSearchParams()
;
<Link
key={id}
to={{
pathname: this.props.match.url + '/' + foo,
search: '?foo=' + foo
}} />
<Route path="/details/:foo" component={DetailsPage}/>
export default class DetailsPage extends Component {
state = {
foo: ''
}
componentDidMount () {
this.parseQueryParams();
}
componentDidUpdate() {
this.parseQueryParams();
}
parseQueryParams () {
const query = new URLSearchParams(this.props.location.search);
for (let param of query.entries()) {
if (this.state.foo!== param[1]) {
this.setState({foo: param[1]});
}
}
}
render() {
return(
<div>
<h2>{this.state.foo}</h2>
</div>
)
}
}
Ответ 6
В дополнение к ответу Александра Лунаса...
Если вы хотите добавить более одного аргумента, просто используйте:
<Route path="/details/:id/:title" component={DetailsPage}/>
export default class DetailsPage extends Component {
render() {
return(
<div>
<h2>{this.props.match.params.id}</h2>
<h3>{this.props.match.params.title}</h3>
</div>
)
}
}
Ответ 7
Здесь машинописная версия. работает над "react-router-dom": "^4.3.1"
export const AppRouter: React.StatelessComponent = () => {
return (
<BrowserRouter>
<Switch>
<Route exact path="/problem/:problemId" render={props => <ProblemPage {...props.match.params} />} />
<Route path="/" exact component={App} />
</Switch>
</BrowserRouter>
);
};
и компонент
export class ProblemPage extends React.Component<ProblemRouteTokens> {
public render(): JSX.Element {
return (<div>{this.props.problemId}</div>);
}
}
где ProblemRouteTokens
интерфейс экспорта ProblemRouteTokens { problemId: строка; }
Ответ 8
Начиная с реакции-маршрутизатора v5.1 с крючками:
import { useParams } from 'react-router';
export default function DetailsPage() {
const { id } = useParams();
}
См https://reacttraining.com/blog/react-router-v5-1/