Basic
Is it possible to have multiple “#” in a url?
http://www.example.com/hey#foo#bar
http://www.example.com/hey#foo#bar
http://www.example.com/hey#foo#bar
which is the same window.location.hash for
http://www.example.com/hey#foo%23bar
http://www.example.com/hey#foo%23bar
http://www.example.com/hey#foo%23bar
How to use “react-router”?
How to create a browser router?
import { BrowserRouter, Route, Switch, Redirect } from 'react-router-dom'
const redirectTest = 'users/1' // http://localhost/users/1
const App = () => {
return (
<>
{/* Load page with new path but keeping Header */}
<Header />
{/* CREATE A BROWSER ROUTER */}
<BrowserRouter>
<Switch>
{/* Redirect from root path to a different path */}
<Redirect exact from='/' to={`/${redirectTest}`} />
{/* Render specific component basing on url param}
<Route path='users/:id/' component={renderComponent} />
{/* ... */}
{/* Render 404 page if url doesn't match any format}
<Route component={render404} />
</Switch>
</BrowserRouter>
{/* Load page with new path but keeping Footer */}
<Footer />
</>
)
}
function renderComponent(props: any) {
const { id } = props.match.params
return (
<UserDetail userId={id} />
)
}
function render404(): any {
window.location.href = 'https://www.myhomepage.com/404#/'
return null
}
export default App
import { BrowserRouter, Route, Switch, Redirect } from 'react-router-dom'
const redirectTest = 'users/1' // http://localhost/users/1
const App = () => {
return (
<>
{/* Load page with new path but keeping Header */}
<Header />
{/* CREATE A BROWSER ROUTER */}
<BrowserRouter>
<Switch>
{/* Redirect from root path to a different path */}
<Redirect exact from='/' to={`/${redirectTest}`} />
{/* Render specific component basing on url param}
<Route path='users/:id/' component={renderComponent} />
{/* ... */}
{/* Render 404 page if url doesn't match any format}
<Route component={render404} />
</Switch>
</BrowserRouter>
{/* Load page with new path but keeping Footer */}
<Footer />
</>
)
}
function renderComponent(props: any) {
const { id } = props.match.params
return (
<UserDetail userId={id} />
)
}
function render404(): any {
window.location.href = 'https://www.myhomepage.com/404#/'
return null
}
export default App
import { BrowserRouter, Route, Switch, Redirect } from 'react-router-dom' const redirectTest = 'users/1' // http://localhost/users/1 const App = () => { return ( <> {/* Load page with new path but keeping Header */} <Header /> {/* CREATE A BROWSER ROUTER */} <BrowserRouter> <Switch> {/* Redirect from root path to a different path */} <Redirect exact from='/' to={`/${redirectTest}`} /> {/* Render specific component basing on url param} <Route path='users/:id/' component={renderComponent} /> {/* ... */} {/* Render 404 page if url doesn't match any format} <Route component={render404} /> </Switch> </BrowserRouter> {/* Load page with new path but keeping Footer */} <Footer /> </> ) } function renderComponent(props: any) { const { id } = props.match.params return ( <UserDetail userId={id} /> ) } function render404(): any { window.location.href = 'https://www.myhomepage.com/404#/' return null } export default App
How to pass data to child component?
// Add param inside component
<Route exact path="/details/:id" component={DetailsPage} />
// Add param inside component
<Route exact path="/details/:id" component={DetailsPage} />
// Add param inside component <Route exact path="/details/:id" component={DetailsPage} />
// Access param inside component
props.match.params.id
// Access param inside component
props.match.params.id
// Access param inside component props.match.params.id
or
<Route exact path="/details/:id" render={(props) => (
<DetailsPage id={props.match.params.id}/>
)} />
<Route exact path="/details/:id" render={(props) => (
<DetailsPage id={props.match.params.id}/>
)} />
<Route exact path="/details/:id" render={(props) => ( <DetailsPage id={props.match.params.id}/> )} />
How to access router params anywhere in child components?
import { useParams } from "react-router-dom";
const EditPost = () => {
const params = useParams();
return <p>Your Post ID is: {params.id}</p>
}
export default EditPost;
import { useParams } from "react-router-dom";
const EditPost = () => {
const params = useParams();
return <p>Your Post ID is: {params.id}</p>
}
export default EditPost;
import { useParams } from "react-router-dom"; const EditPost = () => { const params = useParams(); return <p>Your Post ID is: {params.id}</p> } export default EditPost;
How to configure url for tabs?
import { Tab, TabList } from 'react-tabs'
import { Link } from 'react-router-dom'
const TabHeader = ({ tabList }) => {
return (
<TabList>
{tabList.map((element) => {
<Tab>
{/* Tab "users": http://localhost#/users */}
{/* Tab "products": http://localhost#/products */}
<Link to={`#/${element.url}`}>
{element.tabTitle}
</Link>
</Tab>
)
})}
</TabList>
)
}
export default TabHeader
import { Tab, TabList } from 'react-tabs'
import { Link } from 'react-router-dom'
const TabHeader = ({ tabList }) => {
return (
<TabList>
{tabList.map((element) => {
<Tab>
{/* Tab "users": http://localhost#/users */}
{/* Tab "products": http://localhost#/products */}
<Link to={`#/${element.url}`}>
{element.tabTitle}
</Link>
</Tab>
)
})}
</TabList>
)
}
export default TabHeader
import { Tab, TabList } from 'react-tabs' import { Link } from 'react-router-dom' const TabHeader = ({ tabList }) => { return ( <TabList> {tabList.map((element) => { <Tab> {/* Tab "users": http://localhost#/users */} {/* Tab "products": http://localhost#/products */} <Link to={`#/${element.url}`}> {element.tabTitle} </Link> </Tab> ) })} </TabList> ) } export default TabHeader
Others
How to add clickable to the site?
function Navbar() {
return (
<div>
<Link to="/">Home</Link>
<Link to="/about">About Us</Link>
<Link to="/shop">Shop Now</Link>
<Link
to={{
pathname: '/profile',
state: {infoId: info.id},
}}
>Profile</Link>
</div>
);
};
function Navbar() {
return (
<div>
<Link to="/">Home</Link>
<Link to="/about">About Us</Link>
<Link to="/shop">Shop Now</Link>
<Link
to={{
pathname: '/profile',
state: {infoId: info.id},
}}
>Profile</Link>
</div>
);
};
function Navbar() { return ( <div> <Link to="/">Home</Link> <Link to="/about">About Us</Link> <Link to="/shop">Shop Now</Link> <Link to={{ pathname: '/profile', state: {infoId: info.id}, }} >Profile</Link> </div> ); };
// Access state from
props.location.state
// Access state from
props.location.state
// Access state from props.location.state
How to update the url without causing a navigation/reload?
When you declare Route path
// input 2021-08-06/melbourne/race/7/results#/...
<Route path='/:date/:location/' component={renderComponent} />
// input 2021-08-06/melbourne/race/7/results#/...
<Route path='/:date/:location/' component={renderComponent} />
// input 2021-08-06/melbourne/race/7/results#/... <Route path='/:date/:location/' component={renderComponent} />
And you want to update number “7” to “6”
const history = useHistory()
history.push("6")
// output: 2021-08-06/melbourne/race/6/
const history = useHistory()
history.push("6")
// output: 2021-08-06/melbourne/race/6/
const history = useHistory() history.push("6") // output: 2021-08-06/melbourne/race/6/
Leave a Reply