modal
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseModal Imperative API Guide
Modal命令式API指南
Use from for imperative modal dialogs.
createModal@lobehub/ui使用中的实现命令式模态对话框。
@lobehub/uicreateModalWhy Imperative?
为什么选择命令式?
| Mode | Characteristics | Recommended |
|---|---|---|
| Declarative | Need | ❌ |
| Imperative | Call function directly, no state | ✅ |
| 模式 | 特点 | 推荐度 |
|---|---|---|
| 声明式 | 需要 | ❌ |
| 命令式 | 直接调用函数,无需状态 | ✅ |
File Structure
文件结构
features/
└── MyFeatureModal/
├── index.tsx # Export createXxxModal
└── MyFeatureContent.tsx # Modal contentfeatures/
└── MyFeatureModal/
├── index.tsx # 导出createXxxModal
└── MyFeatureContent.tsx # 模态框内容组件Implementation
实现步骤
1. Content Component (MyFeatureContent.tsx
)
MyFeatureContent.tsx1. 内容组件(MyFeatureContent.tsx
)
MyFeatureContent.tsxtsx
'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>;
};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>;
};2. Export createModal (index.tsx
)
index.tsx2. 导出createModal(index.tsx
)
index.tsxtsx
'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)',
});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)',
});3. Usage
3. 使用方式
tsx
import { createMyFeatureModal } from '@/features/MyFeatureModal';
const handleOpen = useCallback(() => {
createMyFeatureModal();
}, []);
return <Button onClick={handleOpen}>Open</Button>;tsx
import { createMyFeatureModal } from '@/features/MyFeatureModal';
const handleOpen = useCallback(() => {
createMyFeatureModal();
}, []);
return <Button onClick={handleOpen}>Open</Button>;i18n Handling
国际化(i18n)处理
- Content component: hook (React context)
useTranslation - createModal params: (non-hook, imperative)
import { t } from 'i18next'
- 内容组件:使用钩子(React上下文)
useTranslation - createModal参数:使用(非钩子,命令式方式)
import { t } from 'i18next'
useModalContext Hook
useModalContext钩子
tsx
const { close, setCanDismissByClickOutside } = useModalContext();tsx
const { close, setCanDismissByClickOutside } = useModalContext();Common Config
常用配置项
| Property | Type | Description |
|---|---|---|
| | Allow fullscreen mode |
| | Destroy content on close |
| | Footer content |
| | Modal width |
| 属性 | 类型 | 描述 |
|---|---|---|
| | 是否允许全屏模式 |
| | 关闭时是否销毁内容 |
| | 底部内容 |
| | 模态框宽度 |
Examples
示例参考
src/features/SkillStore/index.tsxsrc/features/LibraryModal/CreateNew/index.tsx
src/features/SkillStore/index.tsxsrc/features/LibraryModal/CreateNew/index.tsx