2023 年作者构建了名为Sonner的 React Toast 库,在文中分享了构建过程中的经验教训和错误。
- Animations:初始使用 CSS keyframes 做进入和退出动画,不可中断,后改用 CSS 过渡,可在第一个过渡结束前平滑过渡到新值。通过
useEffect
设置挂载状态来模拟进入动画,样式基于数据属性。 - Stacking toasts:通过将 toast 之间的间隙乘以 toast 的索引来创建堆叠效果,每个 toast 都设置
position: absolute
,还按比例缩放以创建深度错觉。若 toast 高度不同,会使堆叠效果不均匀,可将堆叠模式下的 toast 高度设为前面 toast 的高度。 - Swiping:toast 可向下滑动删除,通过简单的事件监听器更新
translateY
值,滑动基于动量,若滑动速度足够快则 toast 会被删除。 - Expanding toasts:计算每个 toast 的展开位置,即前面所有 toast 的高度加上间隙,当用户悬停在 toast 区域时,新的
translateY
值即为展开位置。 - State management:通过观察者模式管理状态,避免使用
context
。在<Toaster />
组件中订阅可观察对象,当调用toast()
函数时,<Toaster />
组件更新状态并渲染所有 toast。创建新 toast 只需导入toast
并调用函数。 - Hover state:悬停状态取决于是否悬停在 toast 上,通过添加
:after
伪元素填充间隙来确保一致的悬停状态。 - Pointer capture:开始拖动时设置 toast 捕获所有后续指针事件,确保拖动过程中即使鼠标或拇指移出 toast 仍可继续拖动,提升用户体验。
- Why is Sonner successful?:每周从 npm 下载量超过 150 万次,原因一是开发者体验好,无需 hooks 和 context,插入
<Toaster />
并调用toast()
即可;二是外观好看,有良好的默认值和动画。若想学习构建类似 Sonner 的组件,可查看动画课程Check out "Animations on the Web"。完整源代码可here,也可订阅每月新闻通讯。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。