FileInput
FileInputは、ユーザーがファイルを選択するために使用されるコンポーネントです。
<FileInput placeholder="Please upload file" />
使い方
import { FileInput } from "@yamada-ui/react"
import { FileInput } from "@/components/ui"
import { FileInput } from "@workspaces/ui"
<FileInput />
バリアントを変更する
<VStack>
<For each={["outline", "filled", "flushed"]}>
{(variant, index) => (
<FileInput
key={index}
variant={variant}
placeholder={toTitleCase(variant)}
/>
)}
</For>
</VStack>
サイズを変更する
<VStack>
<For each={["xs", "sm", "md", "lg", "xl"]}>
{(size, index) => (
<FileInput key={index} size={size} placeholder={toTitleCase(size)} />
)}
</For>
</VStack>
カラースキームを変更する
<VStack>
<For each={["success", "warning"]}>
{(colorScheme, index) => (
<FileInput
key={index}
colorScheme={colorScheme}
placeholder={toTitleCase(colorScheme)}
/>
)}
</For>
</VStack>
複数選択を許容する
複数選択を許容する場合は、multipleをtrueに設定します。
<FileInput placeholder="multiple" multiple />
拡張子を指定する
拡張子を指定する場合は、acceptに文字列(タイプ)を設定します。
<FileInput accept="image/png,image/jpeg" placeholder="only png, jpeg" />
区切りをカスタマイズする
区切りをカスタマイズする場合は、separatorに文字列を設定します。
<FileInput placeholder="Please upload file" multiple separator=";" />
カスタムコンポーネントを使う
カスタムコンポーネントを使う場合は、componentにReactNodeを設定します。componentは、value(File)とindexを提供します。
<FileInput
component={({ value: { name } }) => <Tag>{name}</Tag>}
gapY="xs"
multiple
placeholder="Please upload file"
/>
ファイル名を整形する
ファイル名を整形する場合は、formatを使用します。formatは、Fileを提供します。
<FileInput
format={({ name }) => name.substring(0, name.indexOf("."))}
multiple
placeholder="Please upload file"
/>
子要素をカスタマイズする
子要素をカスタマイズする場合は、childrenを使用します。childrenは、Fileを配列で提供します。
<FileInput multiple>
{(files) => <Text>Selected: {files?.length ?? 0}</Text>}
</FileInput>
アドオンを追加する
アドオンを追加する場合は、FileInputをInputGroup.Rootでラッピングし、InputGroup.Addonを使用します。
<InputGroup.Root>
<InputGroup.Addon>
<FileIcon />
</InputGroup.Addon>
<FileInput placeholder="Please upload file" />
</InputGroup.Root>
要素を追加する
要素を追加する場合は、FileInputをInputGroup.Rootでラッピングし、InputGroup.Elementを使用します。
<InputGroup.Root>
<InputGroup.Element>
<FileIcon />
</InputGroup.Element>
<FileInput placeholder="Please upload file" />
</InputGroup.Root>
無効にする
無効にする場合は、disabledをtrueに設定します。
<VStack>
<FileInput placeholder="Please upload file" disabled />
<InputGroup.Root disabled>
<InputGroup.Addon>
<FileIcon />
</InputGroup.Addon>
<FileInput placeholder="Please upload file" />
</InputGroup.Root>
<Field.Root disabled label="Upload file">
<FileInput placeholder="Please upload file" />
</Field.Root>
</VStack>
読み取り専用にする
読み取り専用にする場合は、readOnlyをtrueに設定します。
<VStack>
<FileInput placeholder="Please upload file" readOnly />
<InputGroup.Root readOnly>
<InputGroup.Addon>
<FileIcon />
</InputGroup.Addon>
<FileInput placeholder="Please upload file" />
</InputGroup.Root>
<Field.Root readOnly label="Upload file">
<FileInput placeholder="Please upload file" />
</Field.Root>
</VStack>
無効な入力にする
無効な入力にする場合は、invalidをtrueに設定します。
<VStack>
<FileInput placeholder="Please upload file" invalid />
<InputGroup.Root invalid>
<InputGroup.Addon>
<FileIcon />
</InputGroup.Addon>
<FileInput placeholder="Please upload file" />
</InputGroup.Root>
<Field.Root errorMessage="File is required." invalid label="Upload file">
<FileInput placeholder="Please upload file" />
</Field.Root>
</VStack>
ボーダーの色を変更する
ボーダーの色を変更する場合は、focusBorderColorまたはerrorBorderColorに値を設定します。
<VStack>
<FileInput
focusBorderColor="success"
placeholder="Custom focus border color"
/>
<InputGroup.Root variant="flushed" focusBorderColor="success">
<InputGroup.Element>
<FileIcon />
</InputGroup.Element>
<FileInput placeholder="Custom focus border color" />
</InputGroup.Root>
<FileInput
errorBorderColor="warning"
invalid
placeholder="Custom error border color"
/>
<InputGroup.Root errorBorderColor="warning" invalid>
<InputGroup.Addon>
<FileIcon />
</InputGroup.Addon>
<FileInput placeholder="Custom error border color" />
</InputGroup.Root>
</VStack>
リセットする
値をリセットする場合は、resetRefにrefを設定します。設定されたrefにコールバック関数が付与されるので、それを実行します。
files: 0
const [value, onChange] = useState<File[] | undefined>(undefined)
const resetRef = useRef<() => void>(null)
const onReset = () => {
onChange(undefined)
resetRef.current?.()
}
return (
<VStack>
<Text>files: {value?.length ?? 0}</Text>
<InputGroup.Root>
<FileInput
multiple
placeholder="placeholder"
resetRef={resetRef}
value={value}
onChange={onChange}
/>
{value?.length ? (
<InputGroup.Element clickable onClick={onReset}>
<Center as="button" focusVisibleRing="outside" p="0.5" rounded="xs">
<XIcon fontSize="xl" />
</Center>
</InputGroup.Element>
) : null}
</InputGroup.Root>
</VStack>
)
"use client"をファイルの上部に追加する必要があります。Props
アクセシビリティ
Field.Rootを使用しない場合は、FileInputにaria-labelまたはaria-labelledbyを設定します。
<FileInput aria-label="Upload file" placeholder="Please upload file" />
<VStack gap="sm">
<Text as="h3" id="label">
Upload file
</Text>
<FileInput aria-labelledby="label" placeholder="Please upload file" />
</VStack>
キーボード操作
| キー | 説明 | 状態 |
|---|---|---|
Tab | 要素をフォーカスします。 | - |
Space, Enter | フォーカスしている要素をアクティブにします。 | - |
ARIAロールと属性
| コンポーネント | ロールと属性 | 使い方 |
|---|---|---|
FileInput | role="button" | ボタンであることを示します。 |
aria-disabled | disabledまたはreadOnlyが設定されている場合は"true"を設定します。 | |
aria-labelledby | FileInputがField.Root内にあり、Field.Rootにlabelが設定されている場合は、そのidを設定します。 | |
aria-describedby | FileInputがField.Root内にあり、Field.RootにerrorMessage、helperMessage、Field.ErrorMessage、またはField.HelperMessageが設定されている場合は、そのidを設定します。 | |
aria-invalid | invalidが設定されている場合は"true"を設定します。 | |
aria-required | requiredが設定されている場合は"true"を設定します。 | |
input | aria-disabled | disabledまたはreadOnlyが設定されている場合は"true"を設定します。 |
aria-describedby | FileInputがField.Root内にあり、Field.RootにerrorMessage、helperMessage、Field.ErrorMessage、またはField.HelperMessageが設定されている場合は、そのidを設定します。 | |
aria-hidden | 要素をアクセシビリティツリーから除外します。 | |
aria-invalid | invalidが設定されている場合は"true"を設定します。 | |
aria-required | requiredが設定されている場合は"true"を設定します。 |
類似のコンポーネント
Textarea
Textareaは、複数行のテキスト入力を取得するために使用されるコンポーネントです。
PinInput
PinInputは、ピンコードやOTP(ワンタイムパスワード)の入力を取得するために使用されるコンポーネントです。
PasswordInput
PasswordInputは、表示・非表示の切り替えができるパスワード入力用のコンポーネントです。
NumberInput
NumberInputは、ユーザーからの数値入力を取得するために使用されるコンポーネントです。
Input
Inputは、ユーザーからのテキスト入力を取得するために使用されるコンポーネントです。
Editable
Editableは、インラインで編集可能なテキスト入力を取得するために使用されるコンポーネントです。
Dropzone
Dropzoneは、ファイルをドラッグアンドドロップでアップロードするために使用されるコンポーネントです。
FileButton
FileButtonは、ユーザーがファイルを選択するために使用されるボタンのコンポーネントです。
使用しているコンポーネント・フック
Input
Inputは、ユーザーからのテキスト入力を取得するために使用されるコンポーネントです。
Field
Fieldは、フォーム要素に、ラベル、ヘルパーメッセージ、エラーメッセージなどをグループ化するために使用されるコンポーネントです。
Portal
Portalは、現在のDOM階層の外側に要素をレンダリングするコンポーネントです。