手写antd的Row组件和Col组件

背景

为什么要自己手写antd的Row组件和Col组件呢?

很简单,就是因为设计稿要求表单内一行五个FormItem,并且这几个FormItem随着屏幕尺寸自适应。但是antd的栅格化系统是按照24等分来的,最关键的是antd中的Col组件的span不支持小数,而需求的一行5个,24/5 = 4.8,是不支持的,所以只能自己手写了

实现这个需求实际上有两个方式

  • 不封装纯css实现
  • 封装组件

这里主要表现的是第二种封装组件的形式

实现思路

手写MyRowMyCol

MyRow组件接收gutterchildren作为props。gutter用于定义列与列之间的间隔,children则是要渲染在行内的内容。

MyCol组件接收decimalSpan, children, gutter, flex, style, 和 className作为props:

  • decimalSpan是一个可选的数字,表示占用的网格列数的百分比(相对于24列的总宽度)。如果提供,它将计算为占总宽度的百分比,并用于设置列的宽度。
  • gutter定义了列之间的间隔。
  • flex是一个可选的属性,用于设置列的弹性布局。如果是数字,将会被转换成百分比形式的flex值;如果是字符串,则直接使用。
  • style是一个可选的CSS属性对象,可以覆盖或添加自定义样式。
  • className是一个可选的字符串,用于应用CSS类。

实现方式

MyRow只是简单地将props传递给Ant Design的Row组件。

MyCol则更加复杂一些,它首先计算spanWidth的值,如果decimalSpan被提供,spanWidth将是列宽度的百分比;否则,它是0。然后,如果flex被提供,会创建一个flexStyle对象,其中包含适当的flex属性。这些样式(包括从style prop传入的任何附加样式)都会被应用到一个div元素上,而不是Ant Design的Col

下面就是整个组件的代码,ts+hook

typescript 复制代码
import { Row } from 'antd';
import React from 'react';
import type { Gutter } from 'antd/es/grid/row';

export const MyRow = ({
  gutter,
  children,
}: {
  gutter: Gutter | [Gutter, Gutter];
  children: React.ReactNode;
}) => <Row gutter={gutter}>{children}</Row>;

export const MyCol = ({
  decimalSpan,
  children,
  gutter,
  flex,
  style ={},
  className,
}: {
  decimalSpan?: number;
  children: React.ReactNode;
  gutter: number
  flex?: number | string;
  style?:React.CSSProperties
  className?:string
}) => {

    // 如果提供了span属性,计算宽度的百分比
    const spanWidth = decimalSpan ? `${(decimalSpan / 24) * 100}%` : 0;

    // 如果提供了flex属性,根据flex值设置弹性布局
    const flexStyle = flex ? { flex: typeof flex === 'number' ? `0 0 ${flex}%` : flex } : {};
  
    const colStyle = {
      paddingLeft: gutter / 2,
      paddingRight: gutter / 2,
      width: spanWidth, // 如果flex属性存在,spanWidth将会被flex样式覆盖
      ...flexStyle,
      ...style,
    };
  return <div className={className} style={colStyle}>{children}</div>;
};
相关推荐
twins352031 分钟前
解决Vue应用中遇到路由刷新后出现 404 错误
前端·javascript·vue.js
qiyi.sky1 小时前
JavaWeb——Vue组件库Element(3/6):常见组件:Dialog对话框、Form表单(介绍、使用、实际效果)
前端·javascript·vue.js
煸橙干儿~~1 小时前
分析JS Crash(进程崩溃)
java·前端·javascript
安冬的码畜日常1 小时前
【D3.js in Action 3 精译_027】3.4 让 D3 数据适应屏幕(下)—— D3 分段比例尺的用法
前端·javascript·信息可视化·数据可视化·d3.js·d3比例尺·分段比例尺
l1x1n02 小时前
No.3 笔记 | Web安全基础:Web1.0 - 3.0 发展史
前端·http·html
昨天;明天。今天。2 小时前
案例-任务清单
前端·javascript·css
zqx_73 小时前
随记 前端框架React的初步认识
前端·react.js·前端框架
惜.己3 小时前
javaScript基础(8个案例+代码+效果图)
开发语言·前端·javascript·vscode·css3·html5
什么鬼昵称4 小时前
Pikachu-csrf-CSRF(get)
前端·csrf
长天一色4 小时前
【ECMAScript 从入门到进阶教程】第三部分:高级主题(高级函数与范式,元编程,正则表达式,性能优化)
服务器·开发语言·前端·javascript·性能优化·ecmascript