import { Input } from "@chakra-ui/react"
const Demo = () => {
return <Input placeholder="Enter your email" />
}
用法
import { Input } from "@chakra-ui/react"
<Input />
示例
变体
使用 variant
属性来改变输入框的视觉样式。
import { Input, Stack } from "@chakra-ui/react"
const Demo = () => {
return (
<Stack gap="4">
<Input placeholder="Subtle" variant="subtle" />
<Input placeholder="Outline" variant="outline" />
<Input placeholder="Flushed" variant="flushed" />
</Stack>
)
}
尺寸
使用 size
属性来改变输入框的尺寸。
import { Input, Stack } from "@chakra-ui/react"
const Demo = () => {
return (
<Stack gap="4">
<Input placeholder="size (xs)" size="xs" />
<Input placeholder="size (sm)" size="sm" />
<Input placeholder="size (md)" size="md" />
<Input placeholder="size (lg)" size="lg" />
</Stack>
)
}
帮助文本
将输入框与 Field
组件配对以添加帮助文本。
我们绝不会分享您的电子邮件。
import { Field, Input } from "@chakra-ui/react"
const Demo = () => {
return (
<Field.Root required>
<Field.Label>
Email <Field.RequiredIndicator />
</Field.Label>
<Input placeholder="Enter your email" />
<Field.HelperText>We'll never share your email.</Field.HelperText>
</Field.Root>
)
}
错误文本
将输入框与 Field
组件配对以添加错误文本。
此字段为必填项
import { Field, Input } from "@chakra-ui/react"
const Demo = () => {
return (
<Field.Root invalid>
<Field.Label>Email</Field.Label>
<Input placeholder="Enter your email" />
<Field.ErrorText>This field is required</Field.ErrorText>
</Field.Root>
)
}
字段
将输入框与 Field
组件组合,以添加标签、帮助文本和错误文本。
import { Field, HStack, Input } from "@chakra-ui/react"
const Demo = () => {
return (
<HStack gap="10" width="full">
<Field.Root required>
<Field.Label>
Email <Field.RequiredIndicator />
</Field.Label>
<Input placeholder="me@example.com" variant="subtle" />
</Field.Root>
<Field.Root required>
<Field.Label>
Email <Field.RequiredIndicator />
</Field.Label>
<Input placeholder="me@example.com" variant="outline" />
</Field.Root>
</HStack>
)
}
Hook 表单
这是一个如何将输入框与 react-hook-form
集成的示例。
"use client"
import { Button, Field, Input, Stack } from "@chakra-ui/react"
import { useForm } from "react-hook-form"
interface FormValues {
firstName: string
lastName: string
}
const Demo = () => {
const {
register,
handleSubmit,
formState: { errors },
} = useForm<FormValues>()
const onSubmit = handleSubmit((data) => console.log(data))
return (
<form onSubmit={onSubmit}>
<Stack gap="4" align="flex-start" maxW="sm">
<Field.Root invalid={!!errors.firstName}>
<Field.Label>First name</Field.Label>
<Input {...register("firstName")} />
<Field.ErrorText>{errors.firstName?.message}</Field.ErrorText>
</Field.Root>
<Field.Root invalid={!!errors.lastName}>
<Field.Label>Last name</Field.Label>
<Input {...register("lastName")} />
<Field.ErrorText>{errors.lastName?.message}</Field.ErrorText>
</Field.Root>
<Button type="submit">Submit</Button>
</Stack>
</form>
)
}
元素
在 InputGroup
组件上使用 startElement
和 endElement
属性,以在输入框的开始和结束处添加元素。
开始图标
import { Input, InputGroup } from "@chakra-ui/react"
import { LuUser } from "react-icons/lu"
const Demo = () => {
return (
<InputGroup startElement={<LuUser />}>
<Input placeholder="Username" />
</InputGroup>
)
}
开始文本
https://
import { Input, InputGroup } from "@chakra-ui/react"
const Demo = () => {
return (
<InputGroup
startElement="https://"
startElementProps={{ color: "fg.muted" }}
>
<Input ps="7ch" placeholder="yoursite.com" />
</InputGroup>
)
}
开始和结束文本
$
USD
import { Input, InputGroup } from "@chakra-ui/react"
const Demo = () => {
return (
<InputGroup startElement="$" endElement="USD">
<Input placeholder="0.00" />
</InputGroup>
)
}
Kbd
⌘K
import { Input, InputGroup, Kbd } from "@chakra-ui/react"
import { LuSearch } from "react-icons/lu"
export const InputWithKbd = () => (
<InputGroup flex="1" startElement={<LuSearch />} endElement={<Kbd>⌘K</Kbd>}>
<Input placeholder="Search contacts" />
</InputGroup>
)
选择
https://
import { Input, InputGroup, NativeSelect } from "@chakra-ui/react"
const DomainSelect = () => (
<NativeSelect.Root size="xs" variant="plain" width="auto" me="-1">
<NativeSelect.Field defaultValue=".com" fontSize="sm">
<option value=".com">.com</option>
<option value=".org">.org</option>
<option value=".net">.net</option>
</NativeSelect.Field>
<NativeSelect.Indicator />
</NativeSelect.Root>
)
const Demo = () => {
return (
<InputGroup flex="1" startElement="https://" endElement={<DomainSelect />}>
<Input ps="4.75em" pe="0" placeholder="yoursite.com" />
</InputGroup>
)
}
附加组件
使用 InputAddon
和 Group
组件为输入框添加附加组件。
开始附加组件
https://
import { Input, InputGroup } from "@chakra-ui/react"
const Demo = () => {
return (
<InputGroup startAddon="https://">
<Input placeholder="yoursite.com" />
</InputGroup>
)
}
结束附加组件
.com
import { Input, InputGroup } from "@chakra-ui/react"
const Demo = () => {
return (
<InputGroup endAddon=".com">
<Input placeholder="yoursite" />
</InputGroup>
)
}
开始和结束附加组件
$
USD
import { Input, InputGroup } from "@chakra-ui/react"
const Demo = () => {
return (
<InputGroup startAddon="$" endAddon="USD">
<Input placeholder="0.00" />
</InputGroup>
)
}
禁用
使用 disabled
属性来禁用输入框。
import { Input } from "@chakra-ui/react"
const Demo = () => {
return <Input disabled placeholder="disabled" />
}
按钮
使用 Group
组件将按钮附加到输入框。
import { Button, Group, Input } from "@chakra-ui/react"
const Demo = () => {
return (
<Group attached w="full" maxW="sm">
<Input flex="1" placeholder="Enter your email" />
<Button bg="bg.subtle" variant="outline">
Submit
</Button>
</Group>
)
}
焦点和错误颜色
使用 --focus-color
和 --error-color
CSS 自定义属性,在输入框获得焦点或处于错误状态时改变其颜色。
import { Field, Input, Stack } from "@chakra-ui/react"
const Demo = () => {
return (
<Stack gap="4">
<Field.Root>
<Field.Label>focusColor=lime</Field.Label>
<Input placeholder="Focus me" css={{ "--focus-color": "lime" }} />
</Field.Root>
<Field.Root invalid>
<Field.Label>errorColor=green</Field.Label>
<Input placeholder="Email" css={{ "--error-color": "green" }} />
</Field.Root>
<Field.Root invalid>
<Field.Label>errorColor=blue</Field.Label>
<Input placeholder="Password" css={{ "--error-color": "blue" }} />
</Field.Root>
<Field.Root invalid>
<Field.Label>variant=outline,focusColor=error</Field.Label>
<Input placeholder="Focus me" variant="outline" />
</Field.Root>
<Field.Root invalid>
<Field.Label>variant=subtle,focusColor=error</Field.Label>
<Input placeholder="Focus me" variant="subtle" />
</Field.Root>
<Field.Root invalid>
<Field.Label>variant=flushed,focusColor=error</Field.Label>
<Input placeholder="Focus me" variant="flushed" />
</Field.Root>
</Stack>
)
}
占位符样式
使用 _placeholder
属性来设置占位符文本的样式。
import { Input } from "@chakra-ui/react"
const Demo = () => {
return (
<Input
color="teal"
placeholder="custom placeholder"
_placeholder={{ color: "inherit" }}
/>
)
}
浮动标签
这是一个如何在输入框上构建浮动标签的示例。
import { Box, Field, Input, defineStyle } from "@chakra-ui/react"
const Demo = () => {
return (
<Field.Root>
<Box pos="relative" w="full">
<Input className="peer" placeholder="" />
<Field.Label css={floatingStyles}>Email</Field.Label>
</Box>
</Field.Root>
)
}
const floatingStyles = defineStyle({
pos: "absolute",
bg: "bg",
px: "0.5",
top: "-3",
insetStart: "2",
fontWeight: "normal",
pointerEvents: "none",
transition: "position",
_peerPlaceholderShown: {
color: "fg.muted",
top: "2.5",
insetStart: "3",
},
_peerFocusVisible: {
color: "fg",
top: "-3",
insetStart: "2",
},
})
遮罩
这是一个使用 use-mask-input
库来遮罩输入框形状的示例。
"use client"
import { Input } from "@chakra-ui/react"
import { withMask } from "use-mask-input"
const Demo = () => {
return (
<Input placeholder="(99) 99999-9999" ref={withMask("(99) 99999-9999")} />
)
}
字符计数器
这是一个如何在输入框中添加字符计数器的示例。
0 / 20
"use client"
import { Input, InputGroup, Span } from "@chakra-ui/react"
import { useState } from "react"
const MAX_CHARACTERS = 20
const Demo = () => {
const [value, setValue] = useState("")
return (
<InputGroup
endElement={
<Span color="fg.muted" textStyle="xs">
{value.length} / {MAX_CHARACTERS}
</Span>
}
>
<Input
placeholder="Enter your message"
value={value}
maxLength={MAX_CHARACTERS}
onChange={(e) => {
setValue(e.currentTarget.value.slice(0, MAX_CHARACTERS))
}}
/>
</InputGroup>
)
}
卡号
这是一个使用 react-payment-inputs
创建卡号输入框的示例。
"use client"
import { Input, InputGroup } from "@chakra-ui/react"
import { LuCreditCard } from "react-icons/lu"
import { usePaymentInputs } from "react-payment-inputs"
const Demo = () => {
const { wrapperProps, getCardNumberProps } = usePaymentInputs()
return (
<InputGroup {...wrapperProps} endElement={<LuCreditCard />}>
<Input {...getCardNumberProps()} />
</InputGroup>
)
}
您可以为卡号、有效期和 CVC 创建完整的卡片输入框。
"use client"
import { Box, Group, Input, InputGroup, Show } from "@chakra-ui/react"
import { LuCreditCard } from "react-icons/lu"
import { usePaymentInputs } from "react-payment-inputs"
import cardImages, { type CardImages } from "react-payment-inputs/images"
const images = cardImages as unknown as CardImages
const CardImage = (props: ReturnType<typeof usePaymentInputs>) => {
const { meta, getCardImageProps } = props
return (
<Show
when={meta.cardType}
fallback={<LuCreditCard size={16} aria-hidden="true" />}
>
<svg {...getCardImageProps({ images })} />
</Show>
)
}
const Demo = () => {
const payment = usePaymentInputs()
return (
<Box spaceY="-1px">
<InputGroup
zIndex={{ _focusWithin: "1" }}
endElement={<CardImage {...payment} />}
>
<Input roundedBottom="0" {...payment.getCardNumberProps()} />
</InputGroup>
<Group w="full" attached>
<Input roundedTopLeft="0" {...payment.getExpiryDateProps()} />
<Input roundedTopRight="0" {...payment.getCVCProps()} />
</Group>
</Box>
)
}
清除按钮
结合使用 Input
和 CloseButton
组件来创建一个清除按钮。这对于构建搜索输入框非常有用。
"use client"
import { CloseButton, Input, InputGroup } from "@chakra-ui/react"
import { useRef, useState } from "react"
const Demo = () => {
const [value, setValue] = useState("Initial value")
const inputRef = useRef<HTMLInputElement | null>(null)
const endElement = value ? (
<CloseButton
size="xs"
onClick={() => {
setValue("")
inputRef.current?.focus()
}}
me="-2"
/>
) : undefined
return (
<InputGroup endElement={endElement}>
<Input
ref={inputRef}
placeholder="Email"
value={value}
onChange={(e) => {
setValue(e.currentTarget.value)
}}
/>
</InputGroup>
)
}
属性
属性 | 默认 | 类型 |
---|---|---|
colorPalette | 'gray' | 'gray' | 'red' | 'orange' | 'yellow' | 'green' | 'teal' | 'blue' | 'cyan' | 'purple' | 'pink' 组件的颜色调色板 |
size | 'md' | '2xs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' 组件的尺寸 |
variant | 'outline' | 'outline' | 'subtle' | 'flushed' 组件的变体 |