入力
ネイティブの入力要素を軽くラップし、面倒なアクセシビリティの懸念を処理し、ホバーやフォーカスなどの状態に対してより意見が反映された状態を提供します。
開始するには、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を参照してください。
Label
とInput
をField
コンポーネントでラップして、生成された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 | デフォルト | 説明 |
as | input | 文字列|コンポーネント 要素またはコンポーネントinputとしてレンダリングする必要があります。 |
invalid | false | ブール値 かどうかinputが無効です。 |
disabled | false | ブール値 かどうかinputが無効になっています. |
autoFocus | false | ブール値 かどうかinput最初にレンダリングされたときにフォーカスを受け取る必要があります。 |
データ属性 | Render Prop | 説明 |
data-invalid | invalid |
かどうかinputが無効です。 |
data-disabled | disabled |
かどうかinputが無効になっています。 |
data-focus | focus |
かどうかinputがフォーカスされています。 |
data-hover | hover |
かどうかinputがホバーされています。 |
data-autofocus | autofocus |
|
Label
、Description
、およびフォームコントロールをグループ化します。
Prop | デフォルト | 説明 |
as | div | 文字列|コンポーネント 要素またはコンポーネントfieldとしてレンダリングする必要があります。 |
disabled | false | ブール値 フィールドが無効になっているかどうか。 |
データ属性 | Render Prop | 説明 |
data-disabled | disabled |
フィールドが無効になっているかどうか。 |
Label
コンポーネントはフォームコントロールにラベルを付けます。
Prop | デフォルト | 説明 |
as | label | 文字列|コンポーネント 要素またはコンポーネントlabelとしてレンダリングする必要があります。 |
passive | false | ブール値 trueの場合、ラベルをクリックしても関連付けられたフォームコントロールにフォーカスされません。 |
データ属性 | Render Prop | 説明 |
data-disabled | disabled |
親 |
Description
コンポーネントはフォームコントロールを説明します。
Prop | デフォルト | 説明 |
as | p | 文字列|コンポーネント 要素またはコンポーネントdescriptionとしてレンダリングする必要があります。 |
データ属性 | Render Prop | 説明 |
data-disabled | disabled |
親 |
事前にデザインされたTailwind CSSフォーム入力グループの例に興味がある場合は、私たちが構築した美しくデザインされ、専門的に作成されたコンポーネントのコレクションであるTailwind UIをチェックしてください。
これは、このようなオープンソースプロジェクトでの私たちの活動をサポートするのに最適な方法であり、それらを改善し、適切にメンテナンスし続けることを可能にします。