Ant-Design源码分析——Skeleton(一)

2021SC@SDUSC

Element部分

导入需要的模块

import * as React from 'react';
import classNames from 'classnames';

element接口

export interface SkeletonElementProps {
  //  前缀
  prefixCls?: string;
  // 类名
  className?: string;
  // 样式表
  style?: React.CSSProperties;
  // 大小尺寸
  size?: 'large' | 'small' | 'default' | number;
  // 形状:圆圈、方角、圆角
  shape?: 'circle' | 'square' | 'round';
  // 是否显示动画
  active?: boolean;
}
const Element = (props: SkeletonElementProps) => {
  const { prefixCls, className, style, size, shape } = props;

  const sizeCls = classNames({
    // 根据前缀展示尺寸
    [`${prefixCls}-lg`]: size === 'large',
    [`${prefixCls}-sm`]: size === 'small',
  });

  const shapeCls = classNames({
    // 根据前缀展示形状
    [`${prefixCls}-circle`]: shape === 'circle',
    [`${prefixCls}-square`]: shape === 'square',
    [`${prefixCls}-round`]: shape === 'round',
  });

  const sizeStyle: React.CSSProperties =
    // 非默认的尺寸
    typeof size === 'number'
      ? {
          width: size,
          height: size,
          lineHeight: `${size}px`,
        }
      : {};

  return (
    // 返回组件内容
    <span
      className={classNames(prefixCls, sizeCls, shapeCls, className)}
      style={{ ...sizeStyle, ...style }}
    />
  );
};

export default Element;

Avatar部分(表示头像的部分)

import * as React from 'react';
import omit from 'rc-util/lib/omit';
import classNames from 'classnames';
import { ConfigConsumer, ConfigConsumerProps } from '../config-provider';
import Element, { SkeletonElementProps } from './Element';

export interface AvatarProps extends Omit<SkeletonElementProps, 'shape'> {
  // 头像展示是方框还是圆圈
  shape?: 'circle' | 'square';
}
const SkeletonAvatar = (props: AvatarProps) => {
  // avatar 只有是否演示动画
  const renderSkeletonAvatar = ({ getPrefixCls }: ConfigConsumerProps) => {
    const { prefixCls: customizePrefixCls, className, active } = props;
    const prefixCls = getPrefixCls('skeleton', customizePrefixCls);
    const otherProps = omit(props, ['prefixCls', 'className']);
    const cls = classNames(
      prefixCls,
      `${prefixCls}-element`,
      {
        [`${prefixCls}-active`]: active,
      },
      className,
    );
    return (
      // 返回组件
      <div className={cls}>
        <Element prefixCls={`${prefixCls}-avatar`} {...otherProps} />
      </div>
    );
  };
  return <ConfigConsumer>{renderSkeletonAvatar}</ConfigConsumer>;
};

Button部分  骨架框的按钮部分

接口部分

export interface SkeletonButtonProps extends Omit<SkeletonElementProps, 'size'> {
  // 大小
  size?: 'large' | 'small' | 'default';
  // 是否锁定
  block?: boolean;
}
const SkeletonButton = (props: SkeletonButtonProps) => {
  // 根据前缀信息展示是否锁定以及演示动画
  const renderSkeletonButton = ({ getPrefixCls }: ConfigConsumerProps) => {
    const { prefixCls: customizePrefixCls, className, active, block = false } = props;
    const prefixCls = getPrefixCls('skeleton', customizePrefixCls);
    const otherProps = omit(props, ['prefixCls']);
    const cls = classNames(
      prefixCls,
      `${prefixCls}-element`,
      {
        [`${prefixCls}-active`]: active,
        [`${prefixCls}-block`]: block,
      },
      className,
    );
    return (
      // 返回一个组件
      <div className={cls}>
        <Element prefixCls={`${prefixCls}-button`} {...otherProps} />
      </div>
    );
  };
  return <ConfigConsumer>{renderSkeletonButton}</ConfigConsumer>;
};

Input部分同按钮部分类似

export interface SkeletonInputProps extends Omit<SkeletonElementProps, 'size' | 'shape'> {
  size?: 'large' | 'small' | 'default';
}

const SkeletonInput = (props: SkeletonInputProps) => {
  const renderSkeletonInput = ({ getPrefixCls }: ConfigConsumerProps) => {
    const { prefixCls: customizePrefixCls, className, active } = props;
    const prefixCls = getPrefixCls('skeleton', customizePrefixCls);
    const otherProps = omit(props, ['prefixCls']);
    const cls = classNames(
      prefixCls,
      `${prefixCls}-element`,
      {
        [`${prefixCls}-active`]: active,
      },
      className,
    );
    return (
      <div className={cls}>
        <Element prefixCls={`${prefixCls}-input`} {...otherProps} />
      </div>
    );
  };
  return <ConfigConsumer>{renderSkeletonInput}</ConfigConsumer>;
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值