antd 分析 Button ts篇

分析 antd – Button – Ts

尝试反向推导 button 组件 源码如下
样式文件使用 antd 的 css

import React, { useEffect, useState, ReactNode } from "react";
import { LoadingOutlined } from "@ant-design/icons";
import  Class from "classnames";

interface Props {
  children?: ReactNode;
  type?: "primary" | "ghost" | "dashed" | "link" | "text" | "default";
  icon?: ReactNode;
  shape?: "default" | "circle" | "round";
  size?: "large" | "middle" | "small";
  ghost?: Boolean;
  loading?: Boolean;
  block?: Boolean;
  danger?: Boolean;
  props?: any;
}

const Button = ({
  children,
  type,
  icon,
  shape,
  size,
  ghost,
  loading,
  block,
  danger,
  ...props
}: Props) => {
  const [classNames, setClassNames] = useState(["ant-btn"]);

  useEffect(() => {
    const classArr: string[] = []; // 收集类名
    const prefix = classNames[0]; // 获取前缀

    // 设置按钮类型	primary | ghost | dashed | link | text | default	default
    if (type) {
      classArr.push(`${prefix}-${type}`);
    }

    // 设置按钮形状	default | circle | round	'default'
    if (shape) {
      classArr.push(`${prefix}-${shape}`);
    }

    // size	设置按钮大小	large | middle | small	middle
    if (size && size !== 'middle') {
      const sizeTypes: { large: string; small: string } = {
        large: "lg",
        small: "sm",
      };
      sizeTypes[size] && classArr.push(`${prefix}-${sizeTypes[size]}`);
    }

    // 幽灵属性,使按钮背景透明	boolean	false
    if (ghost) {
      classArr.push(`${prefix}-background-ghost`);
    }

    // 设置按钮载入状态	boolean | { delay: number }	false
    if (loading) {
      classArr.push(`${prefix}-loading`);
    }

    // 将按钮宽度调整为其父宽度的选项	boolean	false
    if (block) {
      classArr.push(`${prefix}-block`);
    }

    // 设置危险按钮	boolean	false
    if (danger) {
      classArr.push(`${prefix}-dangerous`);
    }

    setClassNames((state) => {
      return state.concat(classArr);
    });

    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, []);

  return (
    <button {...props} className={Class(classNames)}>
      {loading && (
        <span className="ant-btn-loading-icon">
          <LoadingOutlined />
        </span>
      )}
      <span>
        {icon}
        {children}
      </span>
    </button>
  );
};

export default Button;

欢迎点赞、评论、收藏,谢谢 ( 。ớ ₃ờ)ھ

您想问关于 Vue3、TypeScript 和 Ant Design 的布局方面的问题吗?如果是的话,我可以为您提供一些信息。 Vue3 是目前最新的 Vue.js 版本,它引入了一些新的特性和改进,例如 Composition API、Teleport 等。TypeScript 是一种强类型语言,可以帮助我们在编写代码时更好地发现问题和提高代码的可维护性。Ant Design 是一款流行的 UI 库,它提供了丰富的组件和样式,可以帮助我们快速构建漂亮的界面。 对于布局方面,Ant Design 提供了多种布局组件,例如 Layout、Grid、Space 等。在使用 TypeScript 和 Vue3 时,我们可以使用 Composition API 来更好地组织代码和管理状态。例如,可以使用 ref 和 reactive 来定义和管理组件内部的状态,使用 computed 来计算派生状态,并使用 setup 函数来初始化组件。 以下是一个使用 Vue3、TypeScript 和 Ant Design 的布局示例: ```html <template> <Layout> <Header>Header</Header> <Content> <div class="content"> <Breadcrumb> <Breadcrumb.Item>Home</Breadcrumb.Item> <Breadcrumb.Item>Dashboard</Breadcrumb.Item> </Breadcrumb> <div class="site-layout-background" style="padding: 24px"> <Card bordered> <p>Dashboard Content</p> <Button type="primary">Button</Button> </Card> </div> </div> </Content> <Footer>Footer</Footer> </Layout> </template> <script lang="ts"> import { ref, defineComponent } from 'vue' import { Layout, Breadcrumb, Card, Button } from 'ant-design-vue' export default defineComponent({ components: { Layout, Header: Layout.Header, Content: Layout.Content, Footer: Layout.Footer, Breadcrumb, Card, Button }, setup() { const title = ref('Dashboard') return { title } }, }) </script> <style> .content { padding: 24px; } </style> ``` 在以上示例中,我们使用了 Layout、Header、Content、Footer、Breadcrumb、Card、Button 等组件来构建页面布局和内容。使用 ref 来定义 title 状态,并使用 setup 函数来初始化组件。在模板中,我们使用了 Ant Design 的样式和组件来构建页面。在样式中,我们通过定义 .content 来设置内容区域的样式。 希望这能帮助您解决问题。如果您有更多问题或需要进一步帮助,请随时提出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子羡爱学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值