@cloud-ru/ds-uikit-product-widget

中文文档
2.1.0发布于 2026/11/11Apache-2.0TypeScriptESM + CJS近 30 天下载 6068

===================== =========================================================================================================================================================================================================================================.

中文使用文档
文档目录18 节
  1. Когда
  2. Анатомия
  3. 状态( 默认) default (中文(简体) )
  4. 宽( 默认) false (中文(简体) )
  5. 行动变式
  6. 槽数
  7. Установка
  8. Примеры
  9. &% 分区控制
  10. 宽桌面 {}
  11. 正在装入
  12. 错误 {}
  13. 道具
  14. Смотри
  15. Адаптивность
  16. 移动布局
  17. {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF…
  18. Платформенные

部件

@cloud-ru/ds-uikit-product-widget -=YTET -伊甸园字幕组=- 翻译:.

Widget - контейнер продуктовой: TitleClickable в,опциональный也 SegmentControl、 слот 、 массив Button, kebab/drop list) * * 体 * * * * default 编号 : loading 编号 : error。 。 。 .

Когда

  • {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}=======================================================================================================================================================================================================================================.
  • {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢 InfoBlock {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}你觉得呢.
  • +++++:主页 ++ (宽桌面),相接的 ++ kebab, ++ 版式 – ++ 页脚.

Когда не нужен Widget数字 :

  • {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢

    • используйте @cloud-ru/ds-block или @cloud-ru/ds-card。 。 。 .
  • 说吧

    • используйте TitleClickable。 。 。 .
  • {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢

    • (原始内容存档于2017-10-12). qq数据-qq, qq qq qq qq qq qq.
  • ✅ errorState.onClickUpdate и и state обратно в default 重试.

  • ❌ state='error' {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}请说 InfoBlock {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}你觉得呢.

  • {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢 wide, 初级 \ \ \ \.

  • {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}好吧 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}好吧 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}好吧 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得怎么样 wide принудительно.

  • * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * ** ** ** ** ** ** * PortalContextProvider说吧 说吧.

  • -=YTET -伊甸园字幕组=- 翻译: client:visible- островок изолирован.

  • {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢 hidden: true{\fn黑体\fs20\shad2\2ah82\3ah20\4ah33\fscx95\3ch592001\be1}你觉得怎么样.

  • =================================================================================================================================================================================== actions \ \ \ \ \ \ children - 。 。 。 。 .

Анатомия

状态( 默认) default(中文(简体) )

Состояние WIDGET_STATE数字 :

  • default . . . . . children {\fn华文楷体\fs16\1che0e0e0}身体停止.
  • loading - 骨架 \; 身体 - loadingState.loadingContent {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}骨架 {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}你觉得呢 loadingState.showSkeleton。 。 。 .
  • error —— 说 InfoBlock с errorState и и onClickUpdate页:1 actions {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}请重新尝试一下 {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}.

宽( 默认) false(中文(简体) )

  • false ——遗产布局:外出-==================================================================================== error) (中文(简体) ).
  • true - 初级的 \ kebab \ \ \ \ \ \ \ \ \ SegmentControl 编号 : actionsChildren。 。 。 .

行动变式

Элемент actions[i] 受歧视的工会 variant (默认——已填充) Button:

  • filled 编号 : outline 编号 : tonal 编号 : function 编号 : simple . . . . . @cloud-ru/ds-button + tooltip。 。 。 .
  • kebab —— 说 ButtonKebab + 键 list.items (группы.
  • droplist - ++++++++++++++.

{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢 Droplist из @cloud-ru/ds-list: \ 手机\ \ \ \ \ \ \ \ \ \ \ \ BottomSheet, 桌面 —— popover' 。 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢 AdaptiveProvider。 。 。 .

校对:Soup hidden, (中文(简体) ), tooltip. Для: closeDroplistOnItemClick控件 open 编号 : onOpenChange。 。 。 .

槽数

  • header . . . . . TitleClickable数字 : title, (中文(简体) ), href, (中文(简体) ), icon, (中文(简体) ), avatar, (中文(简体) ), onClick,, , , , , , , ,
  • children {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}身体吗.
  • segmentControl . . . . . SegmentControl \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ width: full (原始内容存档于2017-09-29). qq桌面.
  • actionsChildren . . . . . . . . . .
  • loadingState 编号 : errorState - 。 。 。 。 .

Установка

pnpm add @cloud-ru/ds-uikit-product-widget
import { Widget, BUTTON_TYPE, WIDGET_STATE } from '@cloud-ru/ds-uikit-product-widget'

Примеры

&% 分区控制

未控制 QQ 默认值

import { WIDTH } from '@cloud-ru/ds-segment-control';
import { Widget } from '@cloud-ru/ds-uikit-product-widget';

export function DefaultContent() {
  return (
    <Widget
      header={{ title: 'Cloud servers', href: '#' }}
      segmentControl={{
        width: WIDTH.Full,
        defaultValue: 'overview',
        items: [
          { value: 'overview', label: 'Overview' },
          { value: 'events', label: 'Events' },
        ],
      }}
    >
      Keep product metrics, shortcuts, and status details in one compact card.
    </Widget>
  );
}

宽桌面 {}

初等 QQ , 超额 kebab ; 门户网站 Context 提供 QQ 下拉

import { WIDTH } from '@cloud-ru/ds-segment-control';
import { BUTTON_TYPE, Widget } from '@cloud-ru/ds-uikit-product-widget';
import { useState } from 'react';

export function WithActions() {
  const [lastAction, setLastAction] = useState<string | null>(null);

  return (
    <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>
      <Widget
        wide
        header={{ title: 'Managed databases', href: '#' }}
        segmentControl={{
          width: WIDTH.Auto,
          defaultValue: 'overview',
          items: [
            { value: 'overview', label: 'Overview' },
            { value: 'events', label: 'Events' },
          ],
        }}
        actions={[
          { label: 'Create', onClick: () => setLastAction('Create') },
          {
            variant: BUTTON_TYPE.Outline,
            label: 'Settings',
            onClick: () => setLastAction('Settings'),
          },
          {
            variant: BUTTON_TYPE.Kebab,
            list: {
              items: [
                { content: { label: 'Export' }, onClick: () => setLastAction('Export') },
                { content: { label: 'Archive' }, onClick: () => setLastAction('Archive') },
              ],
            },
          },
        ]}
      >
        Actions are shown in the header for wide desktop widgets.
      </Widget>
      {lastAction ? <span>Last action: {lastAction}</span> : null}
    </div>
  );
}

正在装入

import { Widget } from '@cloud-ru/ds-uikit-product-widget';

export function LoadingState() {
  return (
    <Widget
      header={{ title: 'Billing', href: '#' }}
      state='loading'
      loadingState={{ showSkeleton: true }}
      actions={[{ label: 'Refresh' }]}
    >
      Billing summary
    </Widget>
  );
}

错误 {}

在点击 Update 时, 状态 {}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \

import { Widget } from '@cloud-ru/ds-uikit-product-widget';
import { useState } from 'react';

export function ErrorState() {
  const [state, setState] = useState<'default' | 'error'>('error');

  return (
    <Widget
      header={{ title: 'Monitoring', href: '#' }}
      state={state}
      errorState={{
        errorTitle: 'Metrics are unavailable',
        errorDescription: 'Try reloading the widget.',
        updateButtonLabel: 'Reload',
        onClickUpdate: () => setState('default'),
      }}
    >
      {state === 'error' ? 'Metrics' : 'Metrics loaded successfully.'}
    </Widget>
  );
}

道具

部件方案

Prop类型默认说明
actionsAction | BaseAction | ButtonDroplistProps | ButtonKebabProps—— 说{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢.
actionsChildrenReactNode—— 说{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢.
childrenReactNode—— 说Контент.
classNamestring—— 说(原始内容存档于2018-09-29). CSS-класс.
data-test-idstring—— 说
errorStateWidgetErrorStateProps—— 说错误.
headerWidgetHeaderProps—— 说Пропсы.
loadingStateWidgetLoadingStateProps—— 说装入 装入.
segmentControlSegmentControlProps—— 说QQ 分节控制 QQ .
state"default" | "error" | "loading"—— 说Состояние.
wideboolean—— 说[永久失效連結] 腾讯网. 手机 手机 手机wide && !isMobile) (中文(简体) ).
  • Action =: ButtonAction | OutlineAction | TonalAction | FunctionAction | SimpleAction | KebabAction | DroplistAction

基础行动

Prop类型默认说明
hiddenboolean | undefined—— 说Скрыть.
tooltipTooltipProps—— 说{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}Tolotip...

按键Droplist 程序

Prop类型默认说明
buttonButtonProps—— 说
listWidgetActionListProps—— 说

按钮Kebab 可能性

Prop类型默认说明
buttonButtonProps—— 说
listWidgetActionListProps—— 说

部件动作列表

Prop类型默认说明
classNamestring | undefined—— 说
closeDroplistOnItemClickboolean | undefined—— 说
itemsWidgetActionListEntry | WidgetActionListGroup | WidgetActionListItem—— 说
onOpenChange((open: boolean) => void) | undefined—— 说
openboolean | undefined—— 说

部件错误状态Props

Prop类型默认说明
errorDescriptionstring | undefined—— 说Описание.
errorIconIconPredefinedProps—— 说QQ InfoBlock. (原始内容存档于2018-09-29).
errorTitlestring | undefined—— 说Заголовок.
onClickUpdate(event: MouseEvent<HTMLElement, MouseEvent>) => void—— 说{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢.
updateButtonLabelstring | undefined—— 说Текст.

部件页眉Props

Prop类型默认说明
childrenstring | number | boolean | ReactElement<any, string | JSXElementConstructor<any>> | Iterable<ReactNode> | ReactPortal | null | undefined—— 说
classNamestring | undefined—— 说CSS - класс.
data-test-idstring | undefined—— 说
hrefstring—— 说
iconstring | number | boolean | ReactElement<any, string | JSXElementConstructor<any>> | Iterable<ReactNode> | ReactPortal | null | undefined—— 说(原始内容存档于2019-10-12). QQ, 24×24.
titlestring—— 说Текст.
titleTagElementType | undefined—— 说Семантический.

部件连接状态

Prop类型默认说明
loadingContentstring | number | boolean | ReactElement<any, string | JSXElementConstructor<any>> | Iterable<ReactNode> | ReactPortal | null | undefined—— 说{\fn华文仿宋\fs16\1cHD1D1D1}好.
showSkeletonboolean | undefined—— 说{\fn黑体\fs20\shad2\2aH82\3aH20\4aH33\fscx95\3cH592001\be1}骨架 {\fn黑体\fs20\shad2\2aH82\3aH20\4aH33\fscx95\3cH592001\be1}骨架...
  • WidgetState =: "default" | "error" | "loading"

Смотри

  • TitleClickable {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}你觉得呢.
  • SegmentControl {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}你觉得呢.
  • InfoBlock блок ошибки state='error'。 。 。 .

Адаптивность

Widget -=YTET -伊甸园字幕组=- 翻译: {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢 AdaptiveProvider 页:1 @cloud-ru/ds-adaptiveAPI :

  • 桌面 (по wide {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}你觉得呢.
  • 移动 —— режим: wide {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}请说出什么来.

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ************************ <AdaptiveProvider> [永久失效連結] (中文(简体) ). Пропа layoutType у:источник也.

移动布局

宽 qq, 主页脚

import { AdaptiveProvider, LAYOUT_TYPE } from '@cloud-ru/ds-adaptive';
import { BUTTON_TYPE, Widget } from '@cloud-ru/ds-uikit-product-widget';
import { useState } from 'react';

export function MobileLayout() {
  const [lastAction, setLastAction] = useState<string | null>(null);

  return (
    <AdaptiveProvider layoutType={LAYOUT_TYPE.Mobile}>
      <div style={{ maxWidth: 360, display: 'flex', flexDirection: 'column', gap: 8 }}>
        <Widget
          wide
          header={{ title: 'Object storage', href: '#' }}
          actions={[
            { label: 'Upload', onClick: () => setLastAction('Upload') },
            {
              variant: BUTTON_TYPE.Kebab,
              list: {
                items: [
                  {
                    content: { label: 'Delete bucket' },
                    onClick: () => setLastAction('Delete bucket'),
                  },
                ],
              },
            },
          ]}
        >
          On mobile, wide is ignored: primary actions move to the footer, overflow goes to kebab.
        </Widget>
        {lastAction ? <span>Last action: {lastAction}</span> : null}
      </div>
    </AdaptiveProvider>
  );
}

{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢

- Форс,не:

  • Поддерево:
    import { AdaptiveProvider } from '@cloud-ru/ds-adaptive'
    
    <AdaptiveProvider layoutType='mobile'>
      <Widget header={header} actions={actions}>{content}</Widget>
    </AdaptiveProvider>
    
  • – Отдельный – withLayoutType (模块-镜, сахар:
    import { withLayoutType } from '@cloud-ru/ds-adaptive'
    import { Widget } from '@cloud-ru/ds-uikit-product-widget'
    
    const MobileWidget = withLayoutType(Widget, 'mobile')
    

Платформенные

{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢 WidgetProps。 。 。 .

Проп桌面移动
wideиспользуетсяигнорируется (принудительно)

Подробнее модели- Адаптивность-паттерн。 。 。 .

版本与发布记录

@cloud-ru/ds-uikit-product-widget 共发布 179 个版本,首次发布于 2026/08/18;过去 12 个月发布了 179 个版本。

版本发布日期距今
2.1.0latest2026/11/11今天
2.0.8-preview-e8fe6b56.0preview2026/11/11今天
2.0.8-preview-c0e895ed.02026/11/11今天
2.0.8-preview-90b10112.02026/11/11今天
2.0.8-preview-fd7dd437.02026/11/101 天前
2.0.8-preview-9a75a2a9.02026/11/101 天前

关于 @cloud-ru/ds-uikit-product-widget 的常见问题

@cloud-ru/ds-uikit-product-widget 是什么?

===================== =========================================================================================================================================================================================================================================.

如何安装 @cloud-ru/ds-uikit-product-widget?

在项目目录运行 npm install @cloud-ru/ds-uikit-product-widget,或使用 pnpm add / yarn add / bun add。

@cloud-ru/ds-uikit-product-widget 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@cloud-ru/ds-uikit-product-widget 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@cloud-ru/ds-uikit-product-widget 可以商用吗?

@cloud-ru/ds-uikit-product-widget 使用 Apache-2.0 许可。宽松许可:允许商业使用、修改和再分发,并附带明确的专利授权;分发时需保留许可与 NOTICE 文件,修改过的文件要注明改动。以上为概括,不构成法律意见,请以许可原文为准。

@cloud-ru/ds-uikit-product-widget 的下载量有多少?

根据 npm 官方下载统计,@cloud-ru/ds-uikit-product-widget 在 2026/10/10 – 2026/11/08 这 30 天内被下载 6,068 次,日均约 202 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@cloud-ru/ds-uikit-product-widget 还在维护吗?

最新版本 2.1.0 发布于 2026/11/11(今天);至今共发布 179 个版本,其中过去 12 个月发布了 179 个;首次发布于 2026/08/18。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。