Relay integration for React Router.
Use ReactRouterRelay.createElement
on your <Router>
, then define Relay queries and render callbacks for each of your routes:
import ReactRouterRelay from 'react-router-relay';
/* ... */
const ViewerQueries = {
viewer: () => Relay.QL`query { viewer }`
};
ReactDOM.render((
<Router history={history} createElement={ReactRouterRelay.createElement}>
<Route
path="/" component={Application}
queries={ViewerQueries}
>
<Route
path="widgets" component={WidgetList}
queries={ViewerQueries}
queryParams={['color']} stateParams={['limit']}
renderLoading={() => <Loading />}
/>
<Route
path="widgets/:widgetId" component={Widget}
queries={ViewerQueries}
/>
</Route>
</Router>
), container);
react-router-relay
will automatically generate a combined Relay route with all queries and parameters from the active React Router routes, then pass down the query results to each of the route components. As the queries are all gathered onto a single route, they'll all be fetched at the same time, and the data for your entire page will load and then render in one go.
You can find an example implementation of TodoMVC with routing using react-router-relay
at https://github.com/taion/relay-todomvc.
The Relay technical preview requires React 14, which limits compatibility to the 1.0.0-beta
releases of React Router. Currently, react-router-relay
supports the 1.0.0-beta3
release of React Router:
$ npm install react@next react-dom@next react-relay [email protected]
$ npm install react-router-relay
For each of your routes that requires data from Relay, define a queries
prop on the <Route>
. These should be just like the queries on a Relay route:
const ViewerQueries = {
viewer: () => Relay.QL`query { viewer }`
};
const applicationRoute = (
<Route
path="/" component={Application}
queries={ViewerQueries}
/>
);
Just like with Relay.RootContainer
, the component will receive the query results as props, in addition to the other injected props from React Router.
If your route doesn't have any dependencies on Relay data, just don't declare queries
. The only requirement is that any route that does define queries
must have a Relay container as its component.
Any URL parameters for routes with queries and their ancestors will be used as parameters on the Relay route. You can then use these route parameters as variables on your containers:
class Widget extends React.Component { /* ... */ }
Widget = Relay.createContainer(Widget, {
initialVariables: {
widgetId: null
},
fragments: {
viewer: () => Relay.QL`
fragment on User {
widget(widgetId: $widgetId) {
name
}
}
`
}
});
// This handles e.g. /widgets/3.
const widgetRoute = (
<Route
path="widgets/:widgetId" component={Widget}
queries={ViewerQueries}
/>
);
If your route requires parameters from the location query or state, you can specify them respectively on the queryParams
or stateParams
props on the <Route>
. react-router-relay
will then add those parameters to the Relay route:
class WidgetList extends React.Component { /* ... */ }
WidgetList = Relay.createContainer(WidgetList, {
initialVariables: {
color: null,
limit: null
},
prepareVariables(prevVariables) {
let {limit} = prevVariables;
if (limit == null) {
limit = 10;
}
return {
...prevVariables,
limit
};
},
fragments: {
viewer: () => Relay.QL`
fragment on User {
widgets(color: $color, first: $limit) {
edges {
node {
name
}
}
}
}
`
}
});
// This handles e.g. /widgets?color=blue.
const widgetListRoute = (
<Route
path="widgets" component={WidgetList}
queries={ViewerQueries}
queryParams={['color']} stateParams={['limit']}
/>
);
All URL and query parameters will be passed to the container as strings. Any missing query or state parameters will be treated as null
. If you need to convert or initialize those values, you can do so in prepareVariables
on the container.
You can pass in custom renderLoading
, renderFetched
, and renderFailure
callbacks to your routes:
<Route /* ... */ renderLoading={() => <Loading />} />
These have the same signature and behavior as they do on Relay.RootContainer
, except that the argument to renderFetched
also includes the injected props from React Router. As on Relay.RootContainer
, the renderLoading
callback can simulate the default behavior of rendering the previous view by returning undefined
.
react-router-relay
only updates the Relay route on actual location changes. Specifically, it will not update the Relay route after changes to location state, so ensure that you update your container variables appropriately when updating location state.react-router-relay
uses referential equality on route objects to generate unique names for queries. If yourroute
objects do not maintain referential equality, then you can specify a globally uniquename
property on the route to identify it.- Relay containers attempt to avoid re-rendering except when necessary. However, they can only do so when all props not through Relay are of scalar types. As the props injected by Relay Router into route components are not of static types, this optimization does not work there. As such, when using React Router with Relay, you should attempt to make the
render
method on any route components as lightweight as possible, and leave the real rendering work to child components that only receive scalar non-Relay props.
react-router-relay's People
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. ๐๐๐
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google โค๏ธ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.