npx skills add https://github.com/lobehub/lobehub --skill modal使用 @lobehub/ui 中的 createModal 来实现命令式模态对话框。
| 模式 | 特点 | 推荐 |
|---|---|---|
| 声明式 | 需要 open 状态,渲染 <Modal /> | ❌ |
| 命令式 | 直接调用函数,无需状态 | ✅ |
features/
└── MyFeatureModal/
├── index.tsx # 导出 createXxxModal
└── MyFeatureContent.tsx # 模态框内容
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
MyFeatureContent.tsx)'use client';
import { useModalContext } from '@lobehub/ui';
import { useTranslation } from 'react-i18next';
export const MyFeatureContent = () => {
const { t } = useTranslation('namespace');
const { close } = useModalContext(); // 可选:获取关闭方法
return <div>{/* 模态框内容 */}</div>;
};
index.tsx)'use client';
import { createModal } from '@lobehub/ui';
import { t } from 'i18next'; // 注意:使用 i18next,而非 react-i18next
import { MyFeatureContent } from './MyFeatureContent';
export const createMyFeatureModal = () =>
createModal({
allowFullscreen: true,
children: <MyFeatureContent />,
destroyOnHidden: false,
footer: null,
styles: { body: { overflow: 'hidden', padding: 0 } },
title: t('myFeature.title', { ns: 'setting' }),
width: 'min(80%, 800px)',
});
import { createMyFeatureModal } from '@/features/MyFeatureModal';
const handleOpen = useCallback(() => {
createMyFeatureModal();
}, []);
return <Button onClick={handleOpen}>打开</Button>;
useTranslation 钩子(React 上下文)import { t } from 'i18next'(非钩子,命令式)const { close, setCanDismissByClickOutside } = useModalContext();
| 属性 | 类型 | 描述 |
|---|---|---|
allowFullscreen | boolean | 允许全屏模式 |
destroyOnHidden | boolean | 关闭时销毁内容 |
footer | `ReactNode | null` |
width | `string | number` |
src/features/SkillStore/index.tsxsrc/features/LibraryModal/CreateNew/index.tsx每周安装量
398
代码仓库
GitHub 星标数
74.1K
首次出现
2026年1月27日
安全审计
安装于
codex347
opencode347
gemini-cli339
github-copilot327
cursor293
claude-code290
Use createModal from @lobehub/ui for imperative modal dialogs.
| Mode | Characteristics | Recommended |
|---|---|---|
| Declarative | Need open state, render <Modal /> | ❌ |
| Imperative | Call function directly, no state | ✅ |
features/
└── MyFeatureModal/
├── index.tsx # Export createXxxModal
└── MyFeatureContent.tsx # Modal content
MyFeatureContent.tsx)'use client';
import { useModalContext } from '@lobehub/ui';
import { useTranslation } from 'react-i18next';
export const MyFeatureContent = () => {
const { t } = useTranslation('namespace');
const { close } = useModalContext(); // Optional: get close method
return <div>{/* Modal content */}</div>;
};
index.tsx)'use client';
import { createModal } from '@lobehub/ui';
import { t } from 'i18next'; // Note: use i18next, not react-i18next
import { MyFeatureContent } from './MyFeatureContent';
export const createMyFeatureModal = () =>
createModal({
allowFullscreen: true,
children: <MyFeatureContent />,
destroyOnHidden: false,
footer: null,
styles: { body: { overflow: 'hidden', padding: 0 } },
title: t('myFeature.title', { ns: 'setting' }),
width: 'min(80%, 800px)',
});
import { createMyFeatureModal } from '@/features/MyFeatureModal';
const handleOpen = useCallback(() => {
createMyFeatureModal();
}, []);
return <Button onClick={handleOpen}>Open</Button>;
useTranslation hook (React context)import { t } from 'i18next' (non-hook, imperative)const { close, setCanDismissByClickOutside } = useModalContext();
| Property | Type | Description |
|---|---|---|
allowFullscreen | boolean | Allow fullscreen mode |
destroyOnHidden | boolean | Destroy content on close |
footer | `ReactNode | null` |
width | `string | number` |
src/features/SkillStore/index.tsxsrc/features/LibraryModal/CreateNew/index.tsxWeekly Installs
398
Repository
GitHub Stars
74.1K
First Seen
Jan 27, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
codex347
opencode347
gemini-cli339
github-copilot327
cursor293
claude-code290
Vue 3 调试指南:解决响应式、计算属性与监听器常见错误
9,900 周安装