Wie zu zwingen, Apollo-Abfrage-Komponente re-Abfrage ausführen, wenn die übergeordnete Komponente neu gerendert
Ich bin mit Apollo Client <Query>
innerhalb einer Komponente, die neu gerendert, wenn sich der Zustand geändert wird innerhalb eines Lebenszyklus-Methode. Ich möchte meine <Query>
Komponente führen Sie die Abfrage erneut, weil ich weiß, dass sich Daten geändert haben.
Es scheint, dass die Abfrage-Komponente ist die Verwendung eines Caches, das muss für ungültig erklärt werden, bevor die Abfrage wird erneut ausgeführt.
Ich bin mit einem wonky Problemumgehung, mit der die caches der refetch
Rückruf vom render prop in der übergeordneten Komponente, aber es fühlt sich falsch an. Ich werde meinen Ansatz in die Antworten, wenn jemand interessiert ist.
Mein code sieht ungefähr so aus. Ich entfernte loading
und error
Handhabung von Abfragen sowie einige andere Details für die Kürze.
class ParentComponent extends React.Component {
componentDidUpdate(prevProps) {
if (this.props.refetchId !== prevProps.refetchId) {
const otherData = this.processData() //do something
this.setState({otherData}) //this forces component to reload
}
}
render() {
const { otherData } = this.state
return (
<Query query={MY_QUERY}>
{({ data }) => {
return <ChildComponent gqlData={data} stateData={otherData} />
}}
</Query>
)
}
}
Wie kann ich Kraft <Query>
zu Holen, neue Daten zu übergeben <ChildComponent>
?
Obwohl ParentComponent
neu gerendert, die als Requisiten oder Statusänderung Query
nicht erneut ausführen. ChildComponent
bekommt einen aktualisierten stateData
Stütze, aber hat eine veraltete gqlData
prop. So wie ich das verstehe Apollo query-cache für ungültig erklärt werden müssen, aber ich bin mir nicht sicher.
Bitte beachten Sie, dass übergeben refetch
zu ChildComponent ist nicht die Antwort, weil es zeigt nur Informationen GraphQL und nicht weiß, Wann refetch. Ich will nicht vorstellen, Timer oder sonst erschweren ChildComponent
um dieses Problem zu lösen - er braucht nicht zu wissen über diese Komplexität oder Daten abrufen betrifft.
- Hinzugefügt habe ich paar Optionen, benutzte ich immer die erste, die zweite Methode würde nicht funktionieren, wenn Sie nicht möchten, übergeben Sie nichts auf.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hatte ich fast eine ähnliche situation, die ich gelöst mit
fetchPolicy
Attribut:<Query fetchPolicy="no-cache"
...Aufgabe war die Last einige details vom server durch einen Klick auf ein Listenelement.
Und wenn ich wollte, um eine Aktion zu zwingen, wieder-Holen Sie die Abfrage (wie das ändern der details), habe ich zunächst zugewiesen
refetch
zuthis.refetch
:Und der spezifischen Aktion, die ich wollte die refetch passieren sollte, rief ich:
Scheint es mir, dass die Query-Komponente, die nicht unbedingt sein müssen, innerhalb dieses
ParentComponent
.In diesem Fall, würde ich bewegen die Query-Komponente, da würde ich immer noch in der Lage sein, um machen andere Sachen, während ich nicht haben, Ergebnisse in der
ChildComponent
. Und dann hätte ich Zugriff auf diequery.refetch
Methode.Beachten Sie, dass im Beispiel habe ich den
graphql
hoc, aber man kann immer noch mit der Abfrage-Komponente aus, um<ParentComponent />
.<Query>
ist eine schlechte Wahl für fast jeden Anwendungsfall eine andere als die triviale lieben.Konnte Sie refetch in übergeordneten Komponente? Wenn der parent-Komponente ein update bekommen, dann kann man beurteilen, ob der Auslöser eine Holen oder nicht.
Ich habe es getan, ohne mit
Query
wie folgt:So können Sie Ihre trigger abrufen, Wann immer Sie es wollen. Sie können den query-as-a
prop
in diesem Fall.Für Ihren Fall, setzen Sie Ihre Abfrage in ein prop mit
export default graphql(addSongQuery)(SongCreate);
. Dann rufen Sie in Ihrem lifecyclehooksDidUpdate
.Anderen Optionen ist die Verwendung
refetch
auf Abfrage.Die zweite Methode würde verlangen, dass Sie pass etwas runter, um Ihr Kind, das ist nicht wirklich schlecht.
re-render
verwenden der lifecycle-hooks.Wie versprochen, hier ist mein hacky Abhilfe