Я вижу, вы установили здесь состояние:
<Link
className="dropdown-item"
to="/exhibition/about-the-venue"
state={{ choice: 'Exhibition' }}>
About the Venue
</Link>
Но window.history.state
заполняется только тогда, когда пользователь уже нажал на ссылку. Так что при первой загрузке его там не будет. Кроме того, вы можете столкнуться с проблемой во время gatsby build
, так как объект window
там недоступен.
Вы можете добавить нулевую проверку:
const getHistoryState = (prop) => {
if (typeof window === 'undefined') return
if (!window.history.state) return
return window.history.state[prop]
}
<div className={`dropdown nav-link pb-md-3 ${getHistoryState(choice) === 'Exhibition' && 'active'}`}>
Или установить это свойство глобально:
// gatsby-browser.js
export const onClientEntry = () => {
window.history.pushState({ choice: '...' }, '')
}
Вам все равно нужно проверить окно, прежде чем использовать window.history...
в своем компоненте.
Чтобы полностью избежать проверки окна, используйте объект location
, передаваемый reach-router
компонентам страницы, например:
// src/index.js
export default const IndexPage = ({ location }) => (
<NavBar location={location} />
)
// NavBar.js
const NavBar = ({ location }) => (
<div className={`class name here ${location.state && location.state.choice && 'active'}`} />
)