Skip to content

Form & kiểm tra dữ liệu ​

Form + Field lo phần bố cục, nhãn, chữ hướng dẫn và kiểm tra dữ liệu có i18n dùng chung rules của @thl-ui/core. Lỗi hiện sau lần submit đầu tiên và cập nhật ngay khi sửa; thông báo theo ngôn ngữ hiện tại.

Kiểm tra dữ liệu ​

Kiểm tra dữ liệu
vue
<ThlForm :values="v" @submit="submit">
  <ThlField label="Name" name="name" :value="v.name" :rules="[rules.required(), rules.minLength(3)]" required v-slot="{ id }"><ThlInput :id="id" v-model="v.name" /></ThlField>
  <ThlField label="Email" name="email" :value="v.email" :rules="[rules.required(), rules.email()]" required v-slot="{ id }"><ThlInput :id="id" v-model="v.email" type="email" /></ThlField>
  <ThlField label="Password" name="password" :value="v.password" :rules="[rules.required(), rules.minLength(6)]" required v-slot="{ id }"><ThlInput :id="id" v-model="v.password" type="password" /></ThlField>
  <ThlField label="Confirm" name="confirm" :value="v.confirm" :rules="[rules.match('password')]" v-slot="{ id }"><ThlInput :id="id" v-model="v.confirm" type="password" /></ThlField>
  <ThlField name="agree" :value="v.agree" :rules="[rules.required()]"><ThlCheckbox v-model="v.agree" label="I agree to the terms" /></ThlField>
  <ThlFormActions><ThlButton type="submit" variant="success" icon="check">Submit</ThlButton><ThlButton type="reset">Reset</ThlButton></ThlFormActions>
</ThlForm>
tsx
import { Form, Field, FormActions, Input, Checkbox, Button, rules } from '@thl-ui/react';

<Form values={v} onSubmit={(values, ok) => ok && save(values)}>
  <Field label="Email" name="email" value={v.email} rules={[rules.required(), rules.email()]} required>
    {(id) => <Input id={id} type="email" value={v.email} onChange={(e) => setV({ ...v, email: e.target.value })} />}
  </Field>
  <Field name="agree" value={v.agree} rules={[rules.required()]}>
    <Checkbox checked={v.agree} onChange={(agree) => setV({ ...v, agree })} label="I agree" />
  </Field>
  <FormActions><Button type="submit" variant="success">Submit</Button></FormActions>
</Form>
html
form = new FormGroup({
  email: new FormControl('', thlValidators(rules.required(), rules.email())),
  agree: new FormControl(false, thlValidators(rules.required())),
});

<form class="thl-form" [formGroup]="form" (ngSubmit)="submit()">
  <thl-field label="Email" for="email" required [control]="form.controls.email">
    <input thlInput id="email" formControlName="email" />
  </thl-field>
  <thl-field [control]="form.controls.agree"><thl-checkbox formControlName="agree" label="I agree" /></thl-field>
  <div class="thl-form__actions"><button thl-button type="submit" variant="success">Submit</button></div>
</form>

Bố cục & trạng thái ​

Bố cục & trạng thái
vue
<div class="thl-row">
  <div class="thl-col-12 thl-col-md-6"><ThlForm layout="horizontal"><ThlField label="Name" for="h1"><ThlInput id="h1" /></ThlField><ThlField label="Email" for="h2"><ThlInput id="h2" /></ThlField></ThlForm></div>
  <div class="thl-col-12 thl-col-md-6"><ThlField label="Success" status="success" help="Looks good!"><ThlInput model-value="ok" /></ThlField><ThlField label="Error" error="Something went wrong"><ThlInput /></ThlField></div>
</div>
tsx
<Form layout="horizontal">…</Form>
<Field label="Success" status="success" help="Looks good!"><Input defaultValue="ok" /></Field>
<Field label="Error" error="Something went wrong"><Input /></Field>
html
<form class="thl-form thl-form--horizontal">…</form>
<thl-field label="Success" status="success" help="Looks good!"><input thlInput value="ok" /></thl-field>
<thl-field label="Error" error="Something went wrong"><input thlInput /></thl-field>

Luật kiểm tra ​

rules.required(), email(), minLength(n), maxLength(n), min(n), max(n), number(), pattern(re), match(field). Một rule là hàm (value, allValues) => { key, params } | null — tự viết rule riêng thì key của nó cũng được dịch như rule có sẵn:

ts
const strong: Rule = (v) => /[A-Z]/.test(String(v ?? '')) ? null : { key: 'app.validation.uppercase' };

required cũng báo lỗi khi checkbox chưa được tick (false).

API ​

Form

<ThlForm> · import { ThlForm } from '@thl-ui/vue'

PropKiểuMặc định
layoutstring"vertical"
borderedboolean—
valuesobject—

Sự kiện: submit

Slot: default

Field

<ThlField> · import { ThlField } from '@thl-ui/vue'

PropKiểuMặc định
labelstring—
helpstring—
errorstring—
requiredboolean—
namestring—
valueany—
rulesarray—
statusstring—
forstring—

Slot: default

FormActions

<ThlFormActions> · import { ThlFormActions } from '@thl-ui/vue'

PropKiểuMặc định

Slot: default