简体中文
组合式函数
组件库将许多交互逻辑和无障碍底层能力,封装成了易于复用的 Vue 3 组合式函数(Composables)。通用函数可以直接从包根统一引入:
ts
import { useClipboard, useControllableState } from '@astryx-vue/core'注意:包内没有
@astryx-vue/core/composables这种子路径。所有在packages/core/src/composables/index.ts中导出的通用函数如下表所示,具体参数签名以 TypeScript 类型定义为准:
| 函数名称 | 主要用途 |
|---|---|
useControllableState | 统一管理受控与非受控状态。常用于封装兼容 v-model 的自定义输入控件。 |
useAnnounce | 触发屏幕阅读器读屏语音播报,帮助视障用户获取动态操作反馈。 |
useClipboard | 将指定文本写入系统剪贴板,并在短时间内提供响应式的 isCopied 状态。 |
useHotkeys | 注册页面全局快捷键。支持 mod+k 等直观写法,其中 mod 在 macOS 上对应 ⌘ 键。 |
useMediaQuery | 响应式监听 CSS 媒体查询(Media Query),将其转化为响应式 Ref。 |
useDismiss | 统一处理浮层的外部点击(Click Outside)与按下 Escape 键退出,内置撤销栈确保内层弹层优先响应。 |
useFocusTrap | 在模态弹窗或抽屉容器内循环限制键盘 Tab 焦点,防止焦点跑出容器。 |
useRestoreFocus | 弹窗打开时自动记住触发源,弹窗关闭后将焦点智能送回原来的按钮。 |
useScrollLock | 带有引用计数的背景滚动锁定。即使打开多个嵌套弹窗,关闭时也能准确恢复页面滚动。 |
useListFocus | 处理一维垂直或水平列表的键盘上下左右键导航,默认查找 [role="menuitem"] 元素。 |
useClickableContainer | 让整块卡片区域都能点击,且点击卡片内部的按钮、输入框或超链接时,不会误触发外层容器的点击。 |
useGridRovingFocus | 二维卡片网格的键盘方向键流转导航(Roving tabindex)。 |
useTypeahead | 支持输入首字母在列表中快速定位匹配条目,不强行移动焦点,而是把匹配结果传递给 onMatch 回调。 |
useCombobox | 封装可筛选、带联想搜索的下拉选择框状态与当前选中值。 |
useNumberField | 封装支持最大值、最小值、步进(step)的数值微调输入逻辑。 |
useAsyncSource、createStaticSource | 支持可取消的异步搜索数据源,以及本地纯前端静态数据集管理。 |
useOverflow、computeOverflow | 当容器宽度不够时,智能计算哪些菜单项需要折叠收录到「更多」下拉菜单中。 |
useLongPress | 移动端与桌面端的长按触发手势。若手指滑动超过阈值会自动取消长按。 |
useStreamingText | 处理 AI 打字机流式输出的平滑文本呈现,支持自然停顿(natural)、快速(fast)与瞬间显示(instant)。 |
snapToGraphemeBoundary | 将字符串截断偏移智能对齐到文字的「字素边界」(避免生硬切断 Emoji 或复合字符)。 |
useChatStreamScroll | 智能跟随 AI 聊天对话流滚动。用户向上翻阅时保持原位,生成结束或位于底部时平滑吸底。 |
useChatNewMessages | 当读者未贴合在对话流底部时,在页面上浮动提示有未读的新消息产生。 |
useKeyboardHint | 当用户第一次通过键盘方向键切入一组控件时,在当前焦点项旁边短暂弹出操作提示气泡。 |
useImageMode | 自动采样图片亮度,智能推断上层该使用深色还是浅色的前景文字;若采样失败则采用安全回退值。 |
useContainerReveal | 仅在鼠标悬停或键盘聚焦到容器时,才显示操作按钮,返回对应的样式类名。 |
useMenuPress | 在菜单项按下后,吸收吞掉浏览器可能冗余触发的随后那次点击事件,防止误触。 |
别名提示:
useClipboard拥有一个兼容旧版的名字useCopyToClipboard,从包根或@astryx-vue/core/Code均可引入,底层完全等价。
随特定组件绑定的组合式函数
部分与特定组件深度绑定的函数,既可以从该组件的专用子路径引入,也可以直接从包根引入:
| 函数名称 | 对应组件入口 |
|---|---|
useToast | @astryx-vue/core/Toast |
useImperativeDialog | @astryx-vue/core/Dialog |
useImperativeAlertDialog | @astryx-vue/core/AlertDialog |
useOverlay | @astryx-vue/core/Overlay |
useContextMenu、useContextMenuSize | @astryx-vue/core/ContextMenu |
useDropdownMenuContext | @astryx-vue/core/DropdownMenu |
useSideNavCollapse | @astryx-vue/core/SideNav |
useListContext、useItemDescriptionId | @astryx-vue/core/List |
useTheme、useMediaTheme | @astryx-vue/core/Theme |
useIndicator | @astryx-vue/core/Indicator |
useSemanticIcon | @astryx-vue/core/Icon |
useSyntaxTheme | @astryx-vue/core/Code |
useChatComposerContext、useChatComposerTokens、useChatPasteAsToken、useChatDictation、useSpeechRecognition | @astryx-vue/core/Chat |
多语言与国际化相关的 provideAstryxLocale 和 useAstryxMessages,请参阅 国际化。