reactjs - Ved bruk av react-apollo, hvordan definere 2 mutasjoner i samme komponent med TypeScript?


Ved å bruke følgende problem på GitHub er jeg i stand til å få en mutasjon til å fungere med Typescript. Men jeg fant ikke en måte å bruke 2 mutasjoner i samme komponent på.

Det finnes bare én mutate()-funksjon i this.props.

Hvordan må vi skrive vår komponent for å få den til å forstå name-alternativene som sendes til GraphQL?

graphql<ContainerProps, {}, string, ContainerProps>(gql`... `, { name: 'deleteData' });
graphql<ContainerProps, {}, string, ContainerProps>(gql`...`, { name: 'createData' });

REDIGER: Hvis de 2 mutasjonene har det samme parameteret navnet (en string kalt id for eksempel), trenger vi virkelig å pakke disse parameterne inn i en eksplisitt type?

REDIGER 2: Jeg får denne unntaket når jeg erklærer de 2 mutasjonene med { name: 'xxx' }:

TypeError: _this.props.mutate er ikke en funksjon

Hvis jeg erklærer bare én mutasjon (uten navnealternativet), fungerer det som det skal.

Svar #1

Basert på lenken gitt av Miro Lehtonen, her er hva som fungerer for meg.

type MutationProps = {
    create: MutationFunc<IResponse, ICreateVariables>;
    delete: MutationFunc<IResponse, IDeleteVariables>;
};

type ContainerProps = OtherQueryProps & MutationProps;

const withCreate =
    graphql<ContainerProps, IResponse, ICreateVariables, ContainerProps>(
        CreateMutation,
        {
            // tslint:disable-next-line:no-any
            props: ({ mutate, ...rest }): any => ({
                ...rest,
                create: mutate
            })
        });

Koden er den samme for delete-muteringen.

Koden fungerer, men jeg liker ikke å ha any i den. Jeg fant ikke en måte å korrekt typisere propsene på, og jeg tror ikke jeg returnerer riktig type (selv om det fungerer fint). Alle forslag er veldig velkomne (om hvordan man kan fjerne any).

Svar #2

Standardnavnet for en mutasjon vil være mutate som du kan få tilgang til gjennom props.mutate. Hvis du ønsker å ha flere mutasjoner i samme komponent, må du gi dem navn som deleteData og createData. Disse er tilgjengelige gjennom props.deleteData og props.createData.

En god praksis er å gi navn til alle mutasjoner, bare for å gjøre koden din lettere å lese. Som et generisk navn er mutate ikke veldig beskrivende.