入力

ネイティブの入力要素を軽くラップし、面倒なアクセシビリティの懸念を処理し、ホバーやフォーカスなどの状態に対してより意見が反映された状態を提供します。

開始するには、npmを使用してHeadless UIをインストールします。

npm install @headlessui/react

入力はInputコンポーネントを使用して構築されます。

import { Input } from '@headlessui/react'

function Example() {
  return <Input name="full_name" type="text" />
}

ネイティブのinput要素に通常渡すpropsは、Inputに渡すことができます。

Headless UIは、入力がフォーカスされているかどうか、ポップオーバーが開いているか閉じているか、キーボードを使用してメニューのどの項目が現在フォーカスされているかなど、各コンポーネントに関する多くの状態を追跡します。

ただし、コンポーネントはヘッドレスであり、デフォルトでは完全にスタイルが設定されていないため、各状態に必要なスタイルを自分で提供するまで、UIでこの情報を確認することはできません。

Headless UIコンポーネントのさまざまな状態をスタイル設定する最も簡単な方法は、各コンポーネントが公開するdata-*属性を使用することです。

たとえば、Inputコンポーネントは、入力がマウスまたはキーボードを介して現在フォーカスされているかどうかを示すdata-focus属性と、入力が現在マウスでホバーされているかどうかを示すdata-hover属性を公開します。

<!-- Rendered `Input` -->
<input type="text" name="full_name" data-focus data-hover />

CSS属性セレクターを使用して、これらのdata属性の存在に基づいて条件付きでスタイルを適用します。Tailwind CSSを使用している場合は、data属性モディファイアを使用すると、これが簡単になります。

import { Input } from '@headlessui/react'

function Example() {
return <Input type="text" name="full_name" className="border data-[hover]:shadow data-[focus]:bg-blue-100" />
}

利用可能なすべてのデータ属性のリストについては、コンポーネントAPIを参照してください。

各コンポーネントは、render propsを介して現在の状態に関する情報も公開しており、それを使用して異なるスタイルを条件付きで適用したり、異なるコンテンツをレンダリングしたりできます。

たとえば、Inputコンポーネントは、入力がマウスまたはキーボードを介して現在フォーカスされているかどうかを示すfocus状態と、入力が現在マウスでホバーされているかどうかを示すhover状態を公開します。

import { Input } from '@headlessui/react'
import clsx from 'clsx'
import { Fragment } from 'react'

function Example() {
  return (
    <Input type="text" name="full_name" as={Fragment}>
{({ focus, hover }) => <input className={clsx('border', focus && 'bg-blue-100', hover && 'shadow')} />}
</Input> ) }

利用可能なすべてのrender propsのリストについては、コンポーネントAPIを参照してください。

LabelInputFieldコンポーネントでラップして、生成されたIDを使用して自動的に関連付けます。

import { Field, Input, Label } from '@headlessui/react'

function Example() {
  return (
<Field>
<Label>Name</Label>
<Input name="full_name" />
</Field>
) }

Field内でDescriptionコンポーネントを使用して、aria-describedby属性を使用してInputと自動的に関連付けます。

import { Description, Field, Input, Label } from '@headlessui/react'

function Example() {
  return (
<Field>
<Label>Name</Label>
<Description>Use your real name so people will recognize you.</Description>
<Input name="full_name" />
</Field>
) }

Fieldコンポーネントにdisabled propを追加して、Inputとそれに関連付けられたLabelおよびDescriptionを無効にします。

import { Description, Field, Input, Label } from '@headlessui/react'

function Example() {
  return (
<Field disabled>
<Label className="data-[disabled]:opacity-50">Name</Label> <Description className="data-[disabled]:opacity-50">Use your real name so people will recognize you.</Description> <Input name="full_name" className="data-[disabled]:bg-gray-100" /> </Field> ) }

disabled propをInput自体に直接追加することで、Field外の入力を無効にすることもできます。

ネイティブのinput要素を薄くラップしたものです。

Propデフォルト説明
asinput
文字列|コンポーネント

要素またはコンポーネントinputとしてレンダリングする必要があります。

invalidfalse
ブール値

かどうかinputが無効です。

disabledfalse
ブール値

かどうかinputが無効になっています.

autoFocusfalse
ブール値

かどうかinput最初にレンダリングされたときにフォーカスを受け取る必要があります。

データ属性Render Prop説明
data-invalidinvalid

ブール値

かどうかinputが無効です。

data-disableddisabled

ブール値

かどうかinputが無効になっています。

data-focusfocus

ブール値

かどうかinputがフォーカスされています。

data-hoverhover

ブール値

かどうかinputがホバーされています。

data-autofocusautofocus

ブール値

autoFocus propがtrueに設定されたかどうか。

LabelDescription、およびフォームコントロールをグループ化します。

Propデフォルト説明
asdiv
文字列|コンポーネント

要素またはコンポーネントfieldとしてレンダリングする必要があります。

disabledfalse
ブール値

フィールドが無効になっているかどうか。

データ属性Render Prop説明
data-disableddisabled

ブール値

フィールドが無効になっているかどうか。

Labelコンポーネントはフォームコントロールにラベルを付けます。

Propデフォルト説明
aslabel
文字列|コンポーネント

要素またはコンポーネントlabelとしてレンダリングする必要があります。

passivefalse
ブール値

trueの場合、ラベルをクリックしても関連付けられたフォームコントロールにフォーカスされません。

データ属性Render Prop説明
data-disableddisabled

ブール値

Fieldが無効になっているかどうか。

Descriptionコンポーネントはフォームコントロールを説明します。

Propデフォルト説明
asp
文字列|コンポーネント

要素またはコンポーネントdescriptionとしてレンダリングする必要があります。

データ属性Render Prop説明
data-disableddisabled

ブール値

Fieldが無効になっているかどうか。

事前にデザインされたTailwind CSSフォーム入力グループの例に興味がある場合は、私たちが構築した美しくデザインされ、専門的に作成されたコンポーネントのコレクションであるTailwind UIをチェックしてください。

これは、このようなオープンソースプロジェクトでの私たちの活動をサポートするのに最適な方法であり、それらを改善し、適切にメンテナンスし続けることを可能にします。