2017-02-21 4 views
3

react-apollo bietet die Möglichkeit Komponente Requisiten zu konvertieren Variablen abzufragen:react-apollo - Wie setze ich Abfragevariablen von einer umschlossenen Komponente?

<MyComponentWithData propsForQueryVariables={...} /> 

Aber ich brauche Abfrage mit Variablen aus gewickelter Komponente starten.

Etwas wie:

class MyComponent extends React.Component { 
    //... 
    onReady() { 
    // should be first request to server 
    this.props.refetch({ 
     // variables here 
    }) 
    } 

    onFilterChanged() { 
    this.props.refetch({ 
     // new variables here 
    }) 
    } 
} 

const MyComponentWithData = graphql(QUERY, { 
    options: { 
    waitUntilComponentStartQuery: true 
    // pollInterval:... 
    }, 
    props({ data: { items, refetch } }) { 
    return { 
     items: items, 
     refetch: refetch 
    }; 
    } 
})(MyComponent); 

UPDATE

QUERY für MyComponent sieht aus wie

query getItems($filter: JSON!) { 
items(filter: $filter) { 
    id 
    name 
} 
} 

filternicht auf NULL festlegbare ist. Daher sollte die erste Anforderung die gültige Variable filter haben, und diese Variable sollte in der umschlossenen Komponente erstellt werden.

+0

mit graphcool Ich konnte den Filter nicht funktionieren, gibt an, dass man keine Objekte als Kinder übergeben kann und so weiter. Irgendwelche Ideen, wohin man von dort geht? –

Antwort

1

refetch akzeptiert ein variables Objekt als Argument, siehe documentation.

+0

Ja, aber bevor 'refetch' an die umschlossene Komponente übergeben wird, react-apollo holt die Abfrage mit" ungültigen "Variablen. Ich brauche die erste Anfrage mit Variablen aus der umschlossenen Komponente. Nicht zweit. –

4

Sie können die Eltern Requisiten auf die Variablen der Anstich holen in der graphql HoC, wie folgt aus:

ParentComponent.jsx

import ChildComponent from './ChildComponent'; 

const ParentComponent =() => <ChildComponent filterPropValue="myDefaultFilterValue" />; 

export default ParentComponent; 

ChildComponent.jsx

class ChildComponent extends React.Component { 
    refresh() { 
    this.props.refetch({ 
     filter: 'mynewFilterValue' 
    }); 
    } 

    render() { 
    return (
     <div>I am a child component with {this.props.items.length} items.</div> 
    ); 
    } 
} 

export default graphql(MyQuery, { 
    options: (props) => ({ 
    variables: { 
     filter: props.filterPropValue 
    } 
    }), 
    props: ({ data: { items, error, refetch }) => ({ 
    items, 
    error, 
    refetch 
    }) 
})(ChildComponent); 

Nachträgliche refetches mit neuen Parameter können dann über refetch() behandelt werden.

+1

Ich habe eine Abfrage wie 'Abfrage getItems ($ Filter: JSON!) {Artikel (Filter: $ Filter) {ID}}'. 'filter' ist ** nicht nullable **. Also erste Anfrage, sollte gültige Variable 'Filter' haben. 'MyComponentWithData' hat keine Requisiten und' reps.myParentParam' ist hier nicht geeignet. –

+1

Wo planen Sie dann den ersten Filterwert? Es muss von einem Elternteil kommen, oder es muss fest codiert sein, das sind Ihre einzigen Optionen. Was bedeutet, dass Sie es über 'options.variables' einstellen sollten. – pleunv

+0

Ich habe mein Codebeispiel oben aktualisiert, um den Ansatz besser zu veranschaulichen. 'ParentComponent' füttert' ChildComponent' mit dem anfänglichen Standardfilterwert, nach dem 'ChildComponent' mit einem anderen Parameter erneut holen kann, wenn dies notwendig ist. Alternativ könnte der Filterwert auch im 'ParentComponent'-Zustand gespeichert werden, und durch Übergabe einer' updateFilter (filter) 'Methode an' ChildComponent' könnte man sie von dort aus manipulieren. – pleunv

Verwandte Themen