# Form フォーム

LhForm + LhFormItem の組み合わせです。モデルバリデーション(required / カスタムルール)、エラー表示(role="alert")、子コントロールの aria-invalid 連動、全体の validate / resetFields を備えます。

フォームバリデーション
<template>
  <div style="max-width: 640px">
    <LhForm ref="form" :model="form" :rules="rules" label-width="80px">
      <LhFormItem prop="name" label="氏名" required>
        <LhInput v-model="form.name" placeholder="氏名を入力してください" />
      </LhFormItem>
      <LhFormItem prop="genre" label="題材">
        <LhSelect v-model="form.genre" :options="genres" placeholder="選択してください" />
      </LhFormItem>
      <LhFormItem>
        <LhButton type="primary" @click="submit">送信</LhButton>
        <LhButton @click="reset">リセット</LhButton>
      </LhFormItem>
    </LhForm>
    <p class="demo-note">送信結果:{{ result }}</p>
    <p class="demo-note" style="margin-top: 16px">label-position="top":</p>
    <LhForm :model="form2" label-position="top">
      <LhFormItem prop="name" label="氏名">
        <LhInput v-model="form2.name" placeholder="ラベルを上部に配置" />
      </LhFormItem>
    </LhForm>
    <p class="demo-note" style="margin-top: 16px">inline のインラインフォーム:</p>
    <LhForm :model="form3" inline>
      <LhFormItem prop="name" label="氏名">
        <LhInput v-model="form3.name" placeholder="インライン" />
      </LhFormItem>
      <LhFormItem prop="genre" label="題材">
        <LhSelect v-model="form3.genre" :options="genres" placeholder="インライン" />
      </LhFormItem>
    </LhForm>
  </div>
</template>

<script>
export default {
  data: () => ({
    form: { name: '', genre: '' },
    form2: { name: '' },
    form3: { name: '', genre: '' },
    rules: { name: [{ required: true, message: '' }] },
    genres: [
      { value: 'shan', label: '山水' },
      { value: 'hua', label: '花鳥' },
    ],
    result: '(未送信)',
  }),
  methods: {
    submit() {
      const form = this.$refs.form
      form.validate().then((ok) => {
        this.result = ok ? 'バリデーション成功 ✓' : 'バリデーション失敗:氏名は必須です'
      })
    },
    reset() {
      this.$refs.form.resetFields()
      this.result = '(リセット済み)'
    },
  },
}
</script>

# Form Props

プロパティ 説明 型 デフォルト値
model データモデル(必須) Record<string, unknown> —
rules バリデーションルール(キーは prop のパス) Record<string, LhFormRule[]> —
labelPosition ラベルの位置 'left' \| 'right' \| 'top' 'right'
labelWidth ラベルの幅 string \| number —
inline インラインレイアウト boolean false

# FormItem Props

プロパティ 説明 型 デフォルト値
prop model のフィールドパスに対応(a.b の深いパスをサポート) string —
label / required / rules ラベル、必須の星印、ローカルルール(form のルールとマージ) — —

# メソッド

メソッド 説明
validate() 全フィールドをバリデーション(登録項目 + rules で上書きされた項目)し、Promise<boolean> を返す
validateField(prop) 単一フィールドをバリデーション
resetFields() / resetField(prop) 初期値に戻す(マウント時に rules のキーでスナップショットを取得)

ヒント

フォームコントロールのバリデーション失敗の連動は自動的です。コントロールが LhFormItem のコンテキストに注入され、errorMessage が空でなければ aria-invalid がレンダリングされるため、手動でのバインドは不要です。

Copyright © 2024-2026 FengMo WenXue