Ich habe einige Probleme beim Einrichten eines RefetchContainer in Relay Modern. Eine übergeordnete Komponente ist der QueryRenderer, der eine erste Abfrage ausführt und die Requisiten der untergeordneten Komponente entsprechend auffüllt (a-proprietär? Eh? Eh ?!). Der refetchContainer gibt alle unsere Variablen an und führt bei einem onChange-Ereignis des Eingabefelds eine Abfrage mit den neuen Variablen erneut aus. Das alles funktioniert perfekt, außer dass die Requisiten des Kindes nie mit den neuen empfangenen Daten aktualisiert werden. Ich kann den Relay-Speicher aufschlüsseln und feststellen, dass die Abfrage tatsächlich mit den entsprechenden Daten empfangen wurde. Ich habe mir eine Weile den Kopf dagegen gedrückt und würde mich über Hilfe freuen. Vermutlich etwas einfaches, was mir fehlt. Und Gott weiß, Relay Modern Dokumentation ist spärlich.Relay Modern RefetchContainer Requisiten werden nicht an Komponente übergeben
Ich habe herumgestochert und kann keine geeignete Lösung finden. Dieser Kerl scheint ein ähnliches Problem zu haben: relay refetch doesn't show the result
die übergeordnete Komponente mit QueryRenderer:
import React, { Component } from 'react';
import { connect } from 'react-redux';
import PropTypes from 'prop-types';
import { graphql, QueryRenderer } from 'react-relay';
import Search from './Search';
const propTypes = {
auth: PropTypes.object.isRequired,
};
class SearchContainer extends Component {
render() {
return (
<QueryRenderer
query={graphql`
query SearchContainerQuery($search: String!){
users: searchUsers(search:$search, first:10){
...Search_users
}
}`}
variables={{ search: 'someDefaultSearch' }}
environment={this.props.auth.environment}
render={({ error, props }) => {
if (error) {
console.log(error);
}
if (props) {
return <Search users={props.users} />;
}
return <div>No Dice</div>;
}}
/>
);
}
}
SearchContainer.propTypes = propTypes;
export default connect(state => ({ auth: state.auth }))(SearchContainer);
Das Kind Komponente mit createRefetchContainer:
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { createRefetchContainer, graphql } from 'react-relay';
const propTypes = {
relay: PropTypes.object.isRequired,
users: PropTypes.object,
};
const defaultProps = {
users: {},
};
class Search extends Component {
render() {
return (
<div>
<input
type="text"
onChange={(e) => {
e.preventDefault();
this.props.relay.refetch({
search: e.target.value,
});
}}
/>
<ul>
{this.props.users.nodes.map(user =>
<li key={user.id}>{user.username}</li>,
)}
</ul>
</div>
);
}
}
Search.propTypes = propTypes;
Search.defaultProps = defaultProps;
export default createRefetchContainer(
Search,
{
users: graphql.experimental`
fragment Search_users on SearchUsersConnection
@argumentDefinitions(
search: {type: "String", defaultValue: ""}
) {
nodes {
id
displayName
username
}
}
`,
},
graphql.experimental`
query SearchRefetchQuery($search: String!) {
users: searchUsers(search:$search, first:10){
...Search_users @arguments(search: $search)
}
}
`,
);
GraphQL sieht wie folgt aus:
# A connection to a list of `User` values.
type SearchUsersConnection {
# Information to aid in pagination.
pageInfo: PageInfo!
# The count of *all* `User` you could get from the connection.
totalCount: Int
# A list of edges which contains the `User` and cursor to aid in pagination.
edges: [SearchUsersEdge]
# A list of `User` objects.
nodes: [User]
}
Netzwerk c Alles wird passend gemacht und die Daten werden wie erwartet zurückgegeben. NetworkCalls
Es scheint, die @arguments Richtlinie hier aus der erneuten Abruf Abfrage gelassen werden kann:
query SearchRefetchQuery($search: String!) {
users: searchUsers(search:$search, first:10){
...Search_users @arguments(search: $search)
}
}
(Entfernen sie keine Wirkung zu haben scheinen)
versucht, ich habe das Hinzufügen der @arguments Anweisung an das Fragment der Elternkomponente gemäß der Empfehlung hier: Pass variables to fragment container in relay modern, ohne Wirkung.
leider nicht viel helfen .. FWIW Ich habe die QueryRenderer für einfach vorbei neue Requisiten refetchContainers vollständig fallen gelassen, die die Arbeit erledigt wird. Beispiel: https://github.com/NCI-GDC/portal-ui/blob/next/src/packages/@ncigdc/modern_components/GenesTable/GenesTable.relay.js – azium
@azium Ja, das scheint ganz gut zu funktionieren. Es stört mich nur, dass der eigens dafür entwickelte refetchContainer so schwierig einzurichten ist! – cntrlz
ich genau das gleiche Problem mit und ich bin hämmern TOO meinen Kopf an der Wand :( –