NextJS开发:shadcn/ui中Button组件扩展增加图标

shadcn/ui组件比较灵活,但是功能相比ant之类组件还是缺少太多功能,本文为shadcn/ui为button组件增加图标,加载中动画等效果。

  1. 安装Lucide
bash 复制代码
npm install lucide
  1. Lucide组件
typescript 复制代码
import { cn } from '@/lib/utils';
import { icons } from 'lucide-react';

const LcIcon = ({ name, color, size, className }: { name: string, color?: string, size: number, className?: string}) => {
  const LucideIcon = (icons as any)[name];
  if(LucideIcon == null) {
    return <></>
  }
  if(color != null) {
    return <LucideIcon color={color} size={size} />
  } else {
    return <LucideIcon size={size} className={cn("", className)}/>
  }
};

export default LcIcon;
  1. 创建组件CustomButton
typescript 复制代码
"use client"
import React, { MouseEventHandler } from "react";
import { Button } from "../ui/button";
import LcIcon from "./lc-icon";

/** 
 * Button扩展,增加图标功能 
 * <CustomButton icon="Loader" onClick={handleSubmit}>Button</CustomButton>
 * */
export const CustomButton = (props: {
  className?: string, 
  icon?: string, 
  loading?: boolean
  disabled?: boolean,
  type?: string,
  onClick?: MouseEventHandler<HTMLButtonElement>,
  children?: any
}) => {

  const buildIcon = () => {
    if(props.loading != null && props.loading) {
      return <LcIcon name="Loader" size={16} className="mr-1 animate-spin"/>
    }
    else if(props.icon != null) {
      return <LcIcon name={props.icon} size={16} className="mr-1"/>
    }
    return ""
  }

  return (
    <Button type={props.type ?? 'button' as any} className={props.className} disabled={props.disabled} onClick={props.onClick}>
      { buildIcon() }
      { props.children }
    </Button>
  )
}
  1. 组件使用,

显示加载中

typescript 复制代码
import { CustomButton } from "@/components/app/custom-button";

<CustomButton loading={true} disabled={true} >测试</CustomButton>

显示图标

typescript 复制代码
import { CustomButton } from "@/components/app/custom-button";

<CustomButton icon="Home">测试</CustomButton>
相关推荐
北辰alk12 小时前
React Native vs React Web:深度对比与架构解析
react native·react.js
黛色正浓14 小时前
【React】极客园案例实践-文章列表模块
javascript·react.js·ecmascript
m0_7269659816 小时前
ReAct 小发展
前端·react.js·前端框架
2401_8603195216 小时前
【精通篇】打造React Native鸿蒙跨平台开发高级复合组件库开发系列:Overlay 遮罩层(创建一个遮罩层)
react native·react.js·harmonyos
七夜zippoe16 小时前
基于ReAct框架的智能体构建实战 - 从原理到企业级应用
前端·javascript·react.js·llm·agent·react
2401_8604947017 小时前
【精通篇】打造React Native鸿蒙跨平台开发高级复合组件库开发系列:Slider 滑块(用于在给定的范围内选择一个值)
react native·react.js·harmonyos
梦65017 小时前
react,Table 表格树形如何展开所有子集,以及自定义展开按钮样式
前端·javascript·react.js
黑客思维者17 小时前
核弹级漏洞突袭React生态:RSC反序列化何以成为RCE通道?
前端·javascript·react.js·远程代码执行漏洞
接着奏乐接着舞18 小时前
react hooks
前端·javascript·react.js
接着奏乐接着舞18 小时前
react redux 分组
前端·javascript·react.js