mcpField
S
syncfusion-javascript-tab

syncfusion-javascript-tab

github.com/syncfusion开发072 次安装1 周前更新
代码仓库

关于 syncfusion-javascript-tab

面向开发者的 Syncfusion TypeScript Tab 实现指南,涵盖内容渲染、交互、响应式布局、无障碍支持与状态管理。

主要功能

  1. 01从 JSON 和 HTML 渲染标签页
  2. 02响应式滚动与弹出模式
  3. 03动态加载内容
  4. 04拖放重排标签页
  5. 05键盘导航与无障碍支持
  6. 06持久保存选中状态

适用场景

  1. 01构建应用中的标签页面板
  2. 02让标签页适配窄屏
  3. 03在选中时加载内容
  4. 04刷新后恢复选中标签页

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/syncfusion/javascript-ui-controls-skills --skill syncfusion-javascript-tab

安装后在 Claude Code 中输入/syncfusion-javascript-tab确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
accessibility-and-localization.md
advanced-features.md
animation-effects.md
api-properties-reference.md
content-orientation.md
customization-and-styling.md
data-binding.md
edge-cases-and-troubleshooting.md
event-handling-reference.md
getting-started.md
methods-reference.md
responsive-adaptive-modes.md
security-html-sanitization.md
state-persistence.md
tab-structure-and-content.md

详细介绍

实现 Syncfusion TypeScript Tab 组件

Syncfusion TypeScript Tab 是一个功能强大的内容容器,可在特定空间中一次显示一个内容。它支持从 JSON 项或 HTML 元素渲染内容,并提供丰富的自定义、动画、无障碍访问和响应式设计功能。

适用场景

  • 基本 Tab 设置:创建包含标题和内容的简单 Tab 界面
  • Tab 选择与导航:处理以编程方式触发和由用户发起的 Tab 选择
  • 自定义:设置标题、内容、图标和选中状态的样式
  • 响应式设计:实现支持可滚动或弹出模式的自适应 Tab
  • 动态内容:动态加载 Tab 项或通过数据源加载
  • 高级功能:拖放排序、嵌套 Tab、可折叠 Tab、向导
  • 用户体验:添加动画、工具提示、键盘导航和无障碍访问
  • 状态管理:在不同会话之间保留 Tab 状态

主要功能

  1. 渲染:从 JSON 项集合或 HTML 元素创建 Tab
  2. 自适应:通过可滚动 Tab 和弹出菜单实现响应式渲染
  3. 自定义:支持标题图标、方向、样式和主题
  4. 动画:通过 animation 属性提供内置的 Tab 切换动画效果
  5. 无障碍访问:符合 WCAG 标准,支持键盘导航和 ARIA 属性
  6. 拖放:使用 allowDragAndDrop 对 Tab 重新排序,并在界面之间移动项目
  7. 动态加载:使用 loadOn 属性(Demand、Dynamic、Init)控制内容加载
  8. 状态持久化:使用 enablePersistence 在不同用户会话之间恢复选中的 Tab 状态
  9. 安全性:内置 HTML 清理功能,通过 enableHtmlSanitizer 防止 XSS 攻击
  10. 滑动手势:通过 swipeMode 属性使用触摸或鼠标滑动进行 Tab 导航

完整枚举参考

HeaderPosition - Tab 标题位置

控制 Tab 标题相对于内容的显示位置。

值位置使用场景
'Top'标题位于内容上方(默认)仪表板、表单、标准 Tab
'Bottom'标题位于内容下方文档查看器、底部导航
'Left'标题位于左侧管理面板、侧边栏导航
'Right'标题位于右侧特殊布局
new Tab({ headerPlacement: 'Top', items: [...] });     // Default
new Tab({ headerPlacement: 'Left', items: [...] });    // Sidebar
new Tab({ headerPlacement: 'Bottom', items: [...] });  // Bottom
new Tab({ headerPlacement: 'Right', items: [...] });   // Right side
HeightStyles - 内容高度调整模式

控制如何计算 Tab 内容高度。

值行为用法
'None'使用显式设置的 height 属性固定容器
'Auto'所有 Tab 的高度与内容最高的 Tab 相同统一高度
'Content'每个 Tab 的高度与其自身内容相同(默认)高度可变的内容
'Fill'内容填满父容器响应式填充
new Tab({ height: '400px', heightAdjustMode: 'None', items: [...] });
new Tab({ heightAdjustMode: 'Auto', items: [...] });
new Tab({ heightAdjustMode: 'Content', items: [...] });
new Tab({ height: '100%', heightAdjustMode: 'Fill', items: [...] });
ContentLoad - 内容渲染模式

控制何时将 Tab 内容加载到 DOM 中。

值加载时机DOM使用场景
'Demand'(默认)首次选中时保留Tab 数量多、内容静态
'Dynamic'每次选中时仅选中的 Tab动态/实时数据
'Init'一次性全部加载始终位于 DOM 中Tab 数量少、内容较少
new Tab({ loadOn: 'Demand', items: [...] });    // Lazy load (default)
new Tab({ loadOn: 'Dynamic', items: [...] });   // Reload each time
new Tab({ loadOn: 'Init', items: [...] });      // Load all at init
TabSwipeMode - 滑动手势控制

控制哪些输入方式会触发 Tab 滑动。

值触摸鼠标桌面端移动端
'Both'(默认)✅✅所有设备所有设备
'Touch'✅❌仅桌面端移动端用户
'Mouse'❌✅桌面端用户仅鼠标输入
'None'❌❌禁用滑动禁用滑动
new Tab({ swipeMode: 'Both', items: [...] });      // Both touch and mouse
new Tab({ swipeMode: 'Touch', items: [...] });     // Mobile touch only
new Tab({ swipeMode: 'Mouse', items: [...] });     // Desktop mouse only
new Tab({ swipeMode: 'None', items: [...] });      // Disabled swiping

核心文档(从这里开始)
  1. 入门指南 ⭐ 从这里开始

    • 安装和设置
    • 第一个 Tab 组件
    • HTML 结构和导入
  2. Tab 结构与内容

    • Tab 项目结构
    • 标题和内容
    • Tab 选择
API 参考与属性
  1. 完整 API 属性参考 📚 全面

    • 记录了所有 24+ 个属性
    • 每个属性的用法示例
    • 属性组合与建议
    • 核心、渲染、交互和动画属性
  2. 事件处理参考 📚 全面

    • 记录了所有 11 个事件
    • 事件参数(SelectEventArgs、SelectingEventArgs、DragEventArgs 等)
    • 事件生命周期与时序
    • 实用事件模式
  3. 完整方法参考 📚 全面

    • 记录了所有 18 个方法及其签名和参数
    • Tab 管理方法(addTab、removeTab、select)
    • 可见性和状态控制(hideTab、enableTab、disable)
    • 事件管理(addEventListener、removeEventListener)
    • 组件生命周期(destroy、refresh、refreshActiveTab)
    • 实用方法(getItemIndex、getRootElement、appendTo、dataBind)
    • 每个方法的实用代码示例
    • 方法交互模式和最佳实践
自定义与样式
  1. 自定义与样式
    • CSS 结构
    • 标题和内容样式
    • showCloseButton 属性
    • 内置主题
    • 自定义样式示例
内容与数据
  1. 数据绑定与动态内容
    • 加载方法(JSON、AJAX、DataManager)
    • loadOn 属性(Demand、Dynamic、Init)
    • addTab() 和 removeTab() 方法
    • POST 请求和 API 集成
    • 内容渲染模式
布局与响应式
  1. 内容方向与标题位置

    • headerPlacement(Top、Bottom、Left、Right)
    • 水平与垂直布局
    • 响应式设计模式
    • 侧边栏导航实现
  2. 响应式与自适应模式

    • 可滚动模式
    • 弹出窗口/下拉菜单模式
    • 多行模式
    • overflowMode 属性
高级功能与特性
  1. 高级功能

    • 拖放(allowDragAndDrop、dragArea)
    • reorderActiveTab 属性
    • 嵌套和可折叠的 Tab
    • 基于 Tab 的向导
    • 图标和工具提示集成
  2. 动画与过渡效果

    • animation 属性(TabAnimationSettingsModel)
    • 效果:SlideLeftIn、SlideRightIn、FadeIn、ZoomIn 等
    • swipeMode 属性(Both、Touch、Mouse、None)
    • 自定义动画时长
  3. 状态持久化

    • enablePersistence 属性
    • 基于 localStorage 的持久化
    • 多 Tab 表单和仪表板
    • 高级持久化模式
无障碍与国际化
  1. 无障碍与本地化
    • WCAG 合规性和 ARIA
    • 键盘导航
    • enableRtl 属性(RTL 支持)
    • locale 属性(i18n)
安全
  1. 安全与 HTML 清理 🔒 重要
    • enableHtmlSanitizer 属性
    • XSS 防护
    • 用户内容保护
    • 安全最佳实践
故障排除
  1. 边缘情况与故障排除
    • 高度和滚动管理
    • 浏览器兼容性

快速入门

使用 JSON 项目的基本 Tab
import { Tab } from '@syncfusion/ej2-navigations';

let tabObj: Tab = new Tab({
    items: [
        {
            header: { 'text': 'Twitter' },
            content: 'Twitter is an online social networking service...'
        },
        {
            header: { 'text': 'Facebook' },
            content: 'Facebook is an online social networking service...'
        },
        {
            header: { 'text': 'WhatsApp' },
            content: 'WhatsApp Messenger is a proprietary cross-platform...'
        }
    ]
});

tabObj.appendTo('#element');
HTML 结构
<!DOCTYPE html>
<html lang="en">
<head>
    <title>Tab Example</title>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
</head>
<body>
    <div id="element"></div>
</body>
</html>
CSS 设置
@import '../../node_modules/@syncfusion/ej2-base/styles/fluent2.css';
@import '../../node_modules/@syncfusion/ej2-buttons/styles/fluent2.css';
@import '../../node_modules/@syncfusion/ej2-popups/styles/fluent2.css';
@import '../../node_modules/@syncfusion/ej2-navigations/styles/fluent2.css';

特定功能的使用场景

自定义选项卡内容高度

使用 heightAdjustMode 属性控制选项卡内容高度的调整方式:

let tabObj: Tab = new Tab({
    heightAdjustMode: 'Auto',  // 'None', 'Auto', 'Content', 'Fill'
    height: '400px',  // Set container height when using 'None' or 'Auto'
    items: [
        { header: { 'text': 'Tab 1' }, content: 'Short content' },
        { header: { 'text': 'Tab 2' }, content: 'Much longer content with more text...' },
        { header: { 'text': 'Tab 3' }, content: 'Another tab with varying content length' }
    ]
});
tabObj.appendTo('#element');

高度模式:

  • None:内容高度与选项卡容器高度一致(需要显式设置高度)
  • Auto:所有选项卡的高度调整为与内容最高的选项卡一致
  • Content:每个选项卡的高度调整为与自身内容一致(默认)
  • Fill:选项卡内容完全填满父元素
在选项卡上显示关闭按钮

允许用户点击关闭按钮关闭单个选项卡:

let tabObj: Tab = new Tab({
    showCloseButton: true,
    items: [
        { header: { 'text': 'Home' }, content: 'Home content...' },
        { header: { 'text': 'Editor' }, content: 'Editor content...' },
        { header: { 'text': 'Settings' }, content: 'Settings content...' }
    ]
});
tabObj.appendTo('#element');

// Optionally handle close button clicks
tabObj.element.addEventListener('close', (e: any) => {
    console.log(`Closed tab at index: ${e.index}`);
});
在弹出模式下重新排列活动选项卡

控制选项卡溢出到弹出菜单时活动选项卡的行为:

let tabObj: Tab = new Tab({
    overflowMode: 'Popup',  // Enable popup mode for overflow tabs
    reorderActiveTab: false,  // Don't reorder active tab in popup (keep it highlighted)
    heightAdjustMode: 'Auto',
    items: [
        { header: { 'text': 'India' }, content: 'India content...' },
        { header: { 'text': 'Canada' }, content: 'Canada content...' },
        { header: { 'text': 'Australia' }, content: 'Australia content...' },
        // ... many more tabs that trigger popup mode
    ]
});
tabObj.appendTo('#element');

当 reorderActiveTab 为 true(默认值)时,点击弹出菜单中的选项卡会将其移至主视图。当其为 false 时,选项卡会在弹出菜单中保持高亮,而不会被重新排列到主视图。

动态加载选项卡项

根据用户操作以编程方式添加选项卡:

let tabObj: Tab = new Tab({
    items: [
        { header: { 'text': 'Home' }, content: 'Home content' }
    ]
});
tabObj.appendTo('#element');

// Add new tab dynamically
document.getElementById('addTabBtn')?.addEventListener('click', () => {
    let newTabCount = tabObj.items.length;
    let newTab = {
        header: { 'text': `Tab ${newTabCount}` },
        content: `Content for tab ${newTabCount}`
    };
    tabObj.addTab([newTab]);  // Add at end
    // Or insert at specific position: tabObj.addTab([newTab], 1);
});

// Remove tab by index
document.getElementById('removeTabBtn')?.addEventListener('click', () => {
    if (tabObj.items.length > 1) {
        tabObj.removeTab(tabObj.items.length - 1);  // Remove last tab
    }
});
页面刷新后保留状态

自动保存并恢复选中的选项卡:

let tabObj: Tab = new Tab({
    enablePersistence: true,  // Enable localStorage-based persistence
    items: [
        { header: { 'text': 'Dashboard' }, content: 'Dashboard...' },
        { header: { 'text': 'Analytics' }, content: 'Analytics...' },
        { header: { 'text': 'Settings' }, content: 'Settings...' }
    ]
});
tabObj.appendTo('#element');

// When user returns to page, the previously selected tab is automatically restored
自定义选中选项卡的外观

使用 CSS 类覆盖选中选项卡的默认样式:

let tabObj: Tab = new Tab({
    cssClass: 'e-tab-custom-style',  // Add custom CSS class
    items: [...]
});
tabObj.appendTo('#element');

然后定义自定义 CSS:

.e-tab.e-tab-custom-style .e-tab-header .e-toolbar-item.e-active {
    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
    color: white;
    border-bottom: 3px solid #667eea;
}

.e-tab.e-tab-custom-style .e-tab-header .e-toolbar-item.e-active .e-tab-text {
    font-weight: 600;
    color: white;
}
通过 POST 请求加载内容

从服务端获取选项卡内容:

import { Tab } from '@syncfusion/ej2-navigations';
import { Ajax } from '@syncfusion/ej2-base';

let ajax: Ajax = new Ajax('./api/tab-content', 'GET', true);

ajax.onSuccess = (data: string): void => {
    let tabObj: Tab = new Tab({
        items: [
            { header: { 'text': 'Home' }, content: 'Home content' },
            { header: { 'text': 'Remote Content' }, content: data }
        ]
    });
    tabObj.appendTo('#element');
};

ajax.send();

// Or using Fetch API
async function loadTabContent() {
    try {
        let response = await fetch('api/tab-data', { method: 'POST' });
        let data = await response.json();
        
        let tabObj = new Tab({
            items: data.tabs  // Server returns array of tab items
        });
        tabObj.appendTo('#element');
    } catch (error) {
        console.error('Failed to load tabs:', error);
    }
}

loadTabContent();
在选项卡之间或与外部来源进行拖放

允许用户在同一选项卡内移动选项卡项,或将其移至外部组件:

let tabObj: Tab = new Tab({
    allowDragAndDrop: true,  // Enable drag-drop
    dragArea: '#dragContainer',  // Restrict drag area
    items: [...],
    dragged: (args) => {
        console.log(`Item moved from ${args.draggedIndex} to ${args.droppedIndex}`);
    }
});
tabObj.appendTo('#element');

// Transfer tabs between two Tab instances
let sourceTab: Tab = new Tab({
    allowDragAndDrop: true,
    dragArea: '#container',
    items: [{ header: { 'text': 'Source 1' }, content: 'Can be moved' }]
});
sourceTab.appendTo('#sourceTab');

let destTab: Tab = new Tab({
    allowDragAndDrop: true,
    dragArea: '#container',
    items: [{ header: { 'text': 'Dest 1' }, content: 'Receives items' }]
});
destTab.appendTo('#destTab');
内容渲染模式

控制选项卡内容的加载方式和时机:

// Mode 1: On-Demand (Lazy Loading) - Default
let tabObj: Tab = new Tab({
    // Content loaded only when tab is selected
    // Content persists in DOM once loaded
    items: [
        { header: { 'text': 'Tab 1' }, content: 'Content loaded on first select' }
    ]
});
tabObj.appendTo('#element');

// Mode 2: Dynamic - Only selected content in DOM
let dynamicTab: Tab = new Tab({
    loadOn: 'Dynamic',  // Content reloaded each time tab is selected
    items: []
});
dynamicTab.appendTo('#element');

// Mode 3: Initial - All content loaded upfront
let initialTab: Tab = new Tab({
    loadOn: 'Init',  // All tabs rendered on initialization
    items: []
});
initialTab.appendTo('#element');

常见模式

模式 1:以编程方式选择选项卡
// Select a tab by index
tabObj.select(1);  // Select second tab

// Get currently selected tab index
let activeIndex = tabObj.selectedItem;

// Determine if selection was user interaction or programmatic
tabObj.selecting = (args) => {
    if (args.isInteracted) {
        console.log('User clicked tab');
    } else {
        console.log('Tab selected programmatically');
    }
};
模式 2:动态添加选项卡
// Add new tab item dynamically
tabObj.addTab([
    {
        header: { 'text': 'New Tab' },
        content: 'New content here'
    }
], 2); // Insert at index 2
模式 3:带滚动功能的响应式选项卡
let tabObj: Tab = new Tab({
    items: [...], // your items
    heightAdjustMode: 'Auto',
    overflowMode: 'Scrollable'  // Enable scrollable mode
});
模式 4:带图标的选项卡
let tabObj: Tab = new Tab({
    items: [
        {
            header: { 
                'text': 'Settings',
                'iconCss': 'e-icon-settings'  // Add icon class
            },
            content: 'Settings content...'
        }
    ]
});

主要属性和配置

属性类型用途常见值
itemsArray选项卡项集合由项对象组成的数组
selectedItemnumber活动选项卡索引0、1、2、...
heightAdjustModestring自动调整高度'Auto'、'Content'、'Scroll'
overflowModestring处理溢出的选项卡'Scrollable'、'Popup'、'MultiRow'
animationobject动画设置{ previous, next }
headerPlacementstring标题栏位置'Top'、'Bottom'、'Left'、'Right'
enableRtlbooleanRTL 支持true、false
allowDragAndDropboolean启用拖放true、false
enablePersistenceboolean状态持久化true、false

常见用例

  1. 多面板表单:使用多个选项卡组织表单字段并进行验证
  2. 文档站点:创建选项卡式代码示例(TypeScript、JavaScript、HTML)
  3. 仪表板布局:在选项卡分区中组织仪表板小组件
  4. 分步向导:使用选项卡创建顺序工作流
  5. 内容组织:对大型数据集进行分类和展示
  6. 功能切换:在选项卡面板中显示或隐藏相关功能
  7. 管理界面:组织设置和配置选项
  8. 移动端导航:为小屏幕提供响应式的选项卡导航

后续步骤:

  • 根据使用场景阅读相应的参考文件
  • 查看快速入门示例,了解基本设置
  • 查看适用于具体场景的常见模式
  • 参阅边缘情况指南以排查问题

评论

支持 Markdown