选择
一个围绕原生 select 元素的轻量级包装器,它处理繁琐的辅助功能问题,并为悬停和焦点等状态提供更具意见性的状态。
要开始使用,请通过 npm 安装无头 UI
npm install @headlessui/react选择控件使用 Select 组件构建
import { Select } from '@headlessui/react'
function Example() {
  return (
    <Select name="status" aria-label="Project status">
      <option value="active">Active</option>
      <option value="paused">Paused</option>
      <option value="delayed">Delayed</option>
      <option value="canceled">Canceled</option>
    </Select>
  )
}您可以将任何属性传递给 Select,就像您通常传递给原生 select 元素一样。
无头 UI 会跟踪每个组件的很多状态,例如选择是否被聚焦,弹出窗口是否打开或关闭,或者菜单中哪个项目当前通过键盘被聚焦。
但是由于这些组件是无头的,并且开箱即用完全没有样式,所以您无法在 UI 中看到此信息,直到您自己提供每个状态所需的样式。
使用每个组件公开的 data-* 属性来设置无头 UI 组件的不同状态的样式是最简单的方法。
例如,Select 组件公开了一个 data-focus 属性,它告诉您选择当前是否通过键盘被聚焦,以及一个 data-hover 属性,它告诉您选择当前是否被鼠标悬停。
<!-- Rendered `Select` -->
<select name="status" data-focus data-hover>
  <option value="active">Active</option>
  <option value="paused">Paused</option>
  <option value="delayed">Delayed</option>
  <option value="canceled">Canceled</option>
</select>使用 CSS 属性选择器 根据这些数据属性的存在来有条件地应用样式。如果您正在使用 Tailwind CSS,则 数据属性修饰符 使这变得容易
import { Select } from '@headlessui/react'
function Example() {
  return (
    <Select name="status" className="border data-[hover]:shadow data-[focus]:bg-blue-100" aria-label="Project status">      <option value="active">Active</option>
      <option value="paused">Paused</option>
      <option value="delayed">Delayed</option>
      <option value="canceled">Canceled</option>
    </Select>
  )
}
查看 组件 API 以获取所有可用数据属性的列表。
每个组件还通过 渲染道具 公开有关其当前状态的信息,您可以使用这些信息来有条件地应用不同的样式或渲染不同的内容。
例如,Select 组件公开了一个 focus 状态,它告诉您选择当前是否通过键盘被聚焦,以及一个 hover 状态,它告诉您选择当前是否被鼠标悬停。
import { Select } from '@headlessui/react'
import clsx from 'clsx'
import { Fragment } from 'react'
function Example() {
  return (
    <Select name="status" as={Fragment}>
      {({ focus, hover }) => (        <select className={clsx('border', focus && 'bg-blue-100', hover && 'shadow')} aria-label="Project status">          <option value="active">Active</option>
          <option value="paused">Paused</option>
          <option value="delayed">Delayed</option>
          <option value="canceled">Canceled</option>
        </select>
      )}    </Select>
  )
}
查看 组件 API 以获取所有可用渲染道具的列表。
使用 Field 组件包装 Label 和 Select,以使用生成的 ID 自动关联它们
import { Field, Label, Select } from '@headlessui/react'
function Example() {
  return (
    <Field>      <Label>Project status</Label>      <Select name="status">
        <option value="active">Active</option>
        <option value="paused">Paused</option>
        <option value="delayed">Delayed</option>
        <option value="canceled">Canceled</option>
      </Select>
    </Field>  )
}
在 Field 内使用 Description 组件,使用 aria-describedby 属性自动将其与 Select 关联
import { Description, Field, Label, Select } from '@headlessui/react'
function Example() {
  return (
    <Field>      <Label>Project status</Label>
      <Description>This will be visible to clients on the project.</Description>      <Select name="status">
        <option value="active">Active</option>
        <option value="paused">Paused</option>
        <option value="delayed">Delayed</option>
        <option value="canceled">Canceled</option>
      </Select>
    </Field>  )
}
将 disabled 属性添加到 Field 组件以禁用 Select 及其关联的 Label 和 Description
import { Description, Field, Label, Select } from '@headlessui/react'
function Example() {
  return (
    <Field disabled>      <Label className="data-[disabled]:opacity-50">Project status</Label>      <Description className="data-[disabled]:opacity-50">This will be visible to clients on the project.</Description>      <Select name="status" className="data-[disabled]:bg-gray-100">        <option value="active">Active</option>
        <option value="paused">Paused</option>
        <option value="delayed">Delayed</option>
        <option value="canceled">Canceled</option>
      </Select>
    </Field>
  )
}
您也可以通过将 disabled 属性直接添加到 Select 本身来在 Field 之外禁用选择。
围绕原生 select 元素的薄包装器。
| 属性 | 默认值 | 描述 | 
| as | select | 字符串 | 组件元素或组件select应渲染为。 | 
| invalid | false | 布尔值是否select无效。 | 
| disabled | false | 布尔值是否select被禁用. | 
| autoFocus | false | 布尔值是否select在首次渲染时应接收焦点。 | 
| 数据属性 | 渲染道具 | 描述 | 
| data-invalid | invalid | 
 是否select无效。 | 
| data-disabled | disabled | 
 是否select被禁用。 | 
| data-focus | focus | 
 是否select被聚焦。 | 
| data-hover | hover | 
 是否select被悬停。 | 
| data-active | active | 
 是否select处于活动或按下状态。 | 
| data-autofocus | autofocus | 
 
 | 
将 Label、Description 和表单控件分组在一起。
| 属性 | 默认值 | 描述 | 
| as | div | 字符串 | 组件元素或组件field应渲染为。 | 
| disabled | false | 布尔值字段是否被禁用。 | 
| 数据属性 | 渲染道具 | 描述 | 
| data-disabled | disabled | 
 字段是否被禁用。 | 
Label 组件标记表单控件。
| 属性 | 默认值 | 描述 | 
| as | label | 字符串 | 组件元素或组件label应渲染为。 | 
| passive | false | 布尔值当为真时,单击标签不会聚焦关联的表单控件。 | 
| 数据属性 | 渲染道具 | 描述 | 
| data-disabled | disabled | 
 父  | 
Description 组件描述表单控件。
| 属性 | 默认值 | 描述 | 
| as | p | 字符串 | 组件元素或组件description应渲染为。 | 
| 数据属性 | 渲染道具 | 描述 | 
| data-disabled | disabled | 
 父  | 
如果您有兴趣查看预先设计的 Tailwind CSS 选择菜单示例,请查看 Tailwind UI - 由我们构建的精美设计和专业制作的组件集合。
这是支持我们在这个开源项目上的工作的好方法,使我们能够改进它们并保持良好的维护。
