Ich beginne mit Relay und versuche, mein Routing richtig zu machen. Leider habe ich nicht viel Glück. HierWie funktioniert das Relay und React Routing?
ist der Fehler Ich erhalte:
Uncaught TypeError: Component.getFragment is not a function
Hier ist der Code, den ich für Ihre Referenz haben:
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
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;
UPDATE
Ich habe einige von freiksenet
vorgeschlagenen Änderungen wie unten. Aber das wirft die folgenden zwei Probleme:
- Was würde passieren, wenn ich die Strecke und eine andere Komponente ändern, als
Home
wird durch dieApp
Komponente gemacht? - ich jetzt diesen Fehler:
Warning: RelayContainer: Expected prop
store
to be supplied toHome
, but gotundefined
. Pass an explicitnull
if this is intentional.
Hier sind die Änderungen:
index.jsx
const AppQueries = {
store:() => Relay.QL `query {
store
}`
};
import Home from "./home";
...
App = Relay.createContainer(App, {
fragments: {
store:() => Relay.QL `
fragment on Store {
${Home.getFragment('store')}
}
`
}
});
app.jsx
Der Fehler bedeutet, dass es nicht weiß, was "Komponente" ist. Sie müssen es auf ähnliche Weise importieren, wie Sie "App" und "Home" importiert haben. Ich nehme an, dass der Fehler in der 'index' Datei erzeugt wird? – Chris
@Moon Antwort auf Ihre UPDATE 1: Frage 2: Sie haben keine Anfrage für 'Home' Komponente übergeben. In der Datei index.js, Ändere ' ' in ' Abfragen = {AppQueries}'. Frage 1: Wie @freiksenet bereits erwähnt hat, muss 'App' nicht Container sein. Die andere (n) Komponente (n), die von "App" gerendert wird, müssen nur die erforderlichen Fragmente definiert haben. –