Использование <Link to="/projects/some-project-slug" />
действительно меняет URL в браузере, но приложение не меняет его отображение.
Вот приложение:
import React from 'react';
import { Router } from "@reach/router"
import HeaderNavItems from '../../constants/header-nav-items';
import Header from '../header/header';
import Footer from '../footer/footer';
import AboutView from '../../views/about/about-view';
import NotFoundView from '../../views/not-found/not-found-view';
import ProjectDetailsView from '../../views/project-details/projects-details-view';
import ProjectsIndexView from '../../views/projects-index/projects-index-view';
import config from '../../config.json';
import './app.scss';
const App = () => {
const { common } = config;
// component
return <div className="app">
<Header
heading={ common.heading }
subheading={ common.subheading }
navItems={ HeaderNavItems }
/>
<Router>
<ProjectsIndexView path='/' />
<ProjectsIndexView path='/projects' />
<ProjectDetailsView path='/projects/:projectSlug' />
<AboutView path='/about' />
<NotFoundView default />
</Router>
<Footer
heading={ common.heading }
subheading={ common.subheading }
/>
</div>
};
export default App;
А вот компонент содержит <Link/>
(который создается в <ProjectsIndexView/>
):
import React from 'react';
import { Link } from '@reach/router';
import themeModel from '../../models/ThemeModel';
import './project-teaser.scss';
const ProjectTeaser = (props) => {
const render = () => (
<Link
className={ `project-teaser ${themeModel.current}` }
to={ props.href }
>
<img
className="image"
src={ props.imageSource }
alt=""
/>
<div className="project-name">
{ props.name }
</div>
</Link>
);
return render();
}
export default ProjectTeaser;
URL-адрес в props.href
правильный. Если я обновлю sh браузер по URL-адресу, на который перенаправлен, то будет работать только представление. Я пытаюсь убедиться, что НЕ требуется страница refre sh.
Мне нужно, чтобы и /
, и /projects
использовали один и тот же компонент, так как я не хочу, чтобы посетители добавлялись к <NotFound/>
на случай, если они go на /projects
напрямую.
Эта проблема показалась похожей, однако они вызывают перенаправление в коде, тогда как я использую <Link/>
.
Будем благодарны за любые указания и уважительные ответы.
ОБНОВЛЕНИЕ
Компонент <ProjectTeaser/>
определен во внешней библиотеке. Есть 3-4 проекта, использующих этот компонент. Ради интереса я попытался скопировать определение компонента в тот же проект, который его использует, а это означало, что он больше не был импортирован из внешней библиотеки.
И теперь маршрутизация работает.
Может кто-нибудь объясните мне, как это происходит? Это тот же код! Просто расположены в разных проектах. Единственное отличие, которое я вижу, состоит в том, что версия библиотеки предварительно скомпилирована.
Однако, если это работает, как ожидает библиотека @ reach / router, это очень неудобно, так как я пытаюсь избежать копирования <ProjectTeaser/>
определение в каждом проекте, который нуждается в этом.