-
How do you programmatically navigate using React Router v4?
There are three different ways to achieve programmatic routing/navigation within components.
-
Using the
withRouter()higher-order function:The
withRouter()higher-order function will inject the history object as a prop of the component. This object providespush()andreplace()methods to avoid the usage of context.import { withRouter } from 'react-router-dom' // this also works with 'react-router-native' const Button = withRouter(({ history }) => ( <button type='button' onClick={() => { history.push('/new-location') }} > {'Click Me!'} </button> )) -
Using
<Route>component and render props pattern:The
<Route>component passes the same props aswithRouter(), so you will be able to access the history methods through the history prop.import { Route } from 'react-router-dom' const Button = () => ( <Route render={({ history }) => ( <button type='button' onClick={() => { history.push('/new-location') }} > {'Click Me!'} </button> )} /> ) -
Using context:
This option is not recommended and treated as unstable API.
const Button = (props, context) => ( <button type='button' onClick={() => { context.history.push('/new-location') }} > {'Click Me!'} </button> ) Button.contextTypes = { history: React.PropTypes.shape({ push: React.PropTypes.func.isRequired }) }
-
-
How to get query parameters in React Router v4?
The ability to parse query strings was taken out of React Router v4 because there have been user requests over the years to support different implementation. So the decision has been given to users to choose the implementation they like. The recommended approach is to use query strings library.
const queryString = require('query-string'); const parsed = queryString.parse(props.location.search);You can also use
URLSearchParamsif you want something native:const params = new URLSearchParams(props.location.search) const foo = params.get('name')You should use a polyfill for IE11.
-
Why you get "Router may have only one child element" warning?
You have to wrap your Route's in a
<Switch>block because<Switch>is unique in that it renders a route exclusively.At first you need to add
Switchto your imports:import { Switch, Router, Route } from 'react-router'Then define the routes within
<Switch>block:<Router> <Switch> <Route {/* ... */} /> <Route {/* ... */} /> </Switch> </Router> -
How to pass params to
history.pushmethod in React Router v4?While navigating you can pass props to the
historyobject:this.props.history.push({ pathname: '/template', search: '?name=sudheer', state: { detail: response.data } })The
searchproperty is used to pass query params inpush()method. -
How to implement default or NotFound page?
A
<Switch>renders the first child<Route>that matches. A<Route>with no path always matches. So you just need to simply drop path attribute as below<Switch> <Route exact path="/" component={Home}/> <Route path="/user" component={User}/> <Route component={NotFound} /> </Switch> -
How to get history on React Router v4?
Below are the list of steps to get history object on React Router v4,
-
Create a module that exports a
historyobject and import this module across the project.For example, create
history.jsfile:import { createBrowserHistory } from 'history' export default createBrowserHistory({ /* pass a configuration object here if needed */ }) -
You should use the
<Router>component instead of built-in routers. Imported the abovehistory.jsinsideindex.jsfile:import { Router } from 'react-router-dom' import history from './history' import App from './App' ReactDOM.render(( <Router history={history}> <App /> </Router> ), holder) -
You can also use push method of
historyobject similar to built-in history object:// some-other-file.js import history from './history' history.push('/go-here')
-
-
How to perform automatic redirect after login?
The
react-routerpackage provides<Redirect>component in React Router. Rendering a<Redirect>will navigate to a new location. Like server-side redirects, the new location will override the current location in the history stack.import React, { Component } from 'react' import { Redirect } from 'react-router' export default class LoginComponent extends Component { render() { if (this.state.isLoggedIn === true) { return <Redirect to="/your/redirect/page" /> } else { return <div>{'Login Please'}</div> } } }
React Internationalization
-
What is React Intl?
The React Intl library makes internalization in React straightforward, with off-the-shelf components and an API that can handle everything from formatting strings, dates, and numbers, to pluralization. React Intl is part of FormatJS which provides bindings to React via its components and API.
-
What are the main features of React Intl?
Below are the main features of React Intl,
-
Display numbers with separators.
-
Display dates and times correctly.
-
Display dates relative to "now".
-
Pluralize labels in strings.
-
Support for 150+ languages.
-
Runs in the browser and Node.
-
Built on standards.
-
-
What are the two ways of formatting in React Intl?
The library provides two ways to format strings, numbers, and dates:
-
Using react components:
<FormattedMessage id={'account'} defaultMessage={'The amount is less than minimum balance.'} /> -
Using an API:
const messages = defineMessages({ accountMessage: { id: 'account', defaultMessage: 'The amount is less than minimum balance.', } }) formatMessage(messages.accountMessage)
-