diff --git a/docs/docs/gatsby-link.md b/docs/docs/gatsby-link.md index afd8acdfc2d5b..f24ca64b4726c 100644 --- a/docs/docs/gatsby-link.md +++ b/docs/docs/gatsby-link.md @@ -249,6 +249,8 @@ const Form = () => ( ) ``` +Then from the receiving page you can access the `location` state as demonstrated in [Pass state as props to the linked page](#pass-state-as-props-to-the-linked-page). + ### Replace history during programmatic navigation If the navigation should replace history instead of pushing a new entry into the navigation history, add the `replace` prop with a value of `true` to the `options` argument of `navigate`. @@ -390,4 +392,5 @@ onClick = () => { ## Additional resources - [Authentication tutorial for client-only routes](/tutorial/authentication-tutorial/) +- [Routing: Getting Location Data from Props](/docs/location-data-from-props/) - [`gatsby-plugin-catch-links`](https://www.gatsbyjs.org/packages/gatsby-plugin-catch-links/) to automatically intercept local links in Markdown files for `gatsby-link` like behavior diff --git a/docs/docs/location-data-from-props.md b/docs/docs/location-data-from-props.md index 15a457b4511c2..31b41d1e30623 100644 --- a/docs/docs/location-data-from-props.md +++ b/docs/docs/location-data-from-props.md @@ -38,9 +38,9 @@ Through client-side routing in Gatsby you can provide a location object instead // but if you want to add some additional state - ``` @@ -64,6 +64,7 @@ The great thing is you can expect the `location` prop to be available to you on ## Other resources +- [Gatsby Link API](/docs/gatsby-link/) - [@reach/router docs](https://reach.tech/router/api/Location) - [react-router location docs](https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/api/location.md) - [Hash Router](https://reacttraining.com/react-router/web/api/HashRouter) diff --git a/packages/gatsby-link/index.d.ts b/packages/gatsby-link/index.d.ts index 88695d7283fa8..795ffa1361ab3 100644 --- a/packages/gatsby-link/index.d.ts +++ b/packages/gatsby-link/index.d.ts @@ -12,6 +12,10 @@ export interface GatsbyLinkProps extends LinkProps { partiallyActive?: boolean /** Used to declare that this link replaces the current URL in history with the target */ replace?: boolean + /** Used to pass state data to the linked page. + * The linked page will have a `location` prop containing a nested `state` object structure containing the passed data. + */ + state?: TState /** The URL you want to link to */ to: string } diff --git a/packages/gatsby-link/src/__tests__/index.js b/packages/gatsby-link/src/__tests__/index.js index 24793275d708b..1bbf0bbdd5eba 100644 --- a/packages/gatsby-link/src/__tests__/index.js +++ b/packages/gatsby-link/src/__tests__/index.js @@ -227,6 +227,18 @@ describe(`navigate`, () => { undefined ) }) + + it(`passes a state object`, () => { + const to = `/some-path` + const options = { state: { myStateKey: `a state value` } } + + getNavigate()(to, options) + + expect(global.___navigate).toHaveBeenCalledWith( + `${global.__BASE_PATH__}${to}`, + options + ) + }) }) describe(`ref forwarding`, () => { @@ -253,3 +265,18 @@ describe(`ref forwarding`, () => { expect(ref.current).toEqual(expect.any(HTMLElement)) }) }) + +describe(`state`, () => { + it(`passes a state object`, () => { + const to = `/` + const state = { myStateKey: `a state value` } + getNavigate() + + const { link } = setup({ linkProps: { state } }) + link.click() + + expect( + global.___navigate + ).toHaveBeenCalledWith(`${global.__BASE_PATH__}${to}`, { state }) + }) +}) diff --git a/packages/gatsby-link/src/index.js b/packages/gatsby-link/src/index.js index ebba62912b3c4..53f7147c7962b 100644 --- a/packages/gatsby-link/src/index.js +++ b/packages/gatsby-link/src/index.js @@ -187,6 +187,7 @@ GatsbyLink.propTypes = { onClick: PropTypes.func, to: PropTypes.string.isRequired, replace: PropTypes.bool, + state: PropTypes.object, } const showDeprecationWarning = (functionName, altFunctionName, version) =>