UNPKG

ultraman-shop

Version:

A React component library for building e-commerce interfaces

400 lines (355 loc) 26.2 kB
import { jsxs, jsx } from 'react/jsx-runtime'; import { useState, useEffect, useCallback, useMemo } from 'react'; import { ConfigProvider, Table, DatePicker, Select, Modal } from 'antd'; import zhCN from 'antd/locale/zh_CN'; const XInput = ({ addonAfter, addonBefore, allowClear, classNames, count, defaultValue, disabled = false, id, maxLength, prefix, showCount, status, styles, size = 'middle', suffix, type = 'text', value: propValue, variant = 'outlined', onChange, onPressEnter, onClear, placeholder, }) => { const [value, setValue] = useState(defaultValue || ''); useEffect(() => { if (propValue !== undefined) { setValue(propValue); } }, [propValue]); // 使用 useCallback 优化事件处理函数 const handleChange = useCallback((e) => { setValue(e.target.value); onChange === null || onChange === void 0 ? void 0 : onChange(e); }, [onChange]); const handleClear = useCallback(() => { setValue(''); onClear === null || onClear === void 0 ? void 0 : onClear(); }, [onClear]); const handleKeyDown = useCallback((e) => { if (e.key === 'Enter') { onPressEnter === null || onPressEnter === void 0 ? void 0 : onPressEnter(e); } }, [onPressEnter]); // 使用 useMemo 优化字符计数渲染 const countDisplay = useMemo(() => { var _a; if (!showCount) return null; const countInfo = { value, count: value.length, maxLength }; return typeof showCount === 'boolean' ? `${value.length}${maxLength ? ` / ${maxLength}` : ''}` : (_a = showCount.formatter) === null || _a === void 0 ? void 0 : _a.call(showCount, countInfo); }, [showCount, value, maxLength]); // 使用 useMemo 优化容器类名 const containerClassName = useMemo(() => { return `input-container ${size} ${variant} ${status || ''} ${disabled ? 'disabled' : ''} ${(classNames === null || classNames === void 0 ? void 0 : classNames.container) || ''}`.trim(); }, [size, variant, status, disabled, classNames === null || classNames === void 0 ? void 0 : classNames.container]); return (jsxs("div", { className: containerClassName, style: styles === null || styles === void 0 ? void 0 : styles.container, children: [addonBefore && jsx("span", { className: "input-addon before", children: addonBefore }), jsxs("div", { className: "input-wrapper", style: styles === null || styles === void 0 ? void 0 : styles.inputWrapper, children: [prefix && jsx("span", { className: "input-prefix", children: prefix }), jsx("input", { id: id, type: type, value: value, disabled: disabled, maxLength: maxLength, onChange: handleChange, onKeyDown: handleKeyDown, placeholder: placeholder, className: `input-field ${(classNames === null || classNames === void 0 ? void 0 : classNames.inputField) || ''}`, style: styles === null || styles === void 0 ? void 0 : styles.inputField }), allowClear && value && (jsx("span", { className: "input-clear", onClick: handleClear, children: typeof allowClear === 'object' ? allowClear.clearIcon : '✖' })), suffix && jsx("span", { className: "input-suffix", children: suffix })] }), addonAfter && jsx("span", { className: "input-addon after", children: addonAfter }), countDisplay && jsx("span", { className: "input-count", children: countDisplay })] })); }; /** 大屏标题组件 */ const XTitle = ({ title, rightSlot, titleEn, moreOnClick, moreAnimateOnClick, bgImage = '/publicImg/cockpit/titleBg.png', className = '', style, noPrefix = false }) => { // 提前获取环境变量,避免每次渲染都访问 const imgPrefix = 'https://tj-front.oss-cn-beijing.aliyuncs.com/publicImg/'; let additionalContent = null; // 判断是否有 moreOnClick,决定要渲染的内容 if (moreOnClick) { additionalContent = (jsx("img", { className: "ultraman-more", onClick: moreOnClick, src: `${imgPrefix}cockpit/checkMore.png`, alt: "" })); } else if (moreAnimateOnClick) { additionalContent = (jsx("span", { className: "ultraman-more-animate", onClick: moreAnimateOnClick, children: jsx("span", { className: "ultraman-btn", children: jsx("a", { href: "#", children: "查看更多 >" }) }) })); } else { additionalContent = rightSlot; } return (jsxs("div", { className: `ultraman-XTitle ${className}`, style: { ...style, backgroundImage: `url(${bgImage})` }, children: [" ", jsx("div", { className: "ultraman-header", children: jsxs("span", { className: "ultraman-title", children: [jsx("img", { src: `${imgPrefix}cockpit/titleL.png`, alt: "" }), jsx("span", { className: "ultraman-title-label", children: title || '我是标题' }), jsxs("span", { className: "ultraman-titleEn-label", children: [" ", titleEn] })] }) }), additionalContent] })); }; function getDefaultExportFromCjs (x) { return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; } var dayjs_min$1 = {exports: {}}; var dayjs_min = dayjs_min$1.exports; var hasRequiredDayjs_min; function requireDayjs_min () { if (hasRequiredDayjs_min) return dayjs_min$1.exports; hasRequiredDayjs_min = 1; (function (module, exports) { !function(t,e){module.exports=e();}(dayjs_min,(function(){var t=1e3,e=6e4,n=36e5,r="millisecond",i="second",s="minute",u="hour",a="day",o="week",c="month",f="quarter",h="year",d="date",l="Invalid Date",$=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,y=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,M={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(t){var e=["th","st","nd","rd"],n=t%100;return "["+t+(e[(n-20)%10]||e[n]||e[0])+"]"}},m=function(t,e,n){var r=String(t);return !r||r.length>=e?t:""+Array(e+1-r.length).join(n)+t},v={s:m,z:function(t){var e=-t.utcOffset(),n=Math.abs(e),r=Math.floor(n/60),i=n%60;return (e<=0?"+":"-")+m(r,2,"0")+":"+m(i,2,"0")},m:function t(e,n){if(e.date()<n.date())return -t(n,e);var r=12*(n.year()-e.year())+(n.month()-e.month()),i=e.clone().add(r,c),s=n-i<0,u=e.clone().add(r+(s?-1:1),c);return +(-(r+(n-i)/(s?i-u:u-i))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(t){return {M:c,y:h,w:o,d:a,D:d,h:u,m:s,s:i,ms:r,Q:f}[t]||String(t||"").toLowerCase().replace(/s$/,"")},u:function(t){return void 0===t}},g="en",D={};D[g]=M;var p="$isDayjsObject",S=function(t){return t instanceof _||!(!t||!t[p])},w=function t(e,n,r){var i;if(!e)return g;if("string"==typeof e){var s=e.toLowerCase();D[s]&&(i=s),n&&(D[s]=n,i=s);var u=e.split("-");if(!i&&u.length>1)return t(u[0])}else {var a=e.name;D[a]=e,i=a;}return !r&&i&&(g=i),i||!r&&g},O=function(t,e){if(S(t))return t.clone();var n="object"==typeof e?e:{};return n.date=t,n.args=arguments,new _(n)},b=v;b.l=w,b.i=S,b.w=function(t,e){return O(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var _=function(){function M(t){this.$L=w(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[p]=!0;}var m=M.prototype;return m.parse=function(t){this.$d=function(t){var e=t.date,n=t.utc;if(null===e)return new Date(NaN);if(b.u(e))return new Date;if(e instanceof Date)return new Date(e);if("string"==typeof e&&!/Z$/i.test(e)){var r=e.match($);if(r){var i=r[2]-1||0,s=(r[7]||"0").substring(0,3);return n?new Date(Date.UTC(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)):new Date(r[1],i,r[3]||1,r[4]||0,r[5]||0,r[6]||0,s)}}return new Date(e)}(t),this.init();},m.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds();},m.$utils=function(){return b},m.isValid=function(){return !(this.$d.toString()===l)},m.isSame=function(t,e){var n=O(t);return this.startOf(e)<=n&&n<=this.endOf(e)},m.isAfter=function(t,e){return O(t)<this.startOf(e)},m.isBefore=function(t,e){return this.endOf(e)<O(t)},m.$g=function(t,e,n){return b.u(t)?this[e]:this.set(n,t)},m.unix=function(){return Math.floor(this.valueOf()/1e3)},m.valueOf=function(){return this.$d.getTime()},m.startOf=function(t,e){var n=this,r=!!b.u(e)||e,f=b.p(t),l=function(t,e){var i=b.w(n.$u?Date.UTC(n.$y,e,t):new Date(n.$y,e,t),n);return r?i:i.endOf(a)},$=function(t,e){return b.w(n.toDate()[t].apply(n.toDate("s"),(r?[0,0,0,0]:[23,59,59,999]).slice(e)),n)},y=this.$W,M=this.$M,m=this.$D,v="set"+(this.$u?"UTC":"");switch(f){case h:return r?l(1,0):l(31,11);case c:return r?l(1,M):l(0,M+1);case o:var g=this.$locale().weekStart||0,D=(y<g?y+7:y)-g;return l(r?m-D:m+(6-D),M);case a:case d:return $(v+"Hours",0);case u:return $(v+"Minutes",1);case s:return $(v+"Seconds",2);case i:return $(v+"Milliseconds",3);default:return this.clone()}},m.endOf=function(t){return this.startOf(t,!1)},m.$set=function(t,e){var n,o=b.p(t),f="set"+(this.$u?"UTC":""),l=(n={},n[a]=f+"Date",n[d]=f+"Date",n[c]=f+"Month",n[h]=f+"FullYear",n[u]=f+"Hours",n[s]=f+"Minutes",n[i]=f+"Seconds",n[r]=f+"Milliseconds",n)[o],$=o===a?this.$D+(e-this.$W):e;if(o===c||o===h){var y=this.clone().set(d,1);y.$d[l]($),y.init(),this.$d=y.set(d,Math.min(this.$D,y.daysInMonth())).$d;}else l&&this.$d[l]($);return this.init(),this},m.set=function(t,e){return this.clone().$set(t,e)},m.get=function(t){return this[b.p(t)]()},m.add=function(r,f){var d,l=this;r=Number(r);var $=b.p(f),y=function(t){var e=O(l);return b.w(e.date(e.date()+Math.round(t*r)),l)};if($===c)return this.set(c,this.$M+r);if($===h)return this.set(h,this.$y+r);if($===a)return y(1);if($===o)return y(7);var M=(d={},d[s]=e,d[u]=n,d[i]=t,d)[$]||1,m=this.$d.getTime()+r*M;return b.w(m,this)},m.subtract=function(t,e){return this.add(-1*t,e)},m.format=function(t){var e=this,n=this.$locale();if(!this.isValid())return n.invalidDate||l;var r=t||"YYYY-MM-DDTHH:mm:ssZ",i=b.z(this),s=this.$H,u=this.$m,a=this.$M,o=n.weekdays,c=n.months,f=n.meridiem,h=function(t,n,i,s){return t&&(t[n]||t(e,r))||i[n].slice(0,s)},d=function(t){return b.s(s%12||12,t,"0")},$=f||function(t,e,n){var r=t<12?"AM":"PM";return n?r.toLowerCase():r};return r.replace(y,(function(t,r){return r||function(t){switch(t){case"YY":return String(e.$y).slice(-2);case"YYYY":return b.s(e.$y,4,"0");case"M":return a+1;case"MM":return b.s(a+1,2,"0");case"MMM":return h(n.monthsShort,a,c,3);case"MMMM":return h(c,a);case"D":return e.$D;case"DD":return b.s(e.$D,2,"0");case"d":return String(e.$W);case"dd":return h(n.weekdaysMin,e.$W,o,2);case"ddd":return h(n.weekdaysShort,e.$W,o,3);case"dddd":return o[e.$W];case"H":return String(s);case"HH":return b.s(s,2,"0");case"h":return d(1);case"hh":return d(2);case"a":return $(s,u,!0);case"A":return $(s,u,!1);case"m":return String(u);case"mm":return b.s(u,2,"0");case"s":return String(e.$s);case"ss":return b.s(e.$s,2,"0");case"SSS":return b.s(e.$ms,3,"0");case"Z":return i}return null}(t)||i.replace(":","")}))},m.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},m.diff=function(r,d,l){var $,y=this,M=b.p(d),m=O(r),v=(m.utcOffset()-this.utcOffset())*e,g=this-m,D=function(){return b.m(y,m)};switch(M){case h:$=D()/12;break;case c:$=D();break;case f:$=D()/3;break;case o:$=(g-v)/6048e5;break;case a:$=(g-v)/864e5;break;case u:$=g/n;break;case s:$=g/e;break;case i:$=g/t;break;default:$=g;}return l?$:b.a($)},m.daysInMonth=function(){return this.endOf(c).$D},m.$locale=function(){return D[this.$L]},m.locale=function(t,e){if(!t)return this.$L;var n=this.clone(),r=w(t,e,!0);return r&&(n.$L=r),n},m.clone=function(){return b.w(this.$d,this)},m.toDate=function(){return new Date(this.valueOf())},m.toJSON=function(){return this.isValid()?this.toISOString():null},m.toISOString=function(){return this.$d.toISOString()},m.toString=function(){return this.$d.toUTCString()},M}(),k=_.prototype;return O.prototype=k,[["$ms",r],["$s",i],["$m",s],["$H",u],["$W",a],["$M",c],["$y",h],["$D",d]].forEach((function(t){k[t[1]]=function(e){return this.$g(e,t[0],t[1])};})),O.extend=function(t,e){return t.$i||(t(e,_,O),t.$i=!0),O},O.locale=w,O.isDayjs=S,O.unix=function(t){return O(1e3*t)},O.en=D[g],O.Ls=D,O.p={},O})); } (dayjs_min$1, dayjs_min$1.exports)); return dayjs_min$1.exports; } var dayjs_minExports = requireDayjs_min(); var dayjs = /*@__PURE__*/getDefaultExportFromCjs(dayjs_minExports); var zhCn$1 = {exports: {}}; var zhCn = zhCn$1.exports; var hasRequiredZhCn; function requireZhCn () { if (hasRequiredZhCn) return zhCn$1.exports; hasRequiredZhCn = 1; (function (module, exports) { !function(e,_){module.exports=_(requireDayjs_min());}(zhCn,(function(e){function _(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=_(e),d={name:"zh-cn",weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),ordinal:function(e,_){return "W"===_?e+"周":e+"日"},weekStart:1,yearStart:4,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日Ah点mm分",LLLL:"YYYY年M月D日ddddAh点mm分",l:"YYYY/M/D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},relativeTime:{future:"%s内",past:"%s前",s:"几秒",m:"1 分钟",mm:"%d 分钟",h:"1 小时",hh:"%d 小时",d:"1 天",dd:"%d 天",M:"1 个月",MM:"%d 个月",y:"1 年",yy:"%d 年"},meridiem:function(e,_){var t=100*e+_;return t<600?"凌晨":t<900?"早上":t<1100?"上午":t<1300?"中午":t<1800?"下午":"晚上"}};return t.default.locale(d,null,!0),d})); } (zhCn$1, zhCn$1.exports)); return zhCn$1.exports; } requireZhCn(); // 设置 dayjs 语言为中文 dayjs.locale('zh-cn'); // 导出中文配置 const zhCNLocale = zhCN; const XConfigProvider = ({ children, locale = zhCNLocale }) => { return (jsx(ConfigProvider, { prefixCls: "ultraman", locale: locale, children: children })); }; var classnames = {exports: {}}; /*! Copyright (c) 2018 Jed Watson. Licensed under the MIT License (MIT), see http://jedwatson.github.io/classnames */ classnames.exports; var hasRequiredClassnames; function requireClassnames () { if (hasRequiredClassnames) return classnames.exports; hasRequiredClassnames = 1; (function (module) { /* global define */ (function () { var hasOwn = {}.hasOwnProperty; function classNames () { var classes = ''; for (var i = 0; i < arguments.length; i++) { var arg = arguments[i]; if (arg) { classes = appendClass(classes, parseValue(arg)); } } return classes; } function parseValue (arg) { if (typeof arg === 'string' || typeof arg === 'number') { return arg; } if (typeof arg !== 'object') { return ''; } if (Array.isArray(arg)) { return classNames.apply(null, arg); } if (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) { return arg.toString(); } var classes = ''; for (var key in arg) { if (hasOwn.call(arg, key) && arg[key]) { classes = appendClass(classes, key); } } return classes; } function appendClass (value, newClass) { if (!newClass) { return value; } if (value) { return value + ' ' + newClass; } return value + newClass; } if (module.exports) { classNames.default = classNames; module.exports = classNames; } else { window.classNames = classNames; } }()); } (classnames)); return classnames.exports; } var classnamesExports = requireClassnames(); var classNames = /*@__PURE__*/getDefaultExportFromCjs(classnamesExports); // 默认配置 const DEFAULT_COLUMNS = [ { title: '名称', dataIndex: 'name', key: 'name', }, { title: '地址', dataIndex: 'address', key: 'address', sorter: (a, b) => a.address.localeCompare(b.address), } ]; const DEFAULT_SORT_PREFIX_CONFIG = { sequence: true, title: '排序', sortPattern: true, usePrefix: true, }; // 获取图片路径的辅助函数 const getImagePath = (path) => { const prefix = 'https://tj-front.oss-cn-beijing.aliyuncs.com/publicImg/'; return `${prefix}${path}`; }; // 图片资源常量 const SORT_IMAGES = { '1': getImagePath('cockpit/sortFirst.png'), '2': getImagePath('cockpit/sortSecond.png'), '3': getImagePath('cockpit/sortThree.png'), }; const EXPAND_IMAGES = { expanded: 'https://tj-front.oss-cn-beijing.aliyuncs.com/publicImg/cockpit/expanded.svg', collapsed: 'https://tj-front.oss-cn-beijing.aliyuncs.com/publicImg/cockpit/collapsed.svg', empty: getImagePath('cockpit/empty.svg'), }; /** * 根据索引获取对应的排序前缀内容 * @param index - 排序前缀的索引 * @param sortPattern - 是否使用排序模式 * @param usePrefix - 是否使用前缀包装 * @returns 排序前缀的图片或索引本身 */ const getSortPrefixContent = (index, sortPattern = true, usePrefix = true) => { if (!sortPattern) { return index; } // 如果对应索引的图片存在,返回包含图片的 JSX 元素,否则返回索引本身 const imageSrc = SORT_IMAGES[index]; return imageSrc ? (jsx("div", { className: classNames({ 'ultraman-sortPrefixWarp': usePrefix, 'ultraman-sortWarp': !usePrefix }), children: jsx("img", { src: imageSrc, alt: `排序 ${index}` }) })) : index; }; /** * 渲染列配置,确保每列都有必要的属性 * @param columns - 列配置数组 * @returns 处理后的列配置数组 */ const renderColumns = (columns) => { return columns.map((item) => ({ dataIndex: item.dataIndex || item.key, ellipsis: true, ...item, })); }; const XTable = ({ rowClassName = () => '', activeKeys = null, rowKey = 'key', columns = DEFAULT_COLUMNS, sortPrefixConfig = DEFAULT_SORT_PREFIX_CONFIG, dataSource = [], onChange, borderColor, expandable, ...props }) => { const extendedDataSource = useMemo(() => { if (!sortPrefixConfig) { return [...dataSource]; } return dataSource.map((record, index) => ({ ...record, sortPrefix: getSortPrefixContent(String(index + 1), sortPrefixConfig === null || sortPrefixConfig === void 0 ? void 0 : sortPrefixConfig.sortPattern, sortPrefixConfig === null || sortPrefixConfig === void 0 ? void 0 : sortPrefixConfig.usePrefix), })); }, [dataSource, sortPrefixConfig]); /** * 扩展 columns,确保 sortPrefix 列不受排序影响 */ const extendedColumns = sortPrefixConfig ? [ { dataIndex: 'sortPrefix', key: 'sortPrefix', width: 80, render: (_, record) => record.sortPrefix || '', ...(sortPrefixConfig || {}) }, ...columns, // 在现有列前面加上 sortPrefix 列 ] : columns; // 如果没有排序前缀配置,直接使用传入的 columns /** * 处理表格的 onChange 事件,合并内部逻辑与外部传入的 onChange */ const handleTableChange = useCallback((pagination, filters, sorter, extra) => { onChange === null || onChange === void 0 ? void 0 : onChange(pagination, filters, sorter, extra); }, [onChange]); /** * 生成行类名 */ const getRowClassName = useCallback((record, index) => { const baseClasses = 'ultraman-rowPrefix'; const activeClass = Array.isArray(activeKeys) ? (activeKeys.includes(record[rowKey]) ? 'ultraman-rowPrefix-active' : '') : (activeKeys && record[rowKey] === activeKeys ? 'ultraman-rowPrefix-active' : ''); const rowColorClass = index % 2 === 0 ? 'table-tr-even-color' : 'table-tr-odd-color'; const customClass = rowClassName(record, index); return `${baseClasses} ${activeClass} ${rowColorClass} ${customClass}`.trim(); }, [activeKeys, rowKey, rowClassName]); /** * 渲染展开图标 */ const renderExpandIcon = useCallback(({ expanded, onExpand, record }) => { const iconSrc = expanded ? EXPAND_IMAGES.expanded : EXPAND_IMAGES.collapsed; return (jsx("img", { src: iconSrc, alt: expanded ? '收起' : '展开', onClick: (e) => onExpand(record, e) })); }, []); return (jsx(XConfigProvider, { children: jsx("div", { className: "ultraman-XTable", style: { '--border-color': borderColor || '#000', width: '100%', position: 'relative', }, children: jsx(Table, { locale: { emptyText: (jsx("div", { className: "ultraman-emptyWarp", children: jsx("img", { src: EXPAND_IMAGES.empty, alt: "\u6682\u65E0\u6570\u636E" }) })) }, rowKey: rowKey, columns: renderColumns(extendedColumns), pagination: false, onChange: handleTableChange, dataSource: extendedDataSource, scroll: { y: 200 }, showSorterTooltip: false, bordered: false, size: "middle", style: { width: '100%' }, expandable: expandable ? { expandIcon: renderExpandIcon, ...expandable, } : undefined, className: "ultraman-table-fixed", rowClassName: getRowClassName, ...props }) }) })); }; // 默认标签项 const DEFAULT_TAB_ITEMS = [ { label: '高', value: '1' }, { label: '标签2', value: '2' }, { label: '标签3', value: '3' }, ]; const XTabs = ({ item = DEFAULT_TAB_ITEMS, onChange, defaultActiveKey = "1", type = 'button', className = '', style = {} }) => { const [activeKey, setActiveKey] = useState(defaultActiveKey); // 使用 useCallback 优化事件处理函数 const handleTabClick = useCallback((value) => { setActiveKey(value); onChange(value); }, [onChange]); // 使用 useMemo 优化当前激活标签的内容查找 const activeTabContent = useMemo(() => { var _a; return (_a = item.find(tab => tab.value === activeKey)) === null || _a === void 0 ? void 0 : _a.children; }, [item, activeKey]); // 使用 useMemo 优化 CSS 类名拼接 const containerClassName = useMemo(() => { return `ultraman-XTabs-${type} ${className}`.trim(); }, [type, className]); return (jsxs("div", { className: containerClassName, style: style, role: "tablist", "aria-label": "\u6807\u7B7E\u9875\u5BFC\u822A", children: [jsx("div", { className: "ultraman-tabs", children: item.map(tab => { const isActive = activeKey === tab.value; return (jsx("span", { className: `ultraman-tab-item ${isActive ? 'active' : ''}`, onClick: () => handleTabClick(tab.value), role: "tab", "aria-selected": isActive, "aria-controls": `tabpanel-${tab.value}`, tabIndex: isActive ? 0 : -1, children: tab.label }, tab.value)); }) }), jsx("div", { className: "ultraman-tab-content", role: "tabpanel", id: `tabpanel-${activeKey}`, "aria-labelledby": `tab-${activeKey}`, children: activeTabContent })] })); }; const XDatePicker = ({ className = 'ultraman-datePicker', style, ...props }) => { return (jsx(XConfigProvider, { children: jsx(DatePicker, { className: className, style: style, ...props }) })); }; // 默认样式配置 const DEFAULT_STYLE$1 = { width: 100 }; const XGraySelect = ({ theme = 'screen', className, style = DEFAULT_STYLE$1, ...props }) => { // 使用 useMemo 优化类名计算 const selectClassName = useMemo(() => { if (className) return className; return theme === 'pc' ? '' : 'ultraman-graySelect'; }, [theme, className]); const popupClassName = useMemo(() => { return theme === 'pc' ? '' : 'ultraman-dateSelectPopup'; }, [theme]); return (jsx(ConfigProvider, { prefixCls: "ultraman", children: jsx(Select, { className: selectClassName, popupClassName: popupClassName, style: style, ...props, children: props.children }) })); }; // 默认样式配置 const DEFAULT_STYLE = { width: 400 }; const XSelect = ({ className = 'ultraman-cockpitSelect', popupClassName = 'ultraman-selectPopup', style = DEFAULT_STYLE, ...props }) => { // 使用 useMemo 优化图片 URL 计算 const imageUrl = useMemo(() => { const imgPrefix = 'https://tj-front.oss-cn-beijing.aliyuncs.com/publicImg/'; return `${imgPrefix}cockpit/empty.svg`; }, []); // 使用 useEffect 设置 CSS 变量 useEffect(() => { document.documentElement.style.setProperty('--img-url', `url(${imageUrl})`); // 清理函数,组件卸载时移除 CSS 变量 return () => { document.documentElement.style.removeProperty('--img-url'); }; }, [imageUrl]); return (jsx(XConfigProvider, { children: jsx(Select, { className: className, popupClassName: popupClassName, style: style, ...props, children: props.children }) })); }; const { RangePicker } = DatePicker; const XRangePicker = ({ className = 'ultraman-rangePicker', style, ...props }) => { return (jsx(ConfigProvider, { prefixCls: "ultraman", children: jsx(RangePicker, { className: className, style: style, ...props }) })); }; const XModal = ({ title, open = true, onClose, onConfirm, confirmText = 'Confirm', cancelText = 'Cancel', children, centered = true, ...modalProps }) => (jsx(ConfigProvider, { prefixCls: "ultraman", children: jsx(Modal, { title: title, open: open, onCancel: onClose, centered: centered, ...modalProps, children: children }) })); export { XConfigProvider, XDatePicker, XGraySelect, XInput, XModal, XRangePicker, XSelect, XTable, XTabs, XTitle };