Je commence avec Relay et essaye de faire fonctionner correctement mon routage. Malheureusement, je n'ai pas beaucoup de chance.Comment faire fonctionner Relay et React Routing correctement?
Voici l'erreur que je reçois:
Uncaught TypeError: Component.getFragment is not a function
Voici le code que j'ai pour votre référence:
index.jsx
import React from 'react';
import ReactDOM from 'react-dom';
import Relay from 'react-relay';
import {Router, Route, IndexRoute, browserHistory} from 'react-router';
import {RelayRouter} from 'react-router-relay';
import App from './modules/app';
import Home from './modules/home';
const AppQueries = {
store: (Component) => Relay.QL `query {
store {
${Component.getFragment('store')}
}
}`
};
ReactDOM.render(
<RelayRouter history={browserHistory}>
<Route path='/' component={App} queries={AppQueries}>
<IndexRoute component={Home}/>
</Route>
</RelayRouter>,
document.getElementById('ch-root'));
app.jsx
import React, {Component} from 'react';
import Relay from 'react-relay';
import Header from './ui/header';
import Footer from './ui/footer';
class App extends Component {
render() {
return (
<div id="ch-container">
<Header/>
<section id="ch-body">
{this.props.children}
</section>
<Footer/>
</div>
);
}
}
App = Relay.createContainer(App, {
fragments: {
store: (Component) => Relay.QL `
fragment on Store {
${Component.getFragment('store')}
}
`
}
});
export default App;
home.jsx
import React, {Component} from 'react';
import Relay from 'react-relay';
import Loader from './ui/loader';
import AccountSelector from './account/account-selector';
const APP_HOST = window.CH_APP_HOST;
const CURR_HOST = `${window.location.protocol}//${window.location.host}`;
class Home extends Component {
state = {
activeAccount: null,
loading: true
}
render() {
const {activeAccount, loading} = this.state;
if (loading) {
return <Loader/>;
}
if (!activeAccount && !loading) {
return <AccountSelector/>;
}
return (
<h1>Hello!</h1>
);
}
}
Home = Relay.createContainer(Home, {
fragments: {
store:() => Relay.QL `
fragment on Store {
accounts {
unique_id,
subdomain
}
}
`
}
});
export default Home;
MISE À JOUR
J'ai fait quelques changements suggérés par freiksenet
comme ci-dessous. Mais cela soulève les deux questions suivantes:
- Que se passerait-il lorsque je change la route et un autre que
Home
composant obtient affichés par le composantApp
? - Je reçois maintenant cette erreur:
Warning: RelayContainer: Expected prop
store
to be supplied toHome
, but gotundefined
. Pass an explicitnull
if this is intentional.
Voici les changements:
index.jsx
const AppQueries = {
store:() => Relay.QL `query {
store
}`
};
app.jsx
import Home from "./home";
...
App = Relay.createContainer(App, {
fragments: {
store:() => Relay.QL `
fragment on Store {
${Home.getFragment('store')}
}
`
}
});
L'erreur signifie qu'elle ne sait pas ce qu'est 'Component'. Vous devrez l'importer de la même manière que vous avez importé 'App' et' Home'. Je suppose que l'erreur est générée sur le fichier 'index'? – Chris
@Moon Réponse à votre UPDATE 1: Question 2: Vous n'avez transmis aucune requête pour le composant 'Home'. Dans le fichier index.jsx, changez 'en requêtes = {AppQueries}'. Question 1: Comme @freiksenet l'a déjà mentionné, 'App' ne doit pas nécessairement être conteneur. Les autres composants rendus par 'App' n'ont besoin que de fragments nécessaires. –