| | |
| | | return 2 |
| | | } |
| | | |
| | | function countSlotNodes(nodes: any[]): number { |
| | | return nodes.reduce((count, node) => { |
| | | /** |
| | | * 解析单个网格项占据的列数(span),默认 1。 |
| | | * 兼容 span 为数字或纯数字字符串的写法;其余(如响应式字符串)回退为 1。 |
| | | */ |
| | | function resolveSpan(node: any): number { |
| | | const raw = node?.props?.span |
| | | if (typeof raw === 'number') |
| | | return Number.isFinite(raw) && raw > 0 ? raw : 1 |
| | | if (typeof raw === 'string' && /^\d+$/.test(raw.trim())) |
| | | return Math.max(Number(raw), 1) |
| | | return 1 |
| | | } |
| | | |
| | | /** |
| | | * 统计插槽节点占据的「总列数」(累加各节点 span), |
| | | * 而非节点个数 —— 否则跨列项(span>1)会导致折叠行数计算偏小, |
| | | * 出现内容被折叠却不显示「展开」按钮的问题。 |
| | | */ |
| | | function countSlotSpans(nodes: any[]): number { |
| | | return nodes.reduce((sum, node) => { |
| | | if (!node) |
| | | return count |
| | | return sum |
| | | if (Array.isArray(node)) |
| | | return count + countSlotNodes(node) |
| | | return sum + countSlotSpans(node) |
| | | if (node.type === Comment) |
| | | return count |
| | | return sum |
| | | if (node.type === Fragment) |
| | | return count + countSlotNodes(node.children || []) |
| | | return count + 1 |
| | | return sum + countSlotSpans(node.children || []) |
| | | return sum + resolveSpan(node) |
| | | }, 0) |
| | | } |
| | | |
| | | const gridItemCount = computed(() => { |
| | | const defaultSlotCount = countSlotNodes(slots.default?.() || []) |
| | | // 操作区固定占据一个 suffix 项,需要纳入折叠行数计算 |
| | | return defaultSlotCount + 1 |
| | | const defaultSlotSpans = countSlotSpans(slots.default?.() || []) |
| | | // 操作区固定占据一个 suffix 项(span=1),需要纳入折叠行数计算 |
| | | return defaultSlotSpans + 1 |
| | | }) |
| | | |
| | | function updateToggleVisible() { |