当前位置: 首页 > news >正文

【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.xdnf.cn/news/1364365.html

相关文章:

  • 京东API分类接口实战指南:获取各类商品信息
  • 【大模型本地运行与部署框架】Ollama的API交互
  • Spring拦截器中@Resource注入为null的问题
  • PAT乙级_1120 买地攻略_Python_AC解法_含疑难点
  • 6.3Element UI 的表单
  • 【python断言插件responses_validator使用】
  • 分布式系统与单机系统的优劣势对比
  • Reachability Query
  • Linux系统编程——进程 | 线程
  • 直播美颜SDK技术解析:人脸美型功能的算法原理与实现方案
  • TCP与HTTP协议以及爬虫
  • 如何在Debian服务器上设置Node.js日志轮转
  • cs61a中的递归小例子
  • 创建高效MCP客户端:多服务器环境解决方案指南
  • 决策树原理与 Sklearn 实战
  • Hadoop MapReduce Task 设计源码分析
  • 【C++高并发内存池篇】ThreadCache 极速引擎:C++ 高并发内存池的纳秒级无锁革命!
  • 【目标跟踪】《FastTracker: Real-Time and Accurate Visual Tracking》论文阅读笔记
  • 论文阅读:Code as Policies: Language Model Programs for Embodied Control
  • uniapp中加载.urdf后缀的3D模型(three.js+urdf-loader)
  • 最新刀客IP地址信息查询系统源码_含API接口_首发
  • CAN总线详解(四)CANFD报文结构
  • 引脚电平异常?以下或许是原因
  • 十九、云原生分布式存储 CubeFS
  • dubbo源码之优雅关闭
  • 基于PyTorch深度学习遥感影像地物分类与目标检测、分割及遥感影像问题深度学习优化
  • 使用Docker配置Redis Stack集群的步骤
  • Redis常规指令及跳表
  • 电子之路(一)酒店门锁主板-主板接线图和原理-东方仙盟
  • 8.25学习日志