npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@clake/react-bootstrap4-window

v1.4.1

Published

react bootstrap v4 window

Downloads

267

Readme

react-bootstrap-v4-window

基于 React + Bootstrap 4 的企业级桌面级 UI 组件库,提供 Window、CTable、WModal 等核心组件,适用于构建后台管理系统、数据看板等场景。

安装

npm install @clake/react-bootstrap4  # 基础依赖
npm install react bootstrap         # React + Bootstrap 4

组件总览

| 组件 | 说明 | |------|------| | Window | 可拖拽、可缩放、可最大化的浮动窗口 | | WindowGroup | 多窗口管理器,负责窗口层级和状态管理 | | TopMenu | 顶部导航菜单 | | CTable | 功能丰富的数据表格(排序、过滤、编辑、分页、右键菜单) | | WModal | 模态对话框(Alert / Confirm / Loading / View) | | CTableInput | CTable 编辑模式下的输入框 | | CTableTextArea | CTable 编辑模式下的多行文本框 | | WCombo | 下拉选择框(浮层渲染) | | WCalendar | 日期选择器(浮层渲染) | | PageBar | 分页栏 | | IconButton | 图标按钮 | | Drag | 拖动控制类(TS Class) |


Window

可拖拽、可缩放、可最大化的浮动窗口组件,支持窗口层级管理。

Props

| 属性 | 类型 | 默认值 | 说明 | |------|------|--------|------| | title | string | 'Window' | 窗口标题 | | width | string | '600px' | 窗口宽度 | | height | string | '400px' | 窗口高度 | | x | string | — | 初始 X 坐标 | | y | string | — | 初始 Y 坐标 | | backColor | string | — | 背景颜色 | | name | string | — | 窗口唯一标识(用于 WindowGroup 管理) | | parent | any | — | 父级 WindowGroup 实例 | | marginTop | any | — | 顶部安全区域偏移 | | isMaxBtn | boolean | true | 显示最大化按钮 | | isCloseBtn | boolean | true | 显示关闭按钮 |

Static Properties

| 属性 | 值 | 说明 | |------|-----|------| | Window.EVT_RESIZE | 'resize' | 窗口缩放事件 | | Window.EVT_MAXWINDOW | 'max_window' | 窗口最大化事件 | | Window.EVT_SHOW | 'show' | 窗口显示事件 | | Window.EVT_CLOSE | 'close' | 窗口关闭事件 | | Window.EVT_BEFORE_CLOSE | 'before_close' | 关闭前事件 |

Methods

| 方法 | 签名 | 说明 | |------|------|------| | show | (option: { params?: any; x?: number; y?: number }) => void | 显示窗口 | | close | () => void | 关闭窗口 | | hide | () => void | 隐藏窗口 | | resize | (width: number, height: number) => void | 调整窗口大小 | | move | (x: number, y: number) => void | 移动窗口位置 | | max | (flag: boolean) => void | 最大化/还原窗口 | | setIndex | (index: number) => void | 设置层级 z-index | | setTitle | (title: string) => void | 修改标题 | | setActive | (active: boolean) => void | 设置激活状态 | | getPosition | () => { left: number; top: number } | 获取窗口位置 | | on | (name: string, fn: Function) => void | 绑定事件 | | off | (name: string) => void | 解绑事件 |

Events

| 事件名 | 参数 | 说明 | |--------|------|------| | show | params | 窗口显示后触发 | | close | — | 窗口关闭后触发 | | before_close | — | 关闭前触发(返回 false 可阻止关闭) | | max_window | — | 最大化时触发 | | resize | width, height | 缩放时触发 |

Usage

import { Window, WindowGroup } from '@clake/react-bootstrap-v4-window';

function App() {
  const winRef = React.useRef(null);

  React.useEffect(() => {
    // 窗口挂载后打开
    if (winRef.current) {
      winRef.current.show({ x: 100, y: 100 });
    }
  }, []);

  return (
    <WindowGroup>
      <Window
        ref={winRef}
        name="myWindow"
        title="我的窗口"
        width="800px"
        height="500px"
        isMaxBtn={true}
        isCloseBtn={true}
      >
        <p>窗口内容区域</p>
      </Window>
    </WindowGroup>
  );
}

WindowGroup

多窗口管理器,负责窗口的显示、隐藏、层级排序。

Props

无特殊 Props,通过 children 传入 Window 组件。

Methods

| 方法 | 签名 | 说明 | |------|------|------| | open | (name: string, params?: any) => void | 打开指定窗口 | | show | (name: string, params?: any) => void | 显示窗口(含定位) | | close | (name: string) => void | 关闭指定窗口 | | changeWindowIndex | (name: string) => void | 调整窗口层级 |

Usage

import { Window, WindowGroup } from '@clake/react-bootstrap-v4-window';

function App() {
  const groupRef = React.useRef(null);

  const handleOpen = () => {
    groupRef.current.open('settings', { userId: 1 });
  };

  return (
    <div>
      <button onClick={handleOpen}>打开设置窗口</button>
      <WindowGroup ref={groupRef}>
        <Window name="settings" title="系统设置" width="600px" height="400px">
          <p>设置内容</p>
        </Window>
        <Window name="help" title="帮助" width="400px" height="300px">
          <p>帮助文档</p>
        </Window>
      </WindowGroup>
    </div>
  );
}

TopMenu

顶部导航菜单组件,支持子菜单浮层展示。

TopMenu Props

| 属性 | 类型 | 默认值 | 说明 | |------|------|--------|------| | top | boolean | false | 是否为置顶样式 | | onClick | (key: string) => void | — | 点击菜单项回调 |

TopMenu.Item Props

| 属性 | 类型 | 默认值 | 说明 | |------|------|--------|------| | name | string | — | 菜单项唯一标识 | | text | string | — | 显示文本 | | onClick | (key: string) => void | — | 点击回调 |

Usage

import { TopMenu } from '@clake/react-bootstrap-v4-window';

function App() {
  const handleClick = (key) => {
    console.log('选中菜单:', key);
  };

  return (
    <TopMenu top={false} onClick={handleClick}>
      <TopMenu.Item name="home" text="首页" />
      <TopMenu.Item name="about" text="关于" />
      <TopMenu.Item name="contact" text="联系">
        {/* 子菜单 */}
      </TopMenu.Item>
    </TopMenu>
  );
}

CTable

功能丰富的数据表格组件,支持排序、过滤、编辑、分页、右键菜单、列拖拽、多选等功能。

CTable Props

| 属性 | 类型 | 默认值 | 说明 | |------|------|--------|------| | data | any[] | [] | 表格数据源 | | dataCount | number | 1 | 数据总记录数 | | page | number | — | 当前页码 | | currentPage | number | 1 | 第一页 | | select | boolean | true | 第一列是否显示复选框 | | selectOnce | boolean | false | 是否只能选中一项 | | header | boolean | true | 是否显示表头 | | foot | any | true | 是否显示表尾(分页栏) | | striped | boolean | true | 斑马纹样式 | | bordered | boolean | true | 是否显示边框 | | hover | boolean | true | 行 hover 效果 | | sm | boolean | true | 小型化显示 | | fontSm | boolean | true | 文字最小化 | | responsive | boolean | false | 响应式容器 | | align | string | 'left' | 文字对齐方式(left/center/right) | | tree | string | — | 是否显示树结构 | | center | boolean | false | 居中对齐 | | noWrap | boolean | true | 是否自动换行 | | menu | boolean | true | 是否启用右键菜单 | | total | any | null | 每列汇总数据 | | totalFields | string[] | — | 显示汇总的字段列表 | | edit | boolean | false | 是否启用编辑模式 | | newBar | boolean | true | 是否显示新增行 | | nodel | boolean | false | 是否隐藏删除按钮 | | sort | boolean | false | 是否启用排序 | | filter | boolean | false | 是否启用过滤 | | move | boolean | true | 列宽是否可拖拽 | | theme | string | — | 主题(primary/secondary/success/danger/warning/info/light/dark) | | headerTheme | string | 'primary' | 表头主题 | | headClass | string | — | 表头 CSS 类 | | width | string | — | 表格宽度 | | height | string | — | 表格高度 | | rowHeight | string | — | 行高 | | absolute | boolean | false | 是否绝对定位 | | x | string | — | 绝对定位 X 坐标 | | y | string | — | 绝对定位 Y 坐标 | | position | any | — | 定位对象(top/left/right/bottom) | | showPages | number | 10 | 分页器显示页数 | | showNumbers | number | 30 | 每页显示条数 | | focus | boolean | true | 是否显示焦点行 | | rowCheck | boolean | false | 是否全行点选 | | allSelect | boolean | true | 是否显示全选 | | lang | any | 'en' | 自定义语言 | | columnStyle | any | — | 列统一样式 | | jsxId | string | — | 唯一标识 | | hidden | boolean | false | 是否隐藏表格 | | disabled | boolean | false | 是否禁用 |

CTable Events

| 事件 | 签名 | 说明 | |------|------|------| | onClick | (row, idx, jsxId) => void | 行点击事件 | | onCheck | (checked, row, jsxId) => void | 行选择事件 | | onCheckAll | (checked, data, jsxId) => void | 全选事件 | | onFilter | (text, field, type, jsxId) => void | 过滤事件 | | onSort | (field, sort_type, jsxId) => void | 排序事件 | | onSelectPage | (page, jsxId) => void | 翻页事件 | | onRefresh | () => void | 刷新事件 | | onDelete | (row, idx, callback, jsxId) => void | 删除事件 | | onChange | (idx, field, row, all_data, jsxId) => void | 数据修改事件 | | sourceFunc | (opt, callback) => void | 数据源函数(分页/过滤) | | source | string | — | 数据源标识 | | customMenu | any[] | — | 自定义右键菜单 |

CTable Sub-components

| 组件 | 说明 | |------|------| | CTable.Toolbar | 工具栏(位于表尾) | | CTable.Btnbar | 工具栏按钮 |

CTable Columns (children) Props

| 属性 | 类型 | 默认值 | 说明 | |------|------|--------|------| | field | string | — | 数据字段名(必填) | | text | string | — | 列头文本 | | width | string | — | 列宽 | | align | string | — | 对齐方式 | | dataType | string | — | 数据类型(text/number/date) | | type | string | — | 字段类型(用于编辑模式) | | combo | any | — | 下拉配置 | | comboData | any | — | 下拉数据 | | calendar | boolean | — | 日期选择 | | calendarFormat | string | — | 日期格式 | | hide | boolean | false | 隐藏列 | | disabled | boolean | false | 编辑模式下禁用 | | color | string | — | 文字颜色 | | bgColor | string | — | 背景颜色 | | HeaderColor | string | — | 表头文字颜色 | | HeaderBgColor | string | — | 表头背景颜色 | | onFormat | (value, row, field) => ReactNode | — | 格式化渲染 | | onEdit | (idx, val, row, callback) => void | — | 编辑回调 | | onClick | (row) => void | — | 单元格点击 | | onDoubleClick | (row) => void | — | 单元格双击 | | className | string | — | 单元格类名 | | def | any | — | 默认值 | | children | ReactNode | — | 自定义渲染 |

CTable Methods

| 方法 | 签名 | 说明 | |------|------|------| | getSelectRows | () => any[] | 获取选中行数据 | | setSelectRows | (key: string, list: any[]) => void | 设置选中行 | | setData | (data: any[]) => void | 设置数据 | | reset | (data?: any[]) => void | 重置数据 | | getEditRows | () => any[] | 获取编辑行 | | clearEditRows | () => void | 清空编辑行 |

Usage

import { CTable } from '@clake/react-bootstrap-v4-window';

function App() {
  const [data, setData] = React.useState([
    { id: 1, name: 'Alice', age: 25, dept: 'Engineering' },
    { id: 2, name: 'Bob', age: 30, dept: 'Marketing' },
  ]);

  const handleClick = (row) => {
    console.log('点击行:', row);
  };

  const handleCheck = (checked, row) => {
    console.log(checked ? '选中' : '取消', row);
  };

  const handleSort = (field, sortType) => {
    console.log('排序:', field, sortType);
  };

  return (
    <CTable
      data={data}
      dataCount={data.length}
      select={true}
      edit={false}
      sort={true}
      filter={true}
      bordered={true}
      hover={true}
      striped={true}
      onClick={handleClick}
      onCheck={handleCheck}
      onSort={handleSort}
      showNumbers={10}
      showPages={5}
    >
      <CTable.Column
        field="name"
        text="姓名"
        width="150px"
        align="left"
      />
      <CTable.Column
        field="age"
        text="年龄"
        width="80px"
        dataType="number"
        align="center"
      />
      <CTable.Column
        field="dept"
        text="部门"
        width="120px"
      />
    </CTable>
  );
}

编辑模式示例:

<CTable
  data={data}
  dataCount={data.length}
  edit={true}
  newBar={true}
  onChange={(idx, field, row, allData) => {
    console.log('修改:', idx, field, row);
  }}
>
  <CTable.Column field="name" text="姓名" />
  <CTable.Column field="age" text="年龄" dataType="number" />
  <CTable.Column field="combo" text="下拉" combo={{ data: ['A', 'B', 'C'] }} />
  <CTable.Column field="date" text="日期" calendar calendarFormat="YYYY-MM-DD" />
  <CTable.Column field="desc" text="描述" type="textarea" rows={3} />
  <CTable.Column field="check" text="是否" type="checkbox" />
</CTable>

WModal

模态对话框组件,支持 Alert、Confirm、Loading、View 四种类型。

WModal Props

| 属性 | 类型 | 默认值 | 说明 | |------|------|--------|------| | onOpen | () => void | — | 打开回调 | | onClose | () => void | — | 关闭回调 | | center | boolean | false | 居中显示 | | fade | boolean | true | 淡入淡出动画 | | blurSelector | string | — | 模糊选择器 | | width | string | '300px' | 弹窗宽度 |

Methods (静态方法)

| 方法 | 签名 | 说明 | |------|------|------| | alert | (opt: { title?, content?, callback?, center?, fade?, header?, width?, btns? } \| string, cb?: Function) => void | 提示弹窗 | | confirm | (opt: { title?, content?, callback?, center?, fade?, header?, width?, btns? } \| string, cb?: Function) => void | 确认弹窗 | | loading | (opt: { title?, content?, center?, fade?, header?, width?, btns? } \| string) => void | 加载弹窗 | | view | (opt: { title?, content?, callback?, center?, fade?, header?, width?, btns? }) => void | 视图弹窗 |

ModalOptions

| 属性 | 类型 | 说明 | |------|------|------| | title | string | 弹窗标题 | | content | any | 弹窗内容 | | callback | Function | 回调函数 | | center | boolean | 居中 | | fade | boolean | 动画 | | header | boolean | 显示头部 | | width | string | 宽度 | | btns | Object | 按钮文本配置(ok/cancel) | | isCloseBtn | boolean | 显示关闭按钮 | | type | number | 类型(0=Alert, 1=Confirm, 2=Loading, 3=View) |

Usage

import { WModal } from '@clake/react-bootstrap-v4-window';

function App() {
  const modalRef = React.useRef(null);

  const showAlert = () => {
    WModal.alert({
      title: '提示',
      content: '这是一条提示信息',
      callback: () => console.log('确认'),
    });
  };

  const showConfirm = () => {
    WModal.confirm({
      title: '确认',
      content: '确定要删除吗?',
      btns: { ok: '删除', cancel: '取消' },
      callback: (flag) => {
        console.log(flag ? '已删除' : '取消');
      },
    });
  };

  const showLoading = () => {
    WModal.loading({
      title: '加载中',
      content: '正在处理数据...',
    });
    setTimeout(() => WModal.close(), 2000);
  };

  return (
    <div>
      <button onClick={showAlert}>Alert</button>
      <button onClick={showConfirm}>Confirm</button>
      <button onClick={showLoading}>Loading</button>
      <WModal ref={modalRef} />
    </div>
  );
}

CTableInput

CTable 编辑模式下的输入框组件。

Props

| 属性 | 类型 | 默认值 | 说明 | |------|------|--------|------| | data | any | — | 输入值 | | align | string | — | 对齐方式 | | disabled | boolean | false | 是否禁用 | | combo | any | — | 下拉配置 | | comboData | any | — | 下拉数据 | | calendar | boolean | false | 是否显示日期选择 | | calendarFormat | string | — | 日期格式 | | onChange | (evt, val, row?) => void | — | 值变化回调 | | onSelect | () => void | — | 选择回调 | | onFocus | (e) => void | — | 聚焦回调 | | onBlur | (e) => void | — | 失焦回调 | | readOnly | boolean | false | 只读 | | number | boolean | false | 只能输入数字 |

Usage

import CTableInput from '@clake/react-bootstrap-v4-window/CTableInput';

function App() {
  return (
    <CTableInput
      data="默认值"
      align="right"
      onChange={(evt, val) => console.log('值:', val)}
    />
  );
}

带下拉选择:

<CTableInput
  data={selectedValue}
  combo={{ data: ['选项1', '选项2', '选项3'] }}
  comboData={comboList}
  onChange={(evt, val) => setSelectedValue(val)}
/>

带日期选择:

<CTableInput
  data={dateValue}
  calendar
  calendarFormat="YYYY-MM-DD"
  onChange={(evt, val) => setDateValue(val)}
/>

CTableTextArea

CTable 编辑模式下的多行文本框组件。

Props

| 属性 | 类型 | 默认值 | 说明 | |------|------|--------|------| | data | any | — | 输入值 | | align | string | — | 对齐方式 | | disabled | boolean | false | 是否禁用 | | onChange | (evt, val, row?) => void | — | 值变化回调 | | onSelect | () => void | — | 选择回调 | | onFocus | (e) => void | — | 聚焦回调 | | onBlur | (e) => void | — | 失焦回调 | | readOnly | boolean | false | 只读 | | rows | number | 1 | 行数 |

Usage

import CTableTextArea from '@clake/react-bootstrap-v4-window/CTableTextArea';

function App() {
  return (
    <CTableTextArea
      data="多行文本内容"
      rows={5}
      onChange={(evt, val) => console.log('值:', val)}
    />
  );
}

WCombo

下拉选择框组件,浮层渲染,支持搜索过滤。

Props

| 属性 | 类型 | 默认值 | 说明 | |------|------|--------|------| | data | any | — | 下拉数据源 | | combo | any | — | 底层 Combo 配置 | | noSearch | boolean | false | 是否隐藏搜索框 | | onSelect | (val, row, evt) => void | — | 选择回调 |

Methods

| 方法 | 签名 | 说明 | |------|------|------| | show | (search: string, e: Event) => void | 显示下拉面板 | | hide | () => void | 隐藏下拉面板 | | filter | (val: any) => void | 过滤选项 |

Usage

import WCombo from '@clake/react-bootstrap-v4-window/WCombo';

function App() {
  const handleSelect = (val, row, evt) => {
    console.log('选中:', val, row);
  };

  return (
    <WCombo
      combo={{ data: ['Apple', 'Banana', 'Orange'] }}
      data={comboList}
      onSelect={handleSelect}
    />
  );
}

WCalendar

日期选择器组件,浮层渲染。

Props

| 属性 | 类型 | 默认值 | 说明 | |------|------|--------|------| | value | any | — | 选中日期值 | | combo | any | — | 下拉配置 | | noSearch | boolean | false | 隐藏搜索 | | format | string | — | 日期格式 | | onSelect | (val, row) => void | — | 选择回调 |

Methods

| 方法 | 签名 | 说明 | |------|------|------| | show | (e: Event) => void | 显示日期面板 | | hide | () => void | 隐藏日期面板 | | format | () => string | 获取格式化后的日期 | | setCurrentDate | (d: Date) => void | 设置当前日期 |

Usage

import WCalendar from '@clake/react-bootstrap-v4-window/WCalendar';

function App() {
  const handleSelect = (val, evt) => {
    console.log('选中日期:', val);
  };

  return (
    <WCalendar
      value="2024-01-01"
      format="YYYY-MM-DD"
      onSelect={handleSelect}
    />
  );
}

PageBar

分页栏组件。

Props

| 属性 | 类型 | 默认值 | 说明 | |------|------|--------|------| | page | number | — | 当前页码(必填) | | dataCount | number | — | 总记录数(必填) | | showNumbers | number | — | 每页显示条数(必填) | | onSelect | (page: number) => void | — | 翻页回调(必填) | | showPages | number | — | 显示页数 | | noPage | boolean | false | 是否隐藏翻页控件 |

Usage

import PageBar from '@clake/react-bootstrap-v4-window/PageBar';

function App() {
  const [page, setPage] = React.useState(1);
  const dataCount = 100;

  return (
    <PageBar
      page={page}
      dataCount={dataCount}
      showNumbers={10}
      showPages={5}
      onSelect={(p) => setPage(p)}
    />
  );
}

IconButton

图标按钮组件。

Props

| 属性 | 类型 | 默认值 | 说明 | |------|------|--------|------| | icon | string | — | 图标名称(必填) | | iconType | string | 'solid' | 图标类型(solid/regular/light/brands) | | color | string | — | 颜色 | | onClick | (evt) => void | — | 点击回调 |

Usage

import IconButton from '@clake/react-bootstrap-v4-window/IconButton';

function App() {
  return (
    <div>
      <IconButton icon="home" onClick={() => console.log('home')} />
      <IconButton icon="user" iconType="regular" color="red" />
      <IconButton icon="react" iconType="brands" />
    </div>
  );
}

Drag

拖动控制类(TypeScript Class),用于实现元素拖拽功能。

Constructor

constructor(dragDom: HTMLElement | string, eventDom: HTMLElement | string, events: MoveEvent)

| 参数 | 类型 | 说明 | |------|------|------| | dragDom | HTMLElement \| string | 被拖动元素(DOM 或选择器) | | eventDom | HTMLElement \| string | 触发拖动的事件元素(DOM 或选择器) | | events | MoveEvent | 事件回调对象 |

MoveEvent

| 属性 | 签名 | 说明 | |------|------|------| | start | (dragDom, eventDom, event) => boolean | 拖动开始(返回 false 取消) | | move | (move, dragDom, eventDom, event) => void | 拖动中 | | end | (dragDom, eventDom, event) => boolean | 拖动结束 |

Methods

| 方法 | 签名 | 说明 | |------|------|------| | setDragDom | (dom: HTMLElement \| string) => void | 设置被拖动元素 | | setEventDom | (dom: HTMLElement \| string) => void | 设置事件元素 | | unbind | () => void | 解绑事件 |

Usage

import Drag from '@clake/react-bootstrap-v4-window/Drag';

// 使用 DOM 元素
const dragDom = document.querySelector('.draggable') as HTMLElement;
const eventDom = document.querySelector('.header') as HTMLElement;

const drag = new Drag(dragDom, eventDom, {
  start: (dragDom, eventDom, event) => {
    console.log('开始拖动');
    return true;
  },
  move: (move, dragDom, eventDom, event) => {
    console.log('拖动中:', move);
  },
  end: (dragDom, eventDom, event) => {
    console.log('拖动结束');
  },
});

// 解绑
drag.unbind();

完整示例

import React from 'react';
import { Window, WindowGroup, CTable } from '@clake/react-bootstrap-v4-window';

function App() {
  const [tableData, setTableData] = React.useState([
    { id: 1, name: 'Alice', age: 25, status: 'Active' },
    { id: 2, name: 'Bob', age: 30, status: 'Inactive' },
    { id: 3, name: 'Charlie', age: 28, status: 'Active' },
  ]);

  const handleRowClick = (row) => {
    console.log('点击:', row);
  };

  const handleCheck = (checked, row) => {
    console.log(checked ? '选中' : '取消', row);
  };

  const handleDelete = (row, idx, callback) => {
    if (window.confirm(`确定删除 ${row.name}?`)) {
      const newData = tableData.filter((_, i) => i !== idx);
      setTableData(newData);
      callback(idx);
    }
  };

  return (
    <WindowGroup>
      <Window
        name="mainWindow"
        title="用户管理"
        width="900px"
        height="600px"
        isMaxBtn={true}
        isCloseBtn={true}
      >
        <CTable
          data={tableData}
          dataCount={tableData.length}
          select={true}
          edit={false}
          sort={true}
          filter={true}
          menu={true}
          bordered={true}
          hover={true}
          striped={true}
          onClick={handleRowClick}
          onCheck={handleCheck}
          onDelete={handleDelete}
          showNumbers={10}
          showPages={5}
        >
          <CTable.Column field="name" text="姓名" width="150px" />
          <CTable.Column field="age" text="年龄" width="80px" dataType="number" />
          <CTable.Column field="status" text="状态" width="100px" />
        </CTable>
      </Window>
    </WindowGroup>
  );
}

export default App;