オブジェクトの配列を受け取ることを期待するクエリを呼び出す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()
何らかの「待機」方法で呼び出す方法です。これにより、最初に呼び出すことができますおよびその後の突然変異 (およびクエリからのデータの使用)。
ありがとう、私はこれを理解するのが本当に簡単ではないことを知っています.