【AI解讀源碼系列】ant design mobile——Space間距

前言

筆者目前業務主要圍繞ant design mobile組件庫來交付H5前端工作。

故此出此專欄來解讀每一個組件是如何實現的。

本文基于AI來解讀Space組件。

文檔鏈接:

https://mobile.ant.design/zh/components/space

源碼:

https://github.com/ant-design/ant-design-mobile/blob/master/src/components/space/space.tsx

設計prompt

解讀antd-mobile space組件,結構化思維輸出整個組件實現流程,按步驟提供關鍵代碼解讀 // 附組件代碼

實現步驟

1. 目的

在子元素間插入可定制間距(horizontal / vertical / wrap / align / justify),通過 CSS 變量暴露 gap(–gap、–gap-horizontal、–gap-vertical)。


2. Props(關鍵)

export type SpaceProps = {direction?: 'horizontal' | 'vertical'           // 默認 'horizontal'align?: 'start' | 'end' | 'center' | 'baseline'justify?: 'start' | 'end' | 'center' | 'between' | 'around' | 'evenly' | 'stretch'wrap?: booleanblock?: booleanonClick?: (e: React.MouseEvent<HTMLDivElement>) => voidchildren?: React.ReactNode
} & NativeProps<'--gap' | '--gap-vertical' | '--gap-horizontal'>

默認:

const defaultProps = { direction: 'horizontal' }

3. 渲染邏輯(核心 JSX)

  • 合并默認 props(mergeProps)
  • 使用 withNativeProps 注入原生屬性(style/className/data-*)
  • 每個子節點包裹為 .adm-space-item(過濾 null/undefined)

關鍵代碼:

export const Space: FC<SpaceProps> = p => {const props = mergeProps(defaultProps, p)const { direction, onClick } = propsreturn withNativeProps(props,<divclassName={classNames('adm-space', {'adm-space-wrap': props.wrap,'adm-space-block': props.block,[`adm-space-${direction}`]: true,[`adm-space-align-${props.align}`]: !!props.align,[`adm-space-justify-${props.justify}`]: !!props.justify,})}onClick={onClick}>{React.Children.map(props.children, child =>child === null || child === undefined ? null : (<div className="adm-space-item">{child}</div>))}</div>)
}

簡短工具實現(可參考):

function mergeProps<T>(defaults: Partial<T>, props: T): T {return { ...(defaults as any), ...(props as any) }
}function withNativeProps(props: any, node: React.ReactElement) {const { className, style, ...rest } = propsreturn React.cloneElement(node, {...rest,className: [node.props.className, className].filter(Boolean).join(' '),style: { ...(node.props.style || {}), ...(style || {}) },})
}

4. 樣式核心(要點)

  • 使用 CSS 變量: --gap, --gap-horizontal, --gap-vertical
  • 默認 display: inline-flexblock 時為 display: flex
  • .adm-space-item { flex: none } 保證子項不被拉伸
  • vertical:item 用 margin-bottom,最后一個取消
  • horizontal:item 用 margin-right,容器用負 margin-right 抵消末尾多余空隙
  • wrap:flex-wrap: wrap + 外層負 margin-bottom + item padding-bottom 實現行間距

簡要 CSS:

.adm-space {display: inline-flex;--gap: 8px;--gap-horizontal: var(--gap);--gap-vertical: var(--gap);
}
.adm-space-item { flex: none; }.adm-space-horizontal { flex-direction: row; }
.adm-space-horizontal > .adm-space-item { margin-right: var(--gap-horizontal); }
.adm-space-horizontal:not(:empty) { margin-right: calc(var(--gap-horizontal) * -1); }.adm-space-vertical { flex-direction: column; }
.adm-space-vertical > .adm-space-item { margin-bottom: var(--gap-vertical); }
.adm-space-vertical > .adm-space-item:last-child { margin-bottom: 0; }.adm-space-wrap { flex-wrap: wrap; margin-bottom: calc(var(--gap-vertical) * -1); }
.adm-space-wrap > .adm-space-item { padding-bottom: var(--gap-vertical); }/* align / justify 映射到 align-items / justify-content */

5. 使用示例

<Space><Button>按鈕1</Button><Button>按鈕2</Button>
</Space><Space direction="vertical" style={{ '--gap': '16px' }}><div>行1</div><div>行2</div>
</Space><Space wrap style={{ '--gap-horizontal': '12px', '--gap-vertical': '8px' }}>{items.map(i => <Tag key={i}>{i}</Tag>)}
</Space>

自定義 gap:

<Space style={{ '--gap': '12px' }} />

簡單替代(現代瀏覽器支持 flex gap):

const SimpleSpace = ({children, gap='8px'}) => (<div style={{display:'inline-flex', gap}}>{React.Children.toArray(children).map((c,i)=> <div style={{flex:'none'}} key={i}>{c}</div>)}</div>
)

6. 關鍵設計理由(一句話)

通過包裹子項 + flex: none + margin/padding 組合,利用 CSS 變量暴露 gap,做到間距可控且不影響子元素布局;負 margin 處理容器末尾多余空隙。

以上就是筆者基于AI返回的解讀信息稍加了一些補充和修改,結合起來看源碼提效真是太多了,對于前端本身就是基于視圖所完成編碼,因此把組件邏輯層交給AI來解讀太適合不過了。

希望對大家有所幫助,共同學習源碼。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/94507.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/94507.shtml
英文地址,請注明出處:http://en.pswp.cn/web/94507.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《用餐》,午餐食堂即景小詩分享(手機/小視頻/光盤/養生)

大媽食堂碎碎念&#xff0c;怪罪手機延工期。 筆記模板由python腳本于2025-08-21 19:34:46創建&#xff0c;本篇筆記適合喜歡友善生活和詩的coder翻閱。 學習的細節是歡悅的歷程 博客的核心價值&#xff1a;在于輸出思考與經驗&#xff0c;而不僅僅是知識的簡單復述。 Python官…

高通平臺WIFI學習-- 基于WCN6750 Tri-Band 2x2 MIMO 802.11ax的講解

一 前言: 官方資料顯示WLAN支持如下的Key features ■ Compliant with IEEE 802.11a/b/g/n/ac/ax ■ Supports 2x2 multi-user multiple-input multiple-output (MU-MIMO) ■ Up to 2.9 Gbps data rate (2x2 160 MHz) ■ Tri-band 2.4 GHz/5 GHz/6 GHz support ■ 20 MHz…

javaweb開發筆記——XML_Tomcat10_HTTP

第四章 XML_Tomcat10_HTTP 一 XML XML是EXtensible Markup Language的縮寫&#xff0c;翻譯過來就是可擴展標記語言。所以很明顯&#xff0c;XML和HTML一樣都是標記語言&#xff0c;也就是說它們的基本語法都是標簽。 可擴展 三個字表面上的意思是XML允許自定義格式。但這不代…

Python從入門到自動化運維

文章目錄IPO編程方式、print、input函數print() -- 輸出信息到屏幕input() -- 讀取用戶的輸入基本數據類型int、float、bool、str常用 str 操作方法格式化字符串的三種方式數據驗證方法字符串拼接字符串去重數據類型轉換函數容器類型列表(list)&#xff1a;可變、可重復、有序元…

【數據可視化-98】2025年上半年地方財政收入Top 20城市可視化分析:Python + Pyecharts打造炫酷暗黑主題大屏

&#x1f9d1; 博主簡介&#xff1a;曾任某智慧城市類企業算法總監&#xff0c;目前在美國市場的物流公司從事高級算法工程師一職&#xff0c;深耕人工智能領域&#xff0c;精通python數據挖掘、可視化、機器學習等&#xff0c;發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN…

【基礎-單選】向服務器提交表單數據,以下哪種請求方式比較合適

向服務器提交表單數據&#xff0c;以下哪種請求方式比較合適A.RequestMethod.GET B.RequestMethod.PUT C.RequestMethod.POST D.RequestMethod.DELETE 解釋如下&#xff1a; 在HarmonyOS應用開發中&#xff0c;向服務器提交表單數據&#xff0c;C. RequestMethod.POST 是比較合…

論文閱讀:Code as Policies: Language Model Programs for Embodied Control

地址&#xff1a;Code as Policies: Language Model Programs for Embodied Control 摘要 針對代碼補全任務訓練的大型語言模型&#xff08;LLMs&#xff09;已被證實能夠從文檔字符串&#xff08;docstrings&#xff09;中合成簡單的 Python 程序。研究發現&#xff0c;這些…

Vue 3 customRef 完全指南:自定義響應式引用的終極教程

&#x1f4d6; 概述 customRef() 是 Vue 3 中用于創建自定義響應式引用的組合式 API。它允許開發者完全控制響應式數據的讀取和寫入行為&#xff0c;為復雜的響應式邏輯提供了強大的靈活性。 &#x1f3af; 基本概念 什么是 customRef&#xff1f; customRef() 是一個工廠函數…

Java項目-蒼穹外賣_Day1

項目來源&#xff1a; 【黑馬程序員 Java項目實戰《蒼穹外賣》】 [https://www.bilibili.com/video/BV1TP411v7v6] ZZHow(ZZHow1024) 軟件開發整體介紹 軟件開發流程 需求分析&#xff1a;需求規格說明書、產品原型。設計&#xff1a;UI 設計、數據庫設計、接口設計。編碼…

面試可能問到的問題思考-MySQL

MySQL 1. 數據庫與緩存的一致性 引入緩存&#xff0c;因為緩存只是數據庫數據的副本&#xff0c;那么就可能存在副本和原數據不一致的情況 一致性 ACID里面的C&#xff0c;和CAP中的C不是一個概念&#xff0c;雖然都叫一致性。CAP中的C&#xff0c;指的是多個副本之間邏輯上…

【Java】 Spring Security 賦能 OAuth 2.0:構建安全高效的現代認證體系

還在為高昂的AI開發成本發愁?這本書教你如何在個人電腦上引爆DeepSeek的澎湃算力! 在當今數字化時代,認證與授權已成為應用系統安全的核心。OAuth 2.0 作為一種開放標準協議,廣泛應用于第三方授權場景中,而 Spring Security 則提供了強大的框架支持來實現這一協議。本文深…

實際工作幾月后常用相關命令筆記記錄

目前&#xff0c;我這只工程師幼崽經歷幾個月的工作&#xff0c;不能說是收獲很多&#xff0c;也算是成長經驗1吧。主要工作后才知道好多東西都是自己不會的不了解的&#xff0c;但是工作需要不一定自己完全吃透&#xff0c;在合適的地方正確的使用一般情況就ok了&#xff0c;所…

突破傳統文本切片的瓶頸:AntSK-FileChunk語義切片技術詳解前言:為什么我們需要重新思考文本切片?

在當今大語言模型&#xff08;LLM&#xff09;應用蓬勃發展的時代&#xff0c;我們面臨著一個看似簡單卻至關重要的問題&#xff1a;如何有效地處理長文本&#xff1f;無論是構建知識庫、實現RAG&#xff08;檢索增強生成&#xff09;系統&#xff0c;還是進行文檔智能分析&…

LeetCode-542. 01 矩陣

1、題目描述給定一個由 0 和 1 組成的矩陣 mat &#xff0c;請輸出一個大小相同的矩陣&#xff0c;其中每一個格子是 mat 中對應位置元素到最近的 0 的距離。兩個相鄰元素間的距離為 1 。示例 1&#xff1a;輸入&#xff1a;mat [[0,0,0],[0,1,0],[0,0,0]] 輸出&#xff1a;[[…

Elasticsearch如何確保數據一致性?

Elasticsearch 通過多種機制確保數據在分布式環境中的一致性&#xff0c;但由于其分布式和近實時&#xff08;Near Real-Time, NRT&#xff09;的特性&#xff0c;它提供的是最終一致性&#xff08;Eventual Consistency&#xff09;&#xff0c;而非強一致性。以下是核心機制和…

2026畢設選題-大數據-基于 Spring Boot的化妝品推薦系統的設計與實現

技術范圍&#xff1a;大數據、物聯網、SpringBoot、Vue、SSM、HLMT、小程序、PHP、Nodejs、Python、爬蟲、數據可視化、安卓App、機器學習等設計與開發。 主要內容&#xff1a;功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論文降重、長…

數據結構算法:順序表

數據結構&#xff1a;順序表一.寄包柜1.題目如何創建數組&#xff1f;1. 需求本質2. 傳統靜態數組的缺陷3. 動態方案&#xff1a;向量的數組4. 核心邏輯5. 關鍵優勢總結2.解題思路2.1題目分析2.2具體解題邏輯拆解步驟2.3總結2.4參考代碼二.移動零1.題目2.解題思路2.1**解題核心…

IIS 安裝了.netcore運行時 還是報錯 HTTP 錯誤 500.19

IIS 安裝了.netcore運行時 還是報錯 HTTP 錯誤 500.19 - Internal Server Error 錯誤代碼 0x8007000d 我甚至是先安裝的SDK&#xff0c;再安裝的運行時runtime的安裝包&#xff0c;都不行。 而且在IIS的模塊中&#xff0c;找不到 AspNetCoreModuleV2。 最后在微軟官網n…

Flink 滑動窗口實戰:從 KeyedProcessFunction 到 AggregateFunction WindowFunction 的完整旅程

一、業務背景 我們要在 Flink 實時流上統計 每個用戶-品牌組合最近 1 小時的最晚行為時間&#xff0c;并且每 5 分鐘更新一次結果。 數據來自 Kafka&#xff0c;事件類型為 CartEvent&#xff1a; public class CartEvent {public String userId;public String brandId;public …

Kubernetes“城市規劃”指南:告別資源擁堵與預算超支,打造高效云原生都市

導讀&#xff1a; 如果把你的Kubernetes集群想象成一座拔地而起的現代化大都市&#xff0c;那么你&#xff0c;平臺工程師&#xff0c;就是這座城市的首席規劃師。然而&#xff0c;為何我們精心打造的許多“云原生都市”正迅速陷入交通擁堵、資源閑置和預算超支的困境&#xff…