packages-rc/console-base-rc-pagination/stories/knobs/index.ts (96 lines of code) (raw):

import { useMemo, useEffect } from 'react'; import { number, boolean, optionsKnob } from '@storybook/addon-knobs'; import { PaginationProps } from '../../src'; interface IProps { onChange(props: PaginationProps): void; } function optional<T>({ value, inUse }: { value: T; inUse: boolean; }): T | undefined { return inUse ? value : undefined; } function omitUndefined(o: Record<string, unknown>): PaginationProps { const props: Record<string, unknown> = {}; for (const k in o) { // eslint-disable-next-line no-prototype-builtins if (o.hasOwnProperty(k) && o[k] !== undefined) { props[k] = o[k]; } } return props as PaginationProps; } export default function Knobs({ onChange }: IProps): null { const total = optional<number>({ value: number('props.total', 1234), inUse: boolean('启用 props.total', true) }); const page = optional<number>({ value: number('props.page', 1), inUse: boolean('启用 props.page', false) }); const pageSize = optional<number>({ value: number('props.pageSize', 20), inUse: boolean('启用 props.pageSize', true) }); const totalLimit = optional<number>({ value: number('props.totalLimit', 1000), inUse: boolean('启用 props.totalLimit', false) }); const theme = optional<PaginationProps['theme']>({ value: optionsKnob<PaginationProps['theme']>('props.theme', { full: 'full', simple: 'simple', simplest: 'simplest' }, 'full', { display: 'inline-radio' }), inUse: boolean('启用 props.theme', true) }); const align = optional<PaginationProps['align']>({ value: optionsKnob<PaginationProps['align']>('props.align', { left: 'left', center: 'center', right: 'right' }, 'left', { display: 'inline-radio' }), inUse: boolean('启用 props.align', true) }); const noText = optional<boolean>({ value: boolean('props.noText', true), inUse: boolean('启用 props.noText', false) }); const props: PaginationProps = useMemo((): PaginationProps => omitUndefined({ total, page, pageSize, totalLimit, theme, align, noText }), [ total, page, pageSize, totalLimit, theme, align, noText ]); useEffect(() => onChange(props), [onChange, props]); return null; }