Skip to content
This repository was archived by the owner on Jun 15, 2020. It is now read-only.

Repository files navigation

React URL Query

npm versionBuild Status


Using React Hooks? Check out use-query-params for managing URL query parameters via hooks.

Update 2019-09-13use-query-params has been updated to have a HOC and a render props solution. I recommend using that library for any modern query param problems as it is more likely to be updated.


A library for managing state through query parameters in the URL in React. It integrates well with React Router and Redux and provides additional tools specifically targeted at serializing and deserializing state in URL query parameters. With React URL Query, you can create components where there is no difference in handling state from an external store like Redux and state from the URL.

Motivation

When developing web applications, it's really common to want to encode parts of the state in URL query parameters to capture what users are seeing on screen. Think of things like filters, toggles, selected items, and so on. Storing them in the URL allows users to easily link others to what they are seeing and facilitates discussion. React URL Query makes doing this really easy.

The current set of tools for React does not provide facilities for easy interaction with query parameters.

The fantastic library React Router is the standard for integrating URL changes in React applications and provides us access to the query parameters as an object, but the fields within are always represented as strings-- just as they appear in the URL. This makes sense, but means developers must work to decode the strings into the proper types depending on what is being stored in a given param (e.g. numbers, booleans, arrays, objects). Furthermore, when one wants to update the query parameters in the URL, React Router gives us functions to do so via context.router, but no facilities for encoding our values as strings.

The current front-runner for state management in React app's is Redux. When first dealing with encoding state in URL query parameters, it's common to wonder how to get them in sync with what is in the Redux store. Dan Abramov, Redux's creator, suggests that you don't do that. Instead, he puts forth the idea of decoding the query parameters in the mapStateToProps function (you can look into props.location.query if you're using React Router). However, when it comes to encoding changes to the query parameters back into the URL, we're back to calling router functions directly.

React URL Query is based off the idea that we can have an equivalent to mapStateToProps and mapDispatchToProps (see Redux's Usage with React) but for the URL. In fact, it allows you to provide mapUrlToProps and mapUrlChangeHandlersToProps when configuring components to do just that. You can decode URL query params into props in mapUrlToProps and you can encode them back into params through change handlers in mapUrlChangeHandlersToProps. This means the component code itself doesn't need to be aware of which props are managed by Redux and which props are managed by the URL-- it can just read props and call change handlers, and the application will update appropriately.

There are some very common patterns when encoding and decoding URL query parameters: each parameter has a type and a name in the URL and parameters of a given type should always be encoded or decoded the same way. It's cumbersome and repetitive to always create the map___ToProps functions to handle this common use case, so React URL Query provides a succinct way of describing URL query parameters through its urlPropsQueryConfig. You can just describe the type and names of the query parameters, and the decoded query params along with their change handlers will be passed in as props to the wrapped component.

Check it out below or in the other examples to see how it works.

Installation

npm install --save react-url-query

How do I use it?

A number of examples have been created demonstrating a variety of methods of using the library with different technologies. Here is the most basic form of using it in a component:

importReact,{PureComponent}from'react';importPropTypesfrom'prop-types';import{addUrlProps,UrlQueryParamTypes}from'react-url-query';/** * Specify how the URL gets decoded here. This is an object that takes the prop * name as a key, and a query param specifier as the value. The query param * specifier can have a `type`, indicating how to decode the value from the * URL, and a `queryParam` field that indicates which key in the query * parameters should be read (this defaults to the prop name if not provided). * * Here we specify two props, `bar` and `foo` that correspond to query parameters * `bar` and `fooInUrl` respectively. React URL Query will interpret URLs like * /app?bar=react&fooInUrl=137 and pass the props `{ bar: "react", foo: 137 }` * to the MainPage component. */consturlPropsQueryConfig={bar: {type: UrlQueryParamTypes.string},foo: {type: UrlQueryParamTypes.number,queryParam: 'fooInUrl'},};classMainPageextendsPureComponent{staticpropTypes={// URL props are automatically decoded and passed in based on the configbar: PropTypes.string,foo: PropTypes.number,// change handlers are automatically generated when given a config.// By default they update that single query parameter and maintain existing// values in the other parameters.onChangeFoo: PropTypes.func,onChangeBar: PropTypes.func,}staticdefaultProps={foo: 123,bar: 'bar',}render(){const{ foo, bar, onChangeFoo, onChangeBar }=this.props;return(<div><div>
foo={foo}<buttononClick={()=>onChangeFoo(999)}>Set foo to 999</button></div><div>
bar={bar}<buttononClick={()=>onChangeBar('testing')}>
Set bar to "testing"
</button></div></div>);}}/** * Use the addUrlProps higher-order component to hook-in react-url-query. */exportdefaultaddUrlProps({ urlPropsQueryConfig })(MainPage);

If you prefer, instead of using a urlPropsQueryConfig you can provide the functions mapUrlToProps and mapUrlChangeHandlersToProps, as shown in the basic-mapUrlToProps example.

You'll also need to configure which history to use, typically done wherever you initialize your application. Examples of doing this with different setups are shown in the examples section.

If you are using react-router, how you link in the history depends on the version.

React Router v2

import{configureUrlQuery}from'react-url-query';import{browserHistory}from'react-router'configureUrlQuery({history: browserHistory});

React Router v4

import{RouterToUrlQuery}from'react-url-query';importRouterfrom'react-router/BrowserRouter';ReactDOM.render(<Router><RouterToUrlQuery><App/></RouterToUrlQuery></Router>,document.getElementById('root'));

React Router v5

import{RouterToUrlQuery}from'react-url-query';import{BrowserRouterasRouter,__RouterContextasRouterContext}from'react-router-dom';ReactDOM.render(<Router><RouterToUrlQueryrouterContext={RouterContext}><App/></RouterToUrlQuery></Router>,document.getElementById('root'));

Not using React Router. If you're not using react-router, you'll need to instantiate the history yourself manually:

import{configureUrlQuery}from'react-url-query';importcreateHistoryfrom'history/createBrowserHistory';consthistory=createHistory();configureUrlQuery({ history });

Examples

Development

During development of examples, it can be helpful to have a watch running automatically rebuilding the package when changes take place. To get this running run:

npm run dev

Building

npm run build

Linting

npm run lint

To lint examples, run:

npm run lint:examples

Testing

npm run test

To test examples, run:

npm run test:examples

Working on docs

When editing the docs, it helps to have a dev server watching changes. To do this, run:

npm run docs:watch

To build the docs, run:

npm run docs:build

To publish the docs, run:

npm run docs:publish

License

MIT

About

A library for managing state through query parameters in the URL in React

Topics

Resources

Code of conduct

Stars

193 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - pbeshai/react-url-query: A library for managing state through query parameters in the URL in React · GitHub
Skip to content
This repository was archived by the owner on Jun 15, 2020. It is now read-only.

Repository files navigation

React URL Query

npm versionBuild Status


Using React Hooks? Check out use-query-params for managing URL query parameters via hooks.

Update 2019-09-13use-query-params has been updated to have a HOC and a render props solution. I recommend using that library for any modern query param problems as it is more likely to be updated.


A library for managing state through query parameters in the URL in React. It integrates well with React Router and Redux and provides additional tools specifically targeted at serializing and deserializing state in URL query parameters. With React URL Query, you can create components where there is no difference in handling state from an external store like Redux and state from the URL.

Motivation

When developing web applications, it's really common to want to encode parts of the state in URL query parameters to capture what users are seeing on screen. Think of things like filters, toggles, selected items, and so on. Storing them in the URL allows users to easily link others to what they are seeing and facilitates discussion. React URL Query makes doing this really easy.

The current set of tools for React does not provide facilities for easy interaction with query parameters.

The fantastic library React Router is the standard for integrating URL changes in React applications and provides us access to the query parameters as an object, but the fields within are always represented as strings-- just as they appear in the URL. This makes sense, but means developers must work to decode the strings into the proper types depending on what is being stored in a given param (e.g. numbers, booleans, arrays, objects). Furthermore, when one wants to update the query parameters in the URL, React Router gives us functions to do so via context.router, but no facilities for encoding our values as strings.

The current front-runner for state management in React app's is Redux. When first dealing with encoding state in URL query parameters, it's common to wonder how to get them in sync with what is in the Redux store. Dan Abramov, Redux's creator, suggests that you don't do that. Instead, he puts forth the idea of decoding the query parameters in the mapStateToProps function (you can look into props.location.query if you're using React Router). However, when it comes to encoding changes to the query parameters back into the URL, we're back to calling router functions directly.

React URL Query is based off the idea that we can have an equivalent to mapStateToProps and mapDispatchToProps (see Redux's Usage with React) but for the URL. In fact, it allows you to provide mapUrlToProps and mapUrlChangeHandlersToProps when configuring components to do just that. You can decode URL query params into props in mapUrlToProps and you can encode them back into params through change handlers in mapUrlChangeHandlersToProps. This means the component code itself doesn't need to be aware of which props are managed by Redux and which props are managed by the URL-- it can just read props and call change handlers, and the application will update appropriately.

There are some very common patterns when encoding and decoding URL query parameters: each parameter has a type and a name in the URL and parameters of a given type should always be encoded or decoded the same way. It's cumbersome and repetitive to always create the map___ToProps functions to handle this common use case, so React URL Query provides a succinct way of describing URL query parameters through its urlPropsQueryConfig. You can just describe the type and names of the query parameters, and the decoded query params along with their change handlers will be passed in as props to the wrapped component.

Check it out below or in the other examples to see how it works.

Installation

npm install --save react-url-query

How do I use it?

A number of examples have been created demonstrating a variety of methods of using the library with different technologies. Here is the most basic form of using it in a component:

importReact,{PureComponent}from'react';importPropTypesfrom'prop-types';import{addUrlProps,UrlQueryParamTypes}from'react-url-query';/** * Specify how the URL gets decoded here. This is an object that takes the prop * name as a key, and a query param specifier as the value. The query param * specifier can have a `type`, indicating how to decode the value from the * URL, and a `queryParam` field that indicates which key in the query * parameters should be read (this defaults to the prop name if not provided). * * Here we specify two props, `bar` and `foo` that correspond to query parameters * `bar` and `fooInUrl` respectively. React URL Query will interpret URLs like * /app?bar=react&fooInUrl=137 and pass the props `{ bar: "react", foo: 137 }` * to the MainPage component. */consturlPropsQueryConfig={bar: {type: UrlQueryParamTypes.string},foo: {type: UrlQueryParamTypes.number,queryParam: 'fooInUrl'},};classMainPageextendsPureComponent{staticpropTypes={// URL props are automatically decoded and passed in based on the configbar: PropTypes.string,foo: PropTypes.number,// change handlers are automatically generated when given a config.// By default they update that single query parameter and maintain existing// values in the other parameters.onChangeFoo: PropTypes.func,onChangeBar: PropTypes.func,}staticdefaultProps={foo: 123,bar: 'bar',}render(){const{ foo, bar, onChangeFoo, onChangeBar }=this.props;return(<div><div>
foo={foo}<buttononClick={()=>onChangeFoo(999)}>Set foo to 999</button></div><div>
bar={bar}<buttononClick={()=>onChangeBar('testing')}>
Set bar to "testing"
</button></div></div>);}}/** * Use the addUrlProps higher-order component to hook-in react-url-query. */exportdefaultaddUrlProps({ urlPropsQueryConfig })(MainPage);

If you prefer, instead of using a urlPropsQueryConfig you can provide the functions mapUrlToProps and mapUrlChangeHandlersToProps, as shown in the basic-mapUrlToProps example.

You'll also need to configure which history to use, typically done wherever you initialize your application. Examples of doing this with different setups are shown in the examples section.

If you are using react-router, how you link in the history depends on the version.

React Router v2

import{configureUrlQuery}from'react-url-query';import{browserHistory}from'react-router'configureUrlQuery({history: browserHistory});

React Router v4

import{RouterToUrlQuery}from'react-url-query';importRouterfrom'react-router/BrowserRouter';ReactDOM.render(<Router><RouterToUrlQuery><App/></RouterToUrlQuery></Router>,document.getElementById('root'));

React Router v5

import{RouterToUrlQuery}from'react-url-query';import{BrowserRouterasRouter,__RouterContextasRouterContext}from'react-router-dom';ReactDOM.render(<Router><RouterToUrlQueryrouterContext={RouterContext}><App/></RouterToUrlQuery></Router>,document.getElementById('root'));

Not using React Router. If you're not using react-router, you'll need to instantiate the history yourself manually:

import{configureUrlQuery}from'react-url-query';importcreateHistoryfrom'history/createBrowserHistory';consthistory=createHistory();configureUrlQuery({ history });

Examples

Development

During development of examples, it can be helpful to have a watch running automatically rebuilding the package when changes take place. To get this running run:

npm run dev

Building

npm run build

Linting

npm run lint

To lint examples, run:

npm run lint:examples

Testing

npm run test

To test examples, run:

npm run test:examples

Working on docs

When editing the docs, it helps to have a dev server watching changes. To do this, run:

npm run docs:watch

To build the docs, run:

npm run docs:build

To publish the docs, run:

npm run docs:publish

License

MIT

About

A library for managing state through query parameters in the URL in React

Topics

Resources

Code of conduct

Stars

193 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - pbeshai/react-url-query: A library for managing state through query parameters in the URL in React · GitHub
Skip to content
This repository was archived by the owner on Jun 15, 2020. It is now read-only.

Repository files navigation

React URL Query

npm versionBuild Status


Using React Hooks? Check out use-query-params for managing URL query parameters via hooks.

Update 2019-09-13use-query-params has been updated to have a HOC and a render props solution. I recommend using that library for any modern query param problems as it is more likely to be updated.


A library for managing state through query parameters in the URL in React. It integrates well with React Router and Redux and provides additional tools specifically targeted at serializing and deserializing state in URL query parameters. With React URL Query, you can create components where there is no difference in handling state from an external store like Redux and state from the URL.

Motivation

When developing web applications, it's really common to want to encode parts of the state in URL query parameters to capture what users are seeing on screen. Think of things like filters, toggles, selected items, and so on. Storing them in the URL allows users to easily link others to what they are seeing and facilitates discussion. React URL Query makes doing this really easy.

The current set of tools for React does not provide facilities for easy interaction with query parameters.

The fantastic library React Router is the standard for integrating URL changes in React applications and provides us access to the query parameters as an object, but the fields within are always represented as strings-- just as they appear in the URL. This makes sense, but means developers must work to decode the strings into the proper types depending on what is being stored in a given param (e.g. numbers, booleans, arrays, objects). Furthermore, when one wants to update the query parameters in the URL, React Router gives us functions to do so via context.router, but no facilities for encoding our values as strings.

The current front-runner for state management in React app's is Redux. When first dealing with encoding state in URL query parameters, it's common to wonder how to get them in sync with what is in the Redux store. Dan Abramov, Redux's creator, suggests that you don't do that. Instead, he puts forth the idea of decoding the query parameters in the mapStateToProps function (you can look into props.location.query if you're using React Router). However, when it comes to encoding changes to the query parameters back into the URL, we're back to calling router functions directly.

React URL Query is based off the idea that we can have an equivalent to mapStateToProps and mapDispatchToProps (see Redux's Usage with React) but for the URL. In fact, it allows you to provide mapUrlToProps and mapUrlChangeHandlersToProps when configuring components to do just that. You can decode URL query params into props in mapUrlToProps and you can encode them back into params through change handlers in mapUrlChangeHandlersToProps. This means the component code itself doesn't need to be aware of which props are managed by Redux and which props are managed by the URL-- it can just read props and call change handlers, and the application will update appropriately.

There are some very common patterns when encoding and decoding URL query parameters: each parameter has a type and a name in the URL and parameters of a given type should always be encoded or decoded the same way. It's cumbersome and repetitive to always create the map___ToProps functions to handle this common use case, so React URL Query provides a succinct way of describing URL query parameters through its urlPropsQueryConfig. You can just describe the type and names of the query parameters, and the decoded query params along with their change handlers will be passed in as props to the wrapped component.

Check it out below or in the other examples to see how it works.

Installation

npm install --save react-url-query

How do I use it?

A number of examples have been created demonstrating a variety of methods of using the library with different technologies. Here is the most basic form of using it in a component:

importReact,{PureComponent}from'react';importPropTypesfrom'prop-types';import{addUrlProps,UrlQueryParamTypes}from'react-url-query';/** * Specify how the URL gets decoded here. This is an object that takes the prop * name as a key, and a query param specifier as the value. The query param * specifier can have a `type`, indicating how to decode the value from the * URL, and a `queryParam` field that indicates which key in the query * parameters should be read (this defaults to the prop name if not provided). * * Here we specify two props, `bar` and `foo` that correspond to query parameters * `bar` and `fooInUrl` respectively. React URL Query will interpret URLs like * /app?bar=react&fooInUrl=137 and pass the props `{ bar: "react", foo: 137 }` * to the MainPage component. */consturlPropsQueryConfig={bar: {type: UrlQueryParamTypes.string},foo: {type: UrlQueryParamTypes.number,queryParam: 'fooInUrl'},};classMainPageextendsPureComponent{staticpropTypes={// URL props are automatically decoded and passed in based on the configbar: PropTypes.string,foo: PropTypes.number,// change handlers are automatically generated when given a config.// By default they update that single query parameter and maintain existing// values in the other parameters.onChangeFoo: PropTypes.func,onChangeBar: PropTypes.func,}staticdefaultProps={foo: 123,bar: 'bar',}render(){const{ foo, bar, onChangeFoo, onChangeBar }=this.props;return(<div><div>
foo={foo}<buttononClick={()=>onChangeFoo(999)}>Set foo to 999</button></div><div>
bar={bar}<buttononClick={()=>onChangeBar('testing')}>
Set bar to "testing"
</button></div></div>);}}/** * Use the addUrlProps higher-order component to hook-in react-url-query. */exportdefaultaddUrlProps({ urlPropsQueryConfig })(MainPage);

If you prefer, instead of using a urlPropsQueryConfig you can provide the functions mapUrlToProps and mapUrlChangeHandlersToProps, as shown in the basic-mapUrlToProps example.

You'll also need to configure which history to use, typically done wherever you initialize your application. Examples of doing this with different setups are shown in the examples section.

If you are using react-router, how you link in the history depends on the version.

React Router v2

import{configureUrlQuery}from'react-url-query';import{browserHistory}from'react-router'configureUrlQuery({history: browserHistory});

React Router v4

import{RouterToUrlQuery}from'react-url-query';importRouterfrom'react-router/BrowserRouter';ReactDOM.render(<Router><RouterToUrlQuery><App/></RouterToUrlQuery></Router>,document.getElementById('root'));

React Router v5

import{RouterToUrlQuery}from'react-url-query';import{BrowserRouterasRouter,__RouterContextasRouterContext}from'react-router-dom';ReactDOM.render(<Router><RouterToUrlQueryrouterContext={RouterContext}><App/></RouterToUrlQuery></Router>,document.getElementById('root'));

Not using React Router. If you're not using react-router, you'll need to instantiate the history yourself manually:

import{configureUrlQuery}from'react-url-query';importcreateHistoryfrom'history/createBrowserHistory';consthistory=createHistory();configureUrlQuery({ history });

Examples

Development

During development of examples, it can be helpful to have a watch running automatically rebuilding the package when changes take place. To get this running run:

npm run dev

Building

npm run build

Linting

npm run lint

To lint examples, run:

npm run lint:examples

Testing

npm run test

To test examples, run:

npm run test:examples

Working on docs

When editing the docs, it helps to have a dev server watching changes. To do this, run:

npm run docs:watch

To build the docs, run:

npm run docs:build

To publish the docs, run:

npm run docs:publish

License

MIT

About

A library for managing state through query parameters in the URL in React

Topics

Resources

Code of conduct

Stars

193 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - pbeshai/react-url-query: A library for managing state through query parameters in the URL in React · GitHub
Skip to content
This repository was archived by the owner on Jun 15, 2020. It is now read-only.

Repository files navigation

React URL Query

npm versionBuild Status


Using React Hooks? Check out use-query-params for managing URL query parameters via hooks.

Update 2019-09-13use-query-params has been updated to have a HOC and a render props solution. I recommend using that library for any modern query param problems as it is more likely to be updated.


A library for managing state through query parameters in the URL in React. It integrates well with React Router and Redux and provides additional tools specifically targeted at serializing and deserializing state in URL query parameters. With React URL Query, you can create components where there is no difference in handling state from an external store like Redux and state from the URL.

Motivation

When developing web applications, it's really common to want to encode parts of the state in URL query parameters to capture what users are seeing on screen. Think of things like filters, toggles, selected items, and so on. Storing them in the URL allows users to easily link others to what they are seeing and facilitates discussion. React URL Query makes doing this really easy.

The current set of tools for React does not provide facilities for easy interaction with query parameters.

The fantastic library React Router is the standard for integrating URL changes in React applications and provides us access to the query parameters as an object, but the fields within are always represented as strings-- just as they appear in the URL. This makes sense, but means developers must work to decode the strings into the proper types depending on what is being stored in a given param (e.g. numbers, booleans, arrays, objects). Furthermore, when one wants to update the query parameters in the URL, React Router gives us functions to do so via context.router, but no facilities for encoding our values as strings.

The current front-runner for state management in React app's is Redux. When first dealing with encoding state in URL query parameters, it's common to wonder how to get them in sync with what is in the Redux store. Dan Abramov, Redux's creator, suggests that you don't do that. Instead, he puts forth the idea of decoding the query parameters in the mapStateToProps function (you can look into props.location.query if you're using React Router). However, when it comes to encoding changes to the query parameters back into the URL, we're back to calling router functions directly.

React URL Query is based off the idea that we can have an equivalent to mapStateToProps and mapDispatchToProps (see Redux's Usage with React) but for the URL. In fact, it allows you to provide mapUrlToProps and mapUrlChangeHandlersToProps when configuring components to do just that. You can decode URL query params into props in mapUrlToProps and you can encode them back into params through change handlers in mapUrlChangeHandlersToProps. This means the component code itself doesn't need to be aware of which props are managed by Redux and which props are managed by the URL-- it can just read props and call change handlers, and the application will update appropriately.

There are some very common patterns when encoding and decoding URL query parameters: each parameter has a type and a name in the URL and parameters of a given type should always be encoded or decoded the same way. It's cumbersome and repetitive to always create the map___ToProps functions to handle this common use case, so React URL Query provides a succinct way of describing URL query parameters through its urlPropsQueryConfig. You can just describe the type and names of the query parameters, and the decoded query params along with their change handlers will be passed in as props to the wrapped component.

Check it out below or in the other examples to see how it works.

Installation

npm install --save react-url-query

How do I use it?

A number of examples have been created demonstrating a variety of methods of using the library with different technologies. Here is the most basic form of using it in a component:

importReact,{PureComponent}from'react';importPropTypesfrom'prop-types';import{addUrlProps,UrlQueryParamTypes}from'react-url-query';/** * Specify how the URL gets decoded here. This is an object that takes the prop * name as a key, and a query param specifier as the value. The query param * specifier can have a `type`, indicating how to decode the value from the * URL, and a `queryParam` field that indicates which key in the query * parameters should be read (this defaults to the prop name if not provided). * * Here we specify two props, `bar` and `foo` that correspond to query parameters * `bar` and `fooInUrl` respectively. React URL Query will interpret URLs like * /app?bar=react&fooInUrl=137 and pass the props `{ bar: "react", foo: 137 }` * to the MainPage component. */consturlPropsQueryConfig={bar: {type: UrlQueryParamTypes.string},foo: {type: UrlQueryParamTypes.number,queryParam: 'fooInUrl'},};classMainPageextendsPureComponent{staticpropTypes={// URL props are automatically decoded and passed in based on the configbar: PropTypes.string,foo: PropTypes.number,// change handlers are automatically generated when given a config.// By default they update that single query parameter and maintain existing// values in the other parameters.onChangeFoo: PropTypes.func,onChangeBar: PropTypes.func,}staticdefaultProps={foo: 123,bar: 'bar',}render(){const{ foo, bar, onChangeFoo, onChangeBar }=this.props;return(<div><div>
foo={foo}<buttononClick={()=>onChangeFoo(999)}>Set foo to 999</button></div><div>
bar={bar}<buttononClick={()=>onChangeBar('testing')}>
Set bar to "testing"
</button></div></div>);}}/** * Use the addUrlProps higher-order component to hook-in react-url-query. */exportdefaultaddUrlProps({ urlPropsQueryConfig })(MainPage);

If you prefer, instead of using a urlPropsQueryConfig you can provide the functions mapUrlToProps and mapUrlChangeHandlersToProps, as shown in the basic-mapUrlToProps example.

You'll also need to configure which history to use, typically done wherever you initialize your application. Examples of doing this with different setups are shown in the examples section.

If you are using react-router, how you link in the history depends on the version.

React Router v2

import{configureUrlQuery}from'react-url-query';import{browserHistory}from'react-router'configureUrlQuery({history: browserHistory});

React Router v4

import{RouterToUrlQuery}from'react-url-query';importRouterfrom'react-router/BrowserRouter';ReactDOM.render(<Router><RouterToUrlQuery><App/></RouterToUrlQuery></Router>,document.getElementById('root'));

React Router v5

import{RouterToUrlQuery}from'react-url-query';import{BrowserRouterasRouter,__RouterContextasRouterContext}from'react-router-dom';ReactDOM.render(<Router><RouterToUrlQueryrouterContext={RouterContext}><App/></RouterToUrlQuery></Router>,document.getElementById('root'));

Not using React Router. If you're not using react-router, you'll need to instantiate the history yourself manually:

import{configureUrlQuery}from'react-url-query';importcreateHistoryfrom'history/createBrowserHistory';consthistory=createHistory();configureUrlQuery({ history });

Examples

Development

During development of examples, it can be helpful to have a watch running automatically rebuilding the package when changes take place. To get this running run:

npm run dev

Building

npm run build

Linting

npm run lint

To lint examples, run:

npm run lint:examples

Testing

npm run test

To test examples, run:

npm run test:examples

Working on docs

When editing the docs, it helps to have a dev server watching changes. To do this, run:

npm run docs:watch

To build the docs, run:

npm run docs:build

To publish the docs, run:

npm run docs:publish

License

MIT

About

A library for managing state through query parameters in the URL in React

Topics

Resources

Code of conduct

Stars

193 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - pbeshai/react-url-query: A library for managing state through query parameters in the URL in React · GitHub
Skip to content
This repository was archived by the owner on Jun 15, 2020. It is now read-only.

Repository files navigation

React URL Query

npm versionBuild Status


Using React Hooks? Check out use-query-params for managing URL query parameters via hooks.

Update 2019-09-13use-query-params has been updated to have a HOC and a render props solution. I recommend using that library for any modern query param problems as it is more likely to be updated.


A library for managing state through query parameters in the URL in React. It integrates well with React Router and Redux and provides additional tools specifically targeted at serializing and deserializing state in URL query parameters. With React URL Query, you can create components where there is no difference in handling state from an external store like Redux and state from the URL.

Motivation

When developing web applications, it's really common to want to encode parts of the state in URL query parameters to capture what users are seeing on screen. Think of things like filters, toggles, selected items, and so on. Storing them in the URL allows users to easily link others to what they are seeing and facilitates discussion. React URL Query makes doing this really easy.

The current set of tools for React does not provide facilities for easy interaction with query parameters.

The fantastic library React Router is the standard for integrating URL changes in React applications and provides us access to the query parameters as an object, but the fields within are always represented as strings-- just as they appear in the URL. This makes sense, but means developers must work to decode the strings into the proper types depending on what is being stored in a given param (e.g. numbers, booleans, arrays, objects). Furthermore, when one wants to update the query parameters in the URL, React Router gives us functions to do so via context.router, but no facilities for encoding our values as strings.

The current front-runner for state management in React app's is Redux. When first dealing with encoding state in URL query parameters, it's common to wonder how to get them in sync with what is in the Redux store. Dan Abramov, Redux's creator, suggests that you don't do that. Instead, he puts forth the idea of decoding the query parameters in the mapStateToProps function (you can look into props.location.query if you're using React Router). However, when it comes to encoding changes to the query parameters back into the URL, we're back to calling router functions directly.

React URL Query is based off the idea that we can have an equivalent to mapStateToProps and mapDispatchToProps (see Redux's Usage with React) but for the URL. In fact, it allows you to provide mapUrlToProps and mapUrlChangeHandlersToProps when configuring components to do just that. You can decode URL query params into props in mapUrlToProps and you can encode them back into params through change handlers in mapUrlChangeHandlersToProps. This means the component code itself doesn't need to be aware of which props are managed by Redux and which props are managed by the URL-- it can just read props and call change handlers, and the application will update appropriately.

There are some very common patterns when encoding and decoding URL query parameters: each parameter has a type and a name in the URL and parameters of a given type should always be encoded or decoded the same way. It's cumbersome and repetitive to always create the map___ToProps functions to handle this common use case, so React URL Query provides a succinct way of describing URL query parameters through its urlPropsQueryConfig. You can just describe the type and names of the query parameters, and the decoded query params along with their change handlers will be passed in as props to the wrapped component.

Check it out below or in the other examples to see how it works.

Installation

npm install --save react-url-query

How do I use it?

A number of examples have been created demonstrating a variety of methods of using the library with different technologies. Here is the most basic form of using it in a component:

importReact,{PureComponent}from'react';importPropTypesfrom'prop-types';import{addUrlProps,UrlQueryParamTypes}from'react-url-query';/** * Specify how the URL gets decoded here. This is an object that takes the prop * name as a key, and a query param specifier as the value. The query param * specifier can have a `type`, indicating how to decode the value from the * URL, and a `queryParam` field that indicates which key in the query * parameters should be read (this defaults to the prop name if not provided). * * Here we specify two props, `bar` and `foo` that correspond to query parameters * `bar` and `fooInUrl` respectively. React URL Query will interpret URLs like * /app?bar=react&fooInUrl=137 and pass the props `{ bar: "react", foo: 137 }` * to the MainPage component. */consturlPropsQueryConfig={bar: {type: UrlQueryParamTypes.string},foo: {type: UrlQueryParamTypes.number,queryParam: 'fooInUrl'},};classMainPageextendsPureComponent{staticpropTypes={// URL props are automatically decoded and passed in based on the configbar: PropTypes.string,foo: PropTypes.number,// change handlers are automatically generated when given a config.// By default they update that single query parameter and maintain existing// values in the other parameters.onChangeFoo: PropTypes.func,onChangeBar: PropTypes.func,}staticdefaultProps={foo: 123,bar: 'bar',}render(){const{ foo, bar, onChangeFoo, onChangeBar }=this.props;return(<div><div>
foo={foo}<buttononClick={()=>onChangeFoo(999)}>Set foo to 999</button></div><div>
bar={bar}<buttononClick={()=>onChangeBar('testing')}>
Set bar to "testing"
</button></div></div>);}}/** * Use the addUrlProps higher-order component to hook-in react-url-query. */exportdefaultaddUrlProps({ urlPropsQueryConfig })(MainPage);

If you prefer, instead of using a urlPropsQueryConfig you can provide the functions mapUrlToProps and mapUrlChangeHandlersToProps, as shown in the basic-mapUrlToProps example.

You'll also need to configure which history to use, typically done wherever you initialize your application. Examples of doing this with different setups are shown in the examples section.

If you are using react-router, how you link in the history depends on the version.

React Router v2

import{configureUrlQuery}from'react-url-query';import{browserHistory}from'react-router'configureUrlQuery({history: browserHistory});

React Router v4

import{RouterToUrlQuery}from'react-url-query';importRouterfrom'react-router/BrowserRouter';ReactDOM.render(<Router><RouterToUrlQuery><App/></RouterToUrlQuery></Router>,document.getElementById('root'));

React Router v5

import{RouterToUrlQuery}from'react-url-query';import{BrowserRouterasRouter,__RouterContextasRouterContext}from'react-router-dom';ReactDOM.render(<Router><RouterToUrlQueryrouterContext={RouterContext}><App/></RouterToUrlQuery></Router>,document.getElementById('root'));

Not using React Router. If you're not using react-router, you'll need to instantiate the history yourself manually:

import{configureUrlQuery}from'react-url-query';importcreateHistoryfrom'history/createBrowserHistory';consthistory=createHistory();configureUrlQuery({ history });

Examples

Development

During development of examples, it can be helpful to have a watch running automatically rebuilding the package when changes take place. To get this running run:

npm run dev

Building

npm run build

Linting

npm run lint

To lint examples, run:

npm run lint:examples

Testing

npm run test

To test examples, run:

npm run test:examples

Working on docs

When editing the docs, it helps to have a dev server watching changes. To do this, run:

npm run docs:watch

To build the docs, run:

npm run docs:build

To publish the docs, run:

npm run docs:publish

License

MIT

About

A library for managing state through query parameters in the URL in React

Topics

Resources

Code of conduct

Stars

193 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - pbeshai/react-url-query: A library for managing state through query parameters in the URL in React · GitHub
Skip to content
This repository was archived by the owner on Jun 15, 2020. It is now read-only.

Repository files navigation

React URL Query

npm versionBuild Status


Using React Hooks? Check out use-query-params for managing URL query parameters via hooks.

Update 2019-09-13use-query-params has been updated to have a HOC and a render props solution. I recommend using that library for any modern query param problems as it is more likely to be updated.


A library for managing state through query parameters in the URL in React. It integrates well with React Router and Redux and provides additional tools specifically targeted at serializing and deserializing state in URL query parameters. With React URL Query, you can create components where there is no difference in handling state from an external store like Redux and state from the URL.

Motivation

When developing web applications, it's really common to want to encode parts of the state in URL query parameters to capture what users are seeing on screen. Think of things like filters, toggles, selected items, and so on. Storing them in the URL allows users to easily link others to what they are seeing and facilitates discussion. React URL Query makes doing this really easy.

The current set of tools for React does not provide facilities for easy interaction with query parameters.

The fantastic library React Router is the standard for integrating URL changes in React applications and provides us access to the query parameters as an object, but the fields within are always represented as strings-- just as they appear in the URL. This makes sense, but means developers must work to decode the strings into the proper types depending on what is being stored in a given param (e.g. numbers, booleans, arrays, objects). Furthermore, when one wants to update the query parameters in the URL, React Router gives us functions to do so via context.router, but no facilities for encoding our values as strings.

The current front-runner for state management in React app's is Redux. When first dealing with encoding state in URL query parameters, it's common to wonder how to get them in sync with what is in the Redux store. Dan Abramov, Redux's creator, suggests that you don't do that. Instead, he puts forth the idea of decoding the query parameters in the mapStateToProps function (you can look into props.location.query if you're using React Router). However, when it comes to encoding changes to the query parameters back into the URL, we're back to calling router functions directly.

React URL Query is based off the idea that we can have an equivalent to mapStateToProps and mapDispatchToProps (see Redux's Usage with React) but for the URL. In fact, it allows you to provide mapUrlToProps and mapUrlChangeHandlersToProps when configuring components to do just that. You can decode URL query params into props in mapUrlToProps and you can encode them back into params through change handlers in mapUrlChangeHandlersToProps. This means the component code itself doesn't need to be aware of which props are managed by Redux and which props are managed by the URL-- it can just read props and call change handlers, and the application will update appropriately.

There are some very common patterns when encoding and decoding URL query parameters: each parameter has a type and a name in the URL and parameters of a given type should always be encoded or decoded the same way. It's cumbersome and repetitive to always create the map___ToProps functions to handle this common use case, so React URL Query provides a succinct way of describing URL query parameters through its urlPropsQueryConfig. You can just describe the type and names of the query parameters, and the decoded query params along with their change handlers will be passed in as props to the wrapped component.

Check it out below or in the other examples to see how it works.

Installation

npm install --save react-url-query

How do I use it?

A number of examples have been created demonstrating a variety of methods of using the library with different technologies. Here is the most basic form of using it in a component:

importReact,{PureComponent}from'react';importPropTypesfrom'prop-types';import{addUrlProps,UrlQueryParamTypes}from'react-url-query';/** * Specify how the URL gets decoded here. This is an object that takes the prop * name as a key, and a query param specifier as the value. The query param * specifier can have a `type`, indicating how to decode the value from the * URL, and a `queryParam` field that indicates which key in the query * parameters should be read (this defaults to the prop name if not provided). * * Here we specify two props, `bar` and `foo` that correspond to query parameters * `bar` and `fooInUrl` respectively. React URL Query will interpret URLs like * /app?bar=react&fooInUrl=137 and pass the props `{ bar: "react", foo: 137 }` * to the MainPage component. */consturlPropsQueryConfig={bar: {type: UrlQueryParamTypes.string},foo: {type: UrlQueryParamTypes.number,queryParam: 'fooInUrl'},};classMainPageextendsPureComponent{staticpropTypes={// URL props are automatically decoded and passed in based on the configbar: PropTypes.string,foo: PropTypes.number,// change handlers are automatically generated when given a config.// By default they update that single query parameter and maintain existing// values in the other parameters.onChangeFoo: PropTypes.func,onChangeBar: PropTypes.func,}staticdefaultProps={foo: 123,bar: 'bar',}render(){const{ foo, bar, onChangeFoo, onChangeBar }=this.props;return(<div><div>
foo={foo}<buttononClick={()=>onChangeFoo(999)}>Set foo to 999</button></div><div>
bar={bar}<buttononClick={()=>onChangeBar('testing')}>
Set bar to "testing"
</button></div></div>);}}/** * Use the addUrlProps higher-order component to hook-in react-url-query. */exportdefaultaddUrlProps({ urlPropsQueryConfig })(MainPage);

If you prefer, instead of using a urlPropsQueryConfig you can provide the functions mapUrlToProps and mapUrlChangeHandlersToProps, as shown in the basic-mapUrlToProps example.

You'll also need to configure which history to use, typically done wherever you initialize your application. Examples of doing this with different setups are shown in the examples section.

If you are using react-router, how you link in the history depends on the version.

React Router v2

import{configureUrlQuery}from'react-url-query';import{browserHistory}from'react-router'configureUrlQuery({history: browserHistory});

React Router v4

import{RouterToUrlQuery}from'react-url-query';importRouterfrom'react-router/BrowserRouter';ReactDOM.render(<Router><RouterToUrlQuery><App/></RouterToUrlQuery></Router>,document.getElementById('root'));

React Router v5

import{RouterToUrlQuery}from'react-url-query';import{BrowserRouterasRouter,__RouterContextasRouterContext}from'react-router-dom';ReactDOM.render(<Router><RouterToUrlQueryrouterContext={RouterContext}><App/></RouterToUrlQuery></Router>,document.getElementById('root'));

Not using React Router. If you're not using react-router, you'll need to instantiate the history yourself manually:

import{configureUrlQuery}from'react-url-query';importcreateHistoryfrom'history/createBrowserHistory';consthistory=createHistory();configureUrlQuery({ history });

Examples

Development

During development of examples, it can be helpful to have a watch running automatically rebuilding the package when changes take place. To get this running run:

npm run dev

Building

npm run build

Linting

npm run lint

To lint examples, run:

npm run lint:examples

Testing

npm run test

To test examples, run:

npm run test:examples

Working on docs

When editing the docs, it helps to have a dev server watching changes. To do this, run:

npm run docs:watch

To build the docs, run:

npm run docs:build

To publish the docs, run:

npm run docs:publish

License

MIT

About

A library for managing state through query parameters in the URL in React

Topics

Resources

Code of conduct

Stars

193 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - pbeshai/react-url-query: A library for managing state through query parameters in the URL in React · GitHub
Skip to content
This repository was archived by the owner on Jun 15, 2020. It is now read-only.

Repository files navigation

React URL Query

npm versionBuild Status


Using React Hooks? Check out use-query-params for managing URL query parameters via hooks.

Update 2019-09-13use-query-params has been updated to have a HOC and a render props solution. I recommend using that library for any modern query param problems as it is more likely to be updated.


A library for managing state through query parameters in the URL in React. It integrates well with React Router and Redux and provides additional tools specifically targeted at serializing and deserializing state in URL query parameters. With React URL Query, you can create components where there is no difference in handling state from an external store like Redux and state from the URL.

Motivation

When developing web applications, it's really common to want to encode parts of the state in URL query parameters to capture what users are seeing on screen. Think of things like filters, toggles, selected items, and so on. Storing them in the URL allows users to easily link others to what they are seeing and facilitates discussion. React URL Query makes doing this really easy.

The current set of tools for React does not provide facilities for easy interaction with query parameters.

The fantastic library React Router is the standard for integrating URL changes in React applications and provides us access to the query parameters as an object, but the fields within are always represented as strings-- just as they appear in the URL. This makes sense, but means developers must work to decode the strings into the proper types depending on what is being stored in a given param (e.g. numbers, booleans, arrays, objects). Furthermore, when one wants to update the query parameters in the URL, React Router gives us functions to do so via context.router, but no facilities for encoding our values as strings.

The current front-runner for state management in React app's is Redux. When first dealing with encoding state in URL query parameters, it's common to wonder how to get them in sync with what is in the Redux store. Dan Abramov, Redux's creator, suggests that you don't do that. Instead, he puts forth the idea of decoding the query parameters in the mapStateToProps function (you can look into props.location.query if you're using React Router). However, when it comes to encoding changes to the query parameters back into the URL, we're back to calling router functions directly.

React URL Query is based off the idea that we can have an equivalent to mapStateToProps and mapDispatchToProps (see Redux's Usage with React) but for the URL. In fact, it allows you to provide mapUrlToProps and mapUrlChangeHandlersToProps when configuring components to do just that. You can decode URL query params into props in mapUrlToProps and you can encode them back into params through change handlers in mapUrlChangeHandlersToProps. This means the component code itself doesn't need to be aware of which props are managed by Redux and which props are managed by the URL-- it can just read props and call change handlers, and the application will update appropriately.

There are some very common patterns when encoding and decoding URL query parameters: each parameter has a type and a name in the URL and parameters of a given type should always be encoded or decoded the same way. It's cumbersome and repetitive to always create the map___ToProps functions to handle this common use case, so React URL Query provides a succinct way of describing URL query parameters through its urlPropsQueryConfig. You can just describe the type and names of the query parameters, and the decoded query params along with their change handlers will be passed in as props to the wrapped component.

Check it out below or in the other examples to see how it works.

Installation

npm install --save react-url-query

How do I use it?

A number of examples have been created demonstrating a variety of methods of using the library with different technologies. Here is the most basic form of using it in a component:

importReact,{PureComponent}from'react';importPropTypesfrom'prop-types';import{addUrlProps,UrlQueryParamTypes}from'react-url-query';/** * Specify how the URL gets decoded here. This is an object that takes the prop * name as a key, and a query param specifier as the value. The query param * specifier can have a `type`, indicating how to decode the value from the * URL, and a `queryParam` field that indicates which key in the query * parameters should be read (this defaults to the prop name if not provided). * * Here we specify two props, `bar` and `foo` that correspond to query parameters * `bar` and `fooInUrl` respectively. React URL Query will interpret URLs like * /app?bar=react&fooInUrl=137 and pass the props `{ bar: "react", foo: 137 }` * to the MainPage component. */consturlPropsQueryConfig={bar: {type: UrlQueryParamTypes.string},foo: {type: UrlQueryParamTypes.number,queryParam: 'fooInUrl'},};classMainPageextendsPureComponent{staticpropTypes={// URL props are automatically decoded and passed in based on the configbar: PropTypes.string,foo: PropTypes.number,// change handlers are automatically generated when given a config.// By default they update that single query parameter and maintain existing// values in the other parameters.onChangeFoo: PropTypes.func,onChangeBar: PropTypes.func,}staticdefaultProps={foo: 123,bar: 'bar',}render(){const{ foo, bar, onChangeFoo, onChangeBar }=this.props;return(<div><div>
foo={foo}<buttononClick={()=>onChangeFoo(999)}>Set foo to 999</button></div><div>
bar={bar}<buttononClick={()=>onChangeBar('testing')}>
Set bar to "testing"
</button></div></div>);}}/** * Use the addUrlProps higher-order component to hook-in react-url-query. */exportdefaultaddUrlProps({ urlPropsQueryConfig })(MainPage);

If you prefer, instead of using a urlPropsQueryConfig you can provide the functions mapUrlToProps and mapUrlChangeHandlersToProps, as shown in the basic-mapUrlToProps example.

You'll also need to configure which history to use, typically done wherever you initialize your application. Examples of doing this with different setups are shown in the examples section.

If you are using react-router, how you link in the history depends on the version.

React Router v2

import{configureUrlQuery}from'react-url-query';import{browserHistory}from'react-router'configureUrlQuery({history: browserHistory});

React Router v4

import{RouterToUrlQuery}from'react-url-query';importRouterfrom'react-router/BrowserRouter';ReactDOM.render(<Router><RouterToUrlQuery><App/></RouterToUrlQuery></Router>,document.getElementById('root'));

React Router v5

import{RouterToUrlQuery}from'react-url-query';import{BrowserRouterasRouter,__RouterContextasRouterContext}from'react-router-dom';ReactDOM.render(<Router><RouterToUrlQueryrouterContext={RouterContext}><App/></RouterToUrlQuery></Router>,document.getElementById('root'));

Not using React Router. If you're not using react-router, you'll need to instantiate the history yourself manually:

import{configureUrlQuery}from'react-url-query';importcreateHistoryfrom'history/createBrowserHistory';consthistory=createHistory();configureUrlQuery({ history });

Examples

Development

During development of examples, it can be helpful to have a watch running automatically rebuilding the package when changes take place. To get this running run:

npm run dev

Building

npm run build

Linting

npm run lint

To lint examples, run:

npm run lint:examples

Testing

npm run test

To test examples, run:

npm run test:examples

Working on docs

When editing the docs, it helps to have a dev server watching changes. To do this, run:

npm run docs:watch

To build the docs, run:

npm run docs:build

To publish the docs, run:

npm run docs:publish

License

MIT

About

A library for managing state through query parameters in the URL in React

Topics

Resources

Code of conduct

Stars

193 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - pbeshai/react-url-query: A library for managing state through query parameters in the URL in React · GitHub
Skip to content
This repository was archived by the owner on Jun 15, 2020. It is now read-only.

Repository files navigation

React URL Query

npm versionBuild Status


Using React Hooks? Check out use-query-params for managing URL query parameters via hooks.

Update 2019-09-13use-query-params has been updated to have a HOC and a render props solution. I recommend using that library for any modern query param problems as it is more likely to be updated.


A library for managing state through query parameters in the URL in React. It integrates well with React Router and Redux and provides additional tools specifically targeted at serializing and deserializing state in URL query parameters. With React URL Query, you can create components where there is no difference in handling state from an external store like Redux and state from the URL.

Motivation

When developing web applications, it's really common to want to encode parts of the state in URL query parameters to capture what users are seeing on screen. Think of things like filters, toggles, selected items, and so on. Storing them in the URL allows users to easily link others to what they are seeing and facilitates discussion. React URL Query makes doing this really easy.

The current set of tools for React does not provide facilities for easy interaction with query parameters.

The fantastic library React Router is the standard for integrating URL changes in React applications and provides us access to the query parameters as an object, but the fields within are always represented as strings-- just as they appear in the URL. This makes sense, but means developers must work to decode the strings into the proper types depending on what is being stored in a given param (e.g. numbers, booleans, arrays, objects). Furthermore, when one wants to update the query parameters in the URL, React Router gives us functions to do so via context.router, but no facilities for encoding our values as strings.

The current front-runner for state management in React app's is Redux. When first dealing with encoding state in URL query parameters, it's common to wonder how to get them in sync with what is in the Redux store. Dan Abramov, Redux's creator, suggests that you don't do that. Instead, he puts forth the idea of decoding the query parameters in the mapStateToProps function (you can look into props.location.query if you're using React Router). However, when it comes to encoding changes to the query parameters back into the URL, we're back to calling router functions directly.

React URL Query is based off the idea that we can have an equivalent to mapStateToProps and mapDispatchToProps (see Redux's Usage with React) but for the URL. In fact, it allows you to provide mapUrlToProps and mapUrlChangeHandlersToProps when configuring components to do just that. You can decode URL query params into props in mapUrlToProps and you can encode them back into params through change handlers in mapUrlChangeHandlersToProps. This means the component code itself doesn't need to be aware of which props are managed by Redux and which props are managed by the URL-- it can just read props and call change handlers, and the application will update appropriately.

There are some very common patterns when encoding and decoding URL query parameters: each parameter has a type and a name in the URL and parameters of a given type should always be encoded or decoded the same way. It's cumbersome and repetitive to always create the map___ToProps functions to handle this common use case, so React URL Query provides a succinct way of describing URL query parameters through its urlPropsQueryConfig. You can just describe the type and names of the query parameters, and the decoded query params along with their change handlers will be passed in as props to the wrapped component.

Check it out below or in the other examples to see how it works.

Installation

npm install --save react-url-query

How do I use it?

A number of examples have been created demonstrating a variety of methods of using the library with different technologies. Here is the most basic form of using it in a component:

importReact,{PureComponent}from'react';importPropTypesfrom'prop-types';import{addUrlProps,UrlQueryParamTypes}from'react-url-query';/** * Specify how the URL gets decoded here. This is an object that takes the prop * name as a key, and a query param specifier as the value. The query param * specifier can have a `type`, indicating how to decode the value from the * URL, and a `queryParam` field that indicates which key in the query * parameters should be read (this defaults to the prop name if not provided). * * Here we specify two props, `bar` and `foo` that correspond to query parameters * `bar` and `fooInUrl` respectively. React URL Query will interpret URLs like * /app?bar=react&fooInUrl=137 and pass the props `{ bar: "react", foo: 137 }` * to the MainPage component. */consturlPropsQueryConfig={bar: {type: UrlQueryParamTypes.string},foo: {type: UrlQueryParamTypes.number,queryParam: 'fooInUrl'},};classMainPageextendsPureComponent{staticpropTypes={// URL props are automatically decoded and passed in based on the configbar: PropTypes.string,foo: PropTypes.number,// change handlers are automatically generated when given a config.// By default they update that single query parameter and maintain existing// values in the other parameters.onChangeFoo: PropTypes.func,onChangeBar: PropTypes.func,}staticdefaultProps={foo: 123,bar: 'bar',}render(){const{ foo, bar, onChangeFoo, onChangeBar }=this.props;return(<div><div>
foo={foo}<buttononClick={()=>onChangeFoo(999)}>Set foo to 999</button></div><div>
bar={bar}<buttononClick={()=>onChangeBar('testing')}>
Set bar to "testing"
</button></div></div>);}}/** * Use the addUrlProps higher-order component to hook-in react-url-query. */exportdefaultaddUrlProps({ urlPropsQueryConfig })(MainPage);

If you prefer, instead of using a urlPropsQueryConfig you can provide the functions mapUrlToProps and mapUrlChangeHandlersToProps, as shown in the basic-mapUrlToProps example.

You'll also need to configure which history to use, typically done wherever you initialize your application. Examples of doing this with different setups are shown in the examples section.

If you are using react-router, how you link in the history depends on the version.

React Router v2

import{configureUrlQuery}from'react-url-query';import{browserHistory}from'react-router'configureUrlQuery({history: browserHistory});

React Router v4

import{RouterToUrlQuery}from'react-url-query';importRouterfrom'react-router/BrowserRouter';ReactDOM.render(<Router><RouterToUrlQuery><App/></RouterToUrlQuery></Router>,document.getElementById('root'));

React Router v5

import{RouterToUrlQuery}from'react-url-query';import{BrowserRouterasRouter,__RouterContextasRouterContext}from'react-router-dom';ReactDOM.render(<Router><RouterToUrlQueryrouterContext={RouterContext}><App/></RouterToUrlQuery></Router>,document.getElementById('root'));

Not using React Router. If you're not using react-router, you'll need to instantiate the history yourself manually:

import{configureUrlQuery}from'react-url-query';importcreateHistoryfrom'history/createBrowserHistory';consthistory=createHistory();configureUrlQuery({ history });

Examples

Development

During development of examples, it can be helpful to have a watch running automatically rebuilding the package when changes take place. To get this running run:

npm run dev

Building

npm run build

Linting

npm run lint

To lint examples, run:

npm run lint:examples

Testing

npm run test

To test examples, run:

npm run test:examples

Working on docs

When editing the docs, it helps to have a dev server watching changes. To do this, run:

npm run docs:watch

To build the docs, run:

npm run docs:build

To publish the docs, run:

npm run docs:publish

License

MIT

About

A library for managing state through query parameters in the URL in React

Topics

Resources

Code of conduct

Stars

193 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages