构建弹性布局组件 FlexBox(统一对齐 + 排版 + 响应式辅助) HarmonyOS 5.0.0 或以上


✅ 背景说明

在企业级 UI 开发中,页面中大量使用“横向排列 / 两列布局 / 顶部对齐 / 居中显示”等弹性布局模式。

虽然 ArkTS 提供了 RowColumnFlex 等原子组件,但每次都要重复配置对齐方式、间距、间距写法不统一,极易导致:

  • 样式零散,不可维护

  • 多人协作布局风格混乱

  • 写法繁琐、排版对齐问题多

因此,本篇我们封装一个 FlexBox 弹性布局组件,用于规范化横向 / 纵向 / 居中 / 对齐 / 间距等常见模式,提升开发效率与 UI 一致性。


🧱 一、组件目标功能

  • 支持方向配置(横 / 纵)

  • 支持对齐方式(水平、垂直)

  • 支持自动换行

  • 支持间距(gap)统一设置

  • 可快速用于居中、两端对齐、响应式分组等


📦 二、组件结构定义

@Component
struct FlexBox {
  @Prop direction: 'row' | 'column' = 'row';
  @Prop justify: 'start' | 'center' | 'end' | 'between' | 'around' = 'start';
  @Prop align: 'start' | 'center' | 'end' | 'stretch' = 'center';
  @Prop wrap: boolean = false;
  @Prop gap: number = 10;
  @Slot content?: () => void;
}

🧩 三、对齐参数转换逻辑

private mapJustify(val: string): FlexAlign {
  switch (val) {
    case 'start': return FlexAlign.Start;
    case 'center': return FlexAlign.Center;
    case 'end': return FlexAlign.End;
    case 'between': return FlexAlign.SpaceBetween;
    case 'around': return FlexAlign.SpaceAround;
    default: return FlexAlign.Start;
  }
}

private mapAlign(val: string): HorizontalAlign {
  switch (val) {
    case 'start': return HorizontalAlign.Start;
    case 'center': return HorizontalAlign.Center;
    case 'end': return HorizontalAlign.End;
    case 'stretch': return HorizontalAlign.Stretch;
    default: return HorizontalAlign.Center;
  }
}

🧩 四、组件渲染结构

build() {
  const base = this.direction === 'row'
    ? Row({ space: this.gap })
    : Column({ space: this.gap });

  base
    .alignItems(this.mapAlign(this.align))
    .justifyContent(this.mapJustify(this.justify))
    .wrap(this.wrap ? Wrap.Wrap : Wrap.NoWrap);

  if (this.content) this.content!();
}

🧪 五、父组件使用示例

✅ 居中横向布局
FlexBox({ justify: 'center', align: 'center', gap: 12 }) {
  Button('确定')
  Button('取消')
}
✅ 垂直排列 + 居中对齐
FlexBox({ direction: 'column', align: 'center', gap: 8 }) {
  Text('登录账号')
  TextInput({ placeholder: '请输入' })
}
✅ 两端对齐带间距
FlexBox({ justify: 'between', align: 'center', gap: 6 }) {
  Text('左侧')
  Text('右侧')
}

⚠️ 六、常见问题与建议

问题原因建议
对齐不生效alignRow/Column 不匹配水平方向用 justify,垂直方向用 align
间距不统一未使用 gap 或写死 padding使用统一传参 gap=8/10/16
无法换行默认 wrap: false设置 wrap: true 支持内容溢出自动折行

🚀 七、拓展建议

  • 添加 flex 控制项(每个子项是否自动拉伸)

  • 封装 GridBox 网格版(基于 FlexBox 构建)

  • 添加媒体响应式配置(小屏自动改为纵向)

  • 封装典型布局模板如 FormRow, CardHeader

  • 提供 debug 模式查看边框与间距辅助调试


✅ 小结

本篇封装了一个轻量、高复用的布局组件 FlexBox,统一了页面中横/纵/间距/对齐等逻辑,让企业级项目中的结构布局更标准、更易维护、更适合多人协作开发


下一篇将进入第18篇:

《第18篇:构建可配置按钮组件 SmartButton(多状态 / 禁用 / 图标 / 加载)》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值