2

オブジェクトの配列を受け取ることを期待するクエリを呼び出すReactコンポーネントがあります(検証データ用)。次に、それを使用して html フォームを検証します。これは、apollo Mutation 要素内で定義されます。コンポーネント メソッドの return ステートメント内で構造化されているrender()方法は機能しますが、面倒に見え、コールバック地獄の時代を思い出させます。<QueryCustomerValidations>私が本当にやりたいことは、メソッド内の要素を取り除き、render()(理想的には)componentDidMountライフサイクル イベントに移動することです。後でフォーム内で使用するためにバリデーターをそこにロードできるように、<MutationCreateCustomer>render() 内をそのままにしておきます。

現時点では、フォームをミューテーション内にラップする必要があります。適切な順序で非同期データを受け取るためにクエリが返すアロー関数内のミューテーション。

    //-------------------------------------------------------------------------
    // Component Lifecycle Eventhandler Methods
    //-------------------------------------------------------------------------
    componentDidMount()
    {

    }    


    //-------------------------------------------------------------------------
    // Render Method Section
    //-------------------------------------------------------------------------
    public render(): JSX.Element
    {
        // Return Form
        return (
            <React.Fragment>
                {/* PAGE TITLE  */}
                <h2 className="text-center mb-3">Agregar Nuevo Cliente</h2>

                {/* LOAD VALIDATIONS INTO STATE  */}
                <QueryCustomerValidations
                    query={Q_GET_CUSTOMER_VALIDATIONS}
                >
                    {({ loading: loadingValidations, error: errorValidations, data: dataValidations }) =>
                    {
                        if (loadingValidations)
                        {
                            return "Cargando..."
                        }
                        if (errorValidations)
                        {
                            return `Error: ${errorValidations.message}`
                        }
                        if (dataValidations)
                        {
                            const validators: ValidationDescriptor[] = []
                            dataValidations.getCustomerValidations.forEach((validator) => {
                                validators.push(validator as ValidationDescriptor)
                            })
                            this.validators.setValidators(validators)
                        }

                        /* DATA ENTRY FORM  */
                        return (
                            <div className="row justify-content-center">

                                <MutationCreateCustomer 
                                    mutation={M_CREATE_CUSTOMER}
                                    onCompleted={() => this.props.history.push('/')}
                                >
                                    {(createCustomer: any) => {
                                        return (                                            
                                            <form name="frmNewCustomer"
                                                    className="col-md-8 m-3"
                                                    onSubmit={e => this.frmNewCustomer_submit(e, createCustomer)}
                                            >

                                                { this.ctrl_form_layout(this.props, this.state, this.validators) }

                                            </form>
                                        )
                                    }}
                                </MutationCreateCustomer>
                            </div>
                        )
                    }}

                </QueryCustomerValidations>

            </React.Fragment>
        );
    }

ドキュメントの目的で、クエリを作成するためのインターフェイスを次に示します。apollo クライアントを使用してサーバーからこのデータの一部を取得するため、この場合、単純なグラフクエリ ソリューションはonDidMount()機能しません。

getCustomerValidations.ts (Interfaces)


// ====================================================
// GraphQL query operation: getCustomerValidations
// ====================================================

export interface getCustomerValidations_getCustomerValidations {
  __typename: "ValidationDescriptor";
  field: string | null;
  type: string | null;
  required: boolean;
  max: number | null;
  min: number | null;
  regex: string | null;
}

export interface getCustomerValidations {
  getCustomerValidations: getCustomerValidations_getCustomerValidations[];
}

customer-validations.query.ts (Client side query types)


//---------------------------------------------------------------------------------
// Imports Section (React/Apollo Libs)
//---------------------------------------------------------------------------------
import { gql }                              from 'apollo-boost';
import { Query }                            from 'react-apollo'

import { getCustomerValidations }            from '../../typeDefs/operations/getCustomerValidations'

//---------------------------------------------------------------------------------
// GQL Query: Customers
//---------------------------------------------------------------------------------
export const Q_GET_CUSTOMER_VALIDATIONS = gql`
    query getCustomerValidations {
        getCustomerValidations
        {
            field
            type
            required
            max
            min
            regex
        }
    }
`;

//---------------------------------------------------------------------------------
// Query Class: Customers
//---------------------------------------------------------------------------------
export class QueryCustomerValidations extends Query<getCustomerValidations> { }


<QueryCustomerValidations>適切な解決策は、メソッドから要素をコピーしてトリガーするcomponentDidMount()方法、またはメソッドから要素を取り出して、render()何らかの「待機」方法で呼び出す方法です。これにより、最初に呼び出すことができますおよびその後の突然変異 (およびクエリからのデータの使用)。

ありがとう、私はこれを理解するのが本当に簡単ではないことを知っています.

4

1 に答える 1