'Why do I have to manually refresh the page for the component to load when using react-router?
I have a React application that uses react-router-dom to load different components from the sidebar. Whenever I click the link in the sidebar, the URL changes, but I must manually refresh the page to get the actual content of the page to load.
I want my application to automatically refresh the page when a sidebar link is clicked instead of the user having to manually refresh the page in order for a component to load.
function App() {
const [locale, setLocale] = useState('en');
return (
<>
<Routes>
<Route path="/" element={<IntlProvider locale={locale}><Layout setLocale={setLocale} /></IntlProvider>}>
<Route index element={<Home />} />
<Route path="experience" element={<Experience />} />
<Route path="skills" element={<Skills />} />
<Route path="portfolio" element={<Portfolio />} />
<Route path="contact" element={<Contact />} />
</Route>
</Routes>
</>
);
}
export default App;
This is my App.js
const Sidebar = ({ toggled, handleToggleSidebar }) => {
const intl = useIntl();
return (
<ProSidebar
toggled={toggled}
breakPoint="md"
onToggle={handleToggleSidebar}
>
<SidebarHeader>
<div
style={{
padding: '24px',
textTransform: 'uppercase',
fontWeight: 'bold',
fontSize: 14,
letterSpacing: '1px',
overflow: 'hidden',
textOverflow: 'ellipsis',
whiteSpace: 'nowrap',
}}
>
<Link style={{ display: 'block', padding: '15px 0' }} to="/">
<img style={{ display: 'block', margin: '-3em 3em', width: '133px', height: 'auto' }} src={LogoS} alt="Logo" />
</Link>
</div>
</SidebarHeader>
<SidebarContent>
<Menu iconShape="circle">
<MenuItem icon={<FaHome size={32} />}>
{intl.formatMessage({ id: 'Home' })}
<NavLink activeclassname="active" to="/"></NavLink>
</MenuItem>
<MenuItem icon={<FaProjectDiagram size={32} />}>
{intl.formatMessage({ id: 'Experience' })}
<NavLink to="/experience"></NavLink>
</MenuItem>
<MenuItem icon={<FaToolbox size={32} />}>
{intl.formatMessage({ id: 'Skills' })}
<NavLink to="/skills"></NavLink>
</MenuItem>
<MenuItem icon={<FaFolderOpen size={32} />}>
{intl.formatMessage({ id: 'Portfolio' })}
<NavLink to="/portfolio"></NavLink>
</MenuItem>
<MenuItem icon={<FaTelegramPlane size={32} />}>
{intl.formatMessage({ id: 'Contact' })}
<NavLink to="/contact"></NavLink>
</MenuItem>
</Menu>
</SidebarContent>
</ProSidebar >
);
};
export default Sidebar;
This is my Sidebar.js
function Layout({ setLocale }) {
const [rtl, setRtl] = useState(false);
const [collapsed, setCollapsed] = useState(false);
const [image, setImage] = useState(true);
const [toggled, setToggled] = useState(false);
const handleCollapsedChange = (checked) => {
setCollapsed(checked);
};
const handleRtlChange = (checked) => {
setRtl(checked);
setLocale(checked ? 'ar' : 'en');
};
const handleImageChange = (checked) => {
setImage(checked);
};
const handleToggleSidebar = (value) => {
setToggled(value);
};
return (
<div className={`app ${rtl ? 'rtl' : ''} ${toggled ? 'toggled' : ''}`}>
<Sidebar
image={image}
collapsed={collapsed}
rtl={rtl}
toggled={toggled}
handleToggleSidebar={handleToggleSidebar}
/>
<Main
image={image}
toggled={toggled}
collapsed={collapsed}
rtl={rtl}
handleToggleSidebar={handleToggleSidebar}
handleCollapsedChange={handleCollapsedChange}
handleRtlChange={handleRtlChange}
handleImageChange={handleImageChange}
/>
<Outlet />
</div>
);
}
export default Layout;
This is the Layout.js that renders the page.
const Contact = () => {
const [letterClass, setLetterClass] = useState('text-animate')
const form = useRef()
useEffect(() => {
return setTimeout(() => {
setLetterClass('text-animate-hover')
}, 3000)
}, [])
const sendEmail = (e) => {
e.preventDefault()
emailjs
.sendForm(
'service_v8uv1al',
'template_xge6tgj',
form.current,
'UuX3z3S-mWAnAL7BY')
.then(
() => {
alert('Message successfully sent!')
window.location.reload(false)
},
() => {
alert('Failed to send the message, please try again')
}
)
}
return (
<>
<div className="container contact-page">
<div className="text-zone">
<h1>
<AnimatedLetters
letterClass={letterClass}
strArray={['C', 'o', 'n', 't', 'a', 'c', 't', ' ', 'm', 'e']}
idx={15}
/>
</h1>
<div className='app_footer-cards'>
<div className='app_footer-card'>
<img src={emailLogo} alt="email" />
<a href="mailto:[email protected]" className='p-text'>[email protected]</a>
</div>
<div className='app_footer-card'>
<img src={phoneLogo} alt="mobile" />
<a href="tel: +1 (832) 764-9796" className='p-text'>+1 (832) 764-9796</a>
</div>
</div>
<p>
If you have a request or question, or simply just want to
say Hello don't hesitate to contact me using the form below!
</p>
<div className="contact-form">
<form ref={form} onSubmit={sendEmail}>
<ul>
<li className="half">
<input placeholder="Name" type="text" name="name" required />
</li>
<li className="half">
<input
placeholder="Email"
type="email"
name="email"
required
/>
</li>
<li>
<input
placeholder="Subject"
type="text"
name="subject"
required
/>
</li>
<li>
<textarea
placeholder="Message"
name="message"
required
></textarea>
</li>
<li>
<input type="submit" className="flat-button" value="SEND" />
</li>
</ul>
</form>
</div>
</div>
</div>
<Loader type="ball-scale" />
</>
)
}
export default Contact
Contact Page Code
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
