Reputation: 643
I have setup gatsby project using this link. It is working correctly.
Now I know how to create route by defining the component inside the pages
folder. But now I have a new challenge I need to create one dynamic route so that I can pass my id
in it (Just like reactjs
).
<Route path: "/path/:id"/>
How do I do that in gatsby?
Upvotes: 29
Views: 24742
Reputation: 121
This answer is Super late, but for anyone in the future who is faced with this problem, I have a simpler solution.
In Gatsby terms it's called a Splat Route.
For examples, If you want some page "domain.com/profile/[id]", where id can be any number, which will be used to display different data inside the website, you should name your page as [...id].
Now inside the page you can access this id as
const ProfilePage = (props) => <div>This page is for id number {props.params.id}</div>
Note: Don't miss the 3 dots, that is what signifies a splat route in gatsby.
Upvotes: 2
Reputation: 170
You can use square brackets ([ ])
in the file path to mark any dynamic segments of the URL. For example, in order to edit a user, you might want a route like /user/:id
to fetch the data for whatever id is passed into the URL.
src/pages/users/[id].js
will generate a route like /users/:id
src/pages/users/[id]/group/[groupId].js
will generate a route like /users/:id/group/:groupId
Reference: https://www.gatsbyjs.com/docs/reference/routing/file-system-route-api#creating-client-only-routes
Upvotes: 8
Reputation: 6822
You have to explicitly tell gatsby that a path should be dynamic. From the docs:
// gatsby-node.js
// Implement the Gatsby API “onCreatePage”. This is
// called after every page is created.
exports.onCreatePage = async ({ page, actions }) => {
const { createPage } = actions
// page.matchPath is a special key that's used for matching pages
// only on the client.
if (page.path.match(/^\/app/)) {
page.matchPath = "/app/*"
// Update the page.
createPage(page)
}
}
and then you can use dynamic routing in src/pages/app.js
import { Router } from "@reach/router"
const SomeSubPage = props => {
return <div>Hi from SubPage with id: {props.id}</div>
}
const App = () => (
<Layout>
<Link to="/app/1">First item</Link>{" "}
<Link to="/app/2">Second item</Link>{" "}
<Router>
// ...dynamic routes here
<SomeSubPage path="/app/:id" />
</Router>
</Layout>
)
export default App
Everything that goes to /app/*
will be handled dynamically now. You should find your id as usual in the props.
Have a look at their authentication example https://github.com/gatsbyjs/gatsby/tree/master/examples/simple-auth
Upvotes: 43
Reputation: 1680
You can use gatsby-plugin-create-client-paths
. It uses matchPath
. For more info check
Upvotes: 4