Headless UI v2.1: 简化过渡 API 和改进多对话框支持

Adam Wathan
Jonathan Reinink
Headless UI v2.1

我们刚刚发布了适用于 React 的 Headless UI v2.1,该版本显著简化了我们的过渡 API,并增加了同时渲染多个对话框作为兄弟元素的支持。


简化的过渡 API

在 v2.1 中,我们通过向您可能想要过渡的所有内置组件添加新的 transition 属性,极大地简化了过渡,使您可以通过为目标元素添加一些类来添加过渡样式,增加了每个过渡阶段的数据属性:

import { Menu, MenuButton, MenuItem, MenuItems } from "@headlessui/react";
function Example() {
return (
<Menu>
<MenuButton>我的账户</MenuButton>
<MenuItems
transition
className={`
transition ease-out
data-[closed]:scale-95 data-[closed]:opacity-0
data-[enter]:duration-200 data-[leave]:duration-300
`}
>
{/* 菜单项… */}
</MenuItems>
</Menu>
);
}

您可以使用以下四个数据属性来定位过渡的不同阶段:

  • data-closed: 元素进入时进行过渡时的样式,以及离开时的样式。
  • data-enter: 应用于元素进入时的样式,比如持续时间或缓动曲线。
  • data-leave: 应用于元素离开时的样式,比如持续时间或缓动曲线。
  • data-transition: 应用于元素进入或离开时的样式,对于在两个阶段之间共享值非常有用。

您甚至可以堆叠这些属性,以便使用不同的 closed 样式进行进入和离开。例如,这个对话框从左侧滑入,但向右滑出:

import { Dialog } from "@headlessui/react";
import { useState } from "react";
function Example() {
let [isOpen, setIsOpen] = useState(false);
return (
<>
<button onClick={() => setIsOpen(true)}>打开对话框</button>
<Dialog
open={isOpen}
onClose={() => setIsOpen(false)}
transition
className={`
transition duration-300 ease-out
data-[closed]:opacity-0
data-[closed]:data-[enter]:-translate-x-8
data-[closed]:data-[leave]:translate-x-8
`}
>
{/* 对话框内容… */}
</Dialog>
</>
);
}

对于过渡常规 HTML 元素或其他组件,您仍然可以使用 <Transition> 组件,但使用新的数据属性 API:

import { Transition } from "@headlessui/react";
import { useState } from "react";
function Example() {
const [isShowing, setIsShowing] = useState(false);
return (
<>
<button onClick={() => setIsShowing((isShowing) => !isShowing)}>切换</button>
<Transition show={isShowing}>
<div className="transition duration-300 data-[closed]:opacity-0">我将渐隐渐现</div>
</Transition>
</>
);
}

我们已经更新了所有 Tailwind UI 组件以使用这个新的过渡 API,代码变得更加简洁和轻量。查看 模态对话框下拉菜单滑动覆盖悬浮菜单选择菜单 组件以获取更多示例。

所有现有的 API 仍继续支持以保持向后兼容,但这个新的方法是我们今后推荐的方式。

查看更新后的 Transition 组件文档 以了解更多信息。


同时渲染多个对话框作为兄弟元素

在 Headless UI v2.1 中,您可以最终同时渲染多个对话框,而无需将一个对话框嵌套在另一个内部。

当您应用的两个不相关部分需要同时显示一个对话框时,这可能非常有帮助 – 例如您可能已经打开某种确认对话框,但应用的另一部分检测到您失去了网络连接或您的会话已超时,需要在上面弹出一个新对话框。

以下是与我们最近正在开发的应用 UI 套件 Catalyst 类似的效果:

我们跟踪每个对话框打开的顺序,最近打开的那个将在您按下 ESC 键或单击对话框外部时关闭。


要立即开始使用这些功能,只需安装最新版本的 Headless UI:

npm i @headlessui/react@latest

如果您遇到任何问题,请在 GitHub 上告知我们!

Get all of our updates directly to your inbox.
Sign up for our newsletter.