FileButton
FileButton
は、ユーザーがファイルを選択するために使用されるボタンのコンポーネントです。
インポート
import { FileButton } from "@yamada-ui/react"
使い方
FileButton
は、内部的にButtonを使用しています。
編集可能な例
<VStack alignItems="flex-start"> <FileButton>Upload</FileButton> <FileButton as={IconButton} icon={<PlusIcon />} /> </VStack>
または、children
を使用してカスタマイズすることも可能です。children
は、onClick
, isDisabled
, isReadOnly
, isInvalid
を提供します。
編集可能な例
<FileButton> {({ onClick }) => <Link onClick={onClick}>Upload</Link>} </FileButton>
バリアントを変更する
編集可能な例
<Wrap gap="md"> <For each={[ { colorScheme: "primary", variant: "solid", }, { colorScheme: "secondary", variant: "outline", }, { colorScheme: "warning", variant: "ghost", }, { colorScheme: "danger", variant: "link", }, { variant: "unstyled", }, ]} > {({ colorScheme, variant }, index) => ( <FileButton key={index} colorScheme={colorScheme} variant={variant}> {toTitleCase(variant)} </FileButton> )} </For> </Wrap>
サイズを変更する
編集可能な例
<Wrap gap="md"> <For each={[ { colorScheme: "primary", size: "xs", name: "X Small", }, { colorScheme: "secondary", size: "sm", name: "Small", }, { colorScheme: "warning", size: "md", name: "Medium", }, { colorScheme: "danger", size: "lg", name: "Large", }, ]} > {({ colorScheme, size, name }, index) => ( <FileButton key={index} colorScheme={colorScheme} size={size}> {name} </FileButton> )} </For> </Wrap>
カラースキームを変更する
編集可能な例
<Wrap gap="md"> <For each={["secondary", "green"]}> {(colorScheme, index) => ( <FileButton key={index} colorScheme={colorScheme}> {toTitleCase(colorScheme)} </FileButton> )} </For> </Wrap>
複数選択を許容する
複数選択を許容する場合は、multiple
をtrue
に設定します。
編集可能な例
<FileButton multiple>Upload</FileButton>
拡張子を指定する
拡張子を指定する場合は、accept
に文字列(タイプ, タイプ
)を設定します。
編集可能な例
<FileButton accept="image/png,image/jpeg">Upload</FileButton>
ボーダーのカラーを変更する
ボーダーのカラーを変更する場合は、errorBorderColor
にカラーを設定します。
編集可能な例
<FileButton isInvalid errorBorderColor="orange.500"> Upload </FileButton>
無効化する
無効化する場合は、isDisabled
をtrue
に設定します。
編集可能な例
<VStack alignItems="flex-start"> <FileButton isDisabled>Upload</FileButton> <FileButton as={IconButton} icon={<PlusIcon />} isDisabled /> <FileButton isDisabled> {({ onClick, isDisabled }) => ( <Link onClick={onClick} opacity={isDisabled ? 0.4 : 1} cursor={isDisabled ? "not-allowed" : "pointer"} _hover={isDisabled ? undefined : { textDecoration: "underline" }} > Upload </Link> )} </FileButton> <FormControl isDisabled label="Upload file" helperMessage="Please select a file to upload." > <FileButton>Upload</FileButton> </FormControl> </VStack>
読み取り専用にする
読み取り専用にする場合は、isReadOnly
をtrue
に設定します。
編集可能な例
<VStack alignItems="flex-start"> <FileButton isReadOnly>Upload</FileButton> <FileButton as={IconButton} icon={<PlusIcon />} isReadOnly /> <FileButton isReadOnly> {({ onClick, isReadOnly }) => ( <Link onClick={onClick} cursor={isReadOnly ? "default" : "pointer"} _hover={isReadOnly ? undefined : { textDecoration: "underline" }} > Upload </Link> )} </FileButton> <FormControl isReadOnly label="Upload file" helperMessage="Please select a file to upload." > <FileButton>Upload</FileButton> </FormControl> </VStack>
無効な入力にする
無効な入力にする場合は、isInvalid
をtrue
に設定します。
編集可能な例
<VStack alignItems="flex-start"> <FileButton isInvalid>Upload</FileButton> <FileButton as={IconButton} icon={<PlusIcon />} isInvalid /> <FormControl isInvalid label="Upload file" errorMessage="File is required."> <FileButton>Upload</FileButton> </FormControl> </VStack>
リセットする
値をリセットする場合は、resetRef
にref
を設定します。設定されたref
にコールバック関数が付与されるので、それを実行します。
編集可能な例
const [files, onChange] = useState<File[] | null>(null) const resetRef = useRef<() => void>(null) const onReset = () => { onChange(null) if (resetRef.current) resetRef.current() } return ( <VStack> <Text>files: {files ? files.length : 0}</Text> <HStack> <FileButton resetRef={resetRef} onChange={onChange}> Upload </FileButton> <Button onClick={onReset}>Reset</Button> </HStack> </VStack> )
React Hook Form
を使う
編集可能な例
type Data = { fileButton: File[] | null } const resetRef = useRef<() => void>(null) const { control, handleSubmit, watch, setValue, formState: { errors }, } = useForm<Data>() const onReset = () => { setValue("fileButton", null) if (resetRef.current) resetRef.current() } const onSubmit: SubmitHandler<Data> = (data) => console.log("submit:", data) console.log("watch:", watch()) return ( <VStack as="form" onSubmit={handleSubmit(onSubmit)}> <FormControl isInvalid={!!errors.fileButton} label="Files" errorMessage={errors.fileButton ? errors.fileButton.message : undefined} > <Controller name="fileButton" control={control} rules={{ required: { value: true, message: "This is required." } }} render={({ field: { ref, name, onChange, onBlur } }) => ( <HStack> <FileButton {...{ ref, name, onChange, onBlur }} resetRef={resetRef} > Upload </FileButton> <Button onClick={onReset}>Reset</Button> </HStack> )} /> </FormControl> <Button type="submit" alignSelf="flex-end"> Submit </Button> </VStack> )
GitHubでこのページを編集する