Если в кратце, проблема возникает из за того что когда заходим на страницу,
текущий урл страницы изначально
http://localhost:3004/tablets/tablet_1
Если мы покликаем по табам (у которых реализован роутинг)
То урл будет менять свое значение например на
http://localhost:3004/tablets/tablet_1/characteristics
И вот, допустим у нас сейчас этот урл и если страница перезагрзиться, то реакт будет считать что текущий урл уже
http://localhost:3004/tablets/tablet_1/characteristics
а не
http://localhost:3004/tablets/tablet_1 как предполагается
И из за этого возникают проблемы
Могут быть вот такие страницы
localhost:3004/tablets/tablet_1/characteristics/
characteristics
А так быть не должно. Подскажите как решить такую проблему
Если подробнее:
Делаю Интернет-магазин на Реакте (в рамках учебного проекта)
На данный момент сделал роуты для нескольких страниц
<Route path="/" ... /> // главная страница
<Route path="/tablets" ... /> // страница категорий
<Route path="/tablets/:id" ... /> // детальная страница товара
И это все работает хорошо
Проблема с роутингом началась когда я начал делать табы на детальной странице товара. Их я тоже хотел сделать через роутинг.
<Route path="/tablets/:id/characteristics" ... />
<Route path="/tablets/:id/opinion" ... />
<Route path="/tablets/:id" ... /> // по дефолту
Пути у табов:
to=`${ текущий урл страницы }/characteristics` // Таб "Характеристки"
to=`${ текущий урл страницы }/opinion` // Таб Отзывы
to=`${ текущий урл страницы }` // Таб "Описание" (по дефолту)
http://skrinshoter.ru/s/221019/1f36Q0Gw
И это работает исправно, до тех пор пока страница не перезагрузиться.
Прикол в том, что если мы кликали по табам, урл менялся и допустим стал таким :
Код:
|
http://localhost:3004/tablets/tablet_1/characteristics |
И потом вдруг страницу перезагрузили
А при перезагрузке страницы текущий адрес получается уже
Код:
|
http://localhost:3004/tablets/tablet_1/characteristics |
а не
Код:
|
http://localhost:3004/tablets/tablet_1 |
как задумывалось.
Из-за этого возникают проблемы когда кликаешь по табам:
адрес получается уже
http://localhost:3004/tablets/tablet...cteristics</b>
http://skrinshoter.ru/s/221019/eTe8ZW5F
Вот в этом и проблема. Как такое решить?
Дело в том что location.pathname я передаю через props дочернему компоненту, он принимает его и в state я добавляю ему
`${ this.props.pathName }/characteristics`
Вот код, как это выглядит:
class App extends Component {
render() {
<Switch>
<Route path="/" exact={true} component={ CategoriesList }/>
<Route path="/tablets/:id/characteristics"
render={ ({ match, location }) => {
const { id } = match.params;
return <DetailPage itemId={ id } currentTab="characteristics" pathName={ location.pathname } />
}}/>
<Route path="/tablets/:id/opinion"
render={ ({ match, location }) => {
const { id } = match.params;
return <DetailPage itemId={ id } currentTab="opinion" pathName={ location.pathname } />
}}/>
<Route path="/tablets/:id"
render={ ({ match, location }) => {
const { id } = match.params;
return <DetailPage itemId={ id } currentTab="description" pathName={ location.pathname } />
}}/>
<Route path="/tablets"
render={({ location }) =>
<CategoryPage
goodList={goodsList.tablets}
title="Tablets"
location={ location }
exact={true}
/>}
/>
</Switch>
}
}
class DetailPage extends Component {
state = {
tabs: {
opinion: {
tabId: 'opinionTab',
tabTitle: 'Отзывы',
tabPathTo: `${ this.props.pathName }/opinion`,
tabContent: 'Контент отзывов'
},
characteristics: {
tabId: 'characteristicsTab',
tabTitle: 'Характеристики',
tabPathTo: `${ this.props.pathName }/characteristics`,
tabContent: 'Контент Характеристик'
},
description: {
tabId: 'descriptionTab',
tabTitle: 'Описание',
tabPathTo: `${ this.props.pathName }`,
tabContent: 'Контент описания'
}
}
};
findCurrentGood(goodsList, itemId) {
for (let key in goodsList) {
goodsList[key].forEach(category => {
if (category.id === itemId) {
this.currentGood = category
}
})
}
}
findCurrentTab() {
for (let key in this.state.tabs) {
if (key === this.props.currentTab) {
this.activeTab = this.state.tabs[key];
}
}
}
render() {
const { goodsList, itemId, currentTab, pathName } = this.props;
const { tabs } = this.state;
this.findCurrentGood(goodsList, itemId);
this.findCurrentTab();
return() {
<div className="tabs">
<div className="tabs__menu">
{
Object.keys(tabs).map(tab => {
const tabClass = classNames('tabs__link', {
'tabs__link--active' : tab === currentTab
});
return (
<Link key={ tabs[tab].tabId }
to={ tabs[tab].tabPathTo }
className={ tabClass } >
{ tabs[tab].tabTitle }
</Link>
)
})
}
</div>
<div className="tabs__content">
<h3 className="info__title">{ this.activeTab.tabTitle }</h3>
<div className="info__text">
{ this.activeTab.tabContent }
</div>
</div>
</div>
}
}
}