我尝试使用Tailwind CSS构建组件库!

大家好,我是Lucky Jain,今天我将分享如何使用Tailwind CSS构建自己的组件库。每次启动新项目时,都需要搜索、复制和自定义组件,效率低下!因此,我决定创建一个可复用的组件库。

让我们看看我的构建过程、遇到的挑战以及创建的一些实用组件!


为什么选择Tailwind CSS?

坦白说,Tailwind CSS在样式方面非常出色。它是一个实用优先的CSS框架,提供可以直接添加到HTML元素的预定义类。无需额外的CSS文件和混乱!

我选择Tailwind CSS的原因:

  • 可复用性和灵活性: 无需重复编写自定义CSS。
  • 易于维护和扩展: 方便维护和扩展项目。
  • 简洁的代码风格: 看起来非常干净利落。
  • 支持暗黑模式: 轻松实现暗黑模式切换。

现在,让我们开始设置。


设置组件库

首先,创建一个简单的React Vite项目:

npm create vite@latest my-ui-library --template react
cd my-ui-library
npm install

安装Tailwind CSS

npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p

然后,配置tailwind.config.js:

export default {
  content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}"],
  theme: {
    extend: {},
  },
  plugins: [],
};

在src/index.css中导入Tailwind CSS:

@tailwind base;
@tailwind components;
@tailwind utilities;

构建组件

现在是激动人心的时刻——创建可复用的UI组件!

  1. 按钮组件

首先,创建一个简单而强大的按钮组件:

const Button = ({ text, onClick, variant = "primary" }) => {
  const baseStyles = "px-4 py-2 font-semibold rounded-md focus:outline-none";
  const variants = {
    primary: "bg-blue-500 text-white hover:bg-blue-600",
    secondary: "bg-gray-500 text-white hover:bg-gray-600",
    danger: "bg-red-500 text-white hover:bg-red-600",
  };

  return (
    <button className={`${baseStyles} ${variants[variant]}`} onClick={onClick}>
      {text}
    </button>
  );
};

export default Button;

用法:

<Button text="点击我" onClick={() => alert("按钮被点击!")} variant="primary" />
  1. 卡片组件

一个简单的卡片组件,用于包装内容并使其美观:

const Card = ({ title, description }) => {
  return (
    <div className="bg-white shadow-md rounded-lg p-4 border border-gray-200">
      <h2 className="text-lg font-bold">{title}</h2>
      <p className="text-gray-600">{description}</p>
    </div>
  );
};

export default Card;

用法:

<Card title="Tailwind 真棒!" description="这是一个可复用的卡片组件。" />

发布组件库

要将其作为npm包发布,只需在package.json中设置main入口。然后,可以使用npm publish与他人共享你的库!

{
  "name": "my-tailwind-ui",
  "version": "1.0.0",
  "main": "dist/index.js", // 确保dist/index.js存在
  "scripts": {
    "build": "tsc" //  根据你的构建流程调整
  }
}

发布:

npm login
npm publish

然后,其他人可以使用以下命令安装:

npm install my-tailwind-ui

结论

使用Tailwind CSS构建组件库非常有趣!起初我以为很难,但一旦理解了结构,就非常简单。现在我拥有了自己的可复用UI套件,可以在每个新项目中使用。

如果你正在考虑构建自己的组件库,那就去做吧!编写代码,进行实验,并构建你自己的Tailwind UI套件!


如果你喜欢这篇文章,请在评论中分享你的想法!

以上就是我尝试使用Tailwind CSS构建组件库!的详细内容,更多请关注骃骐网【www.myinqi.com】。

相关推荐:

Pandas 中基于条件将数据填充到空矩阵:构建地理流动流量的二维汇总表

本文介绍如何使用 pandas 的 pivot_table 和 categorical 配合 fill_value 参数,将原始流动数据(含 origin-destination 地理编码和流量值)高效转换为指定地理单元集合的 n×n 流量矩阵,缺失组合自动补零。 本文介绍如何使用 pandas 的 pivot_table 和 categorical 配合 fill_value 参数,将原始流动数...

Python Textual 教程:正确获取 Input 组件的用户输入值

本文详解如何在 textual 框架中正确访问 input 小部件的实时输入值,避免因生命周期误解、方法签名错误或状态同步不当导致的空值、对象引用异常等问题,并提供可运行的完整示例。 本文详解如何在 textual 框架中正确访问 input 小部件的实时输入值,避免因生命周期误解、方法签名错误或状态同步不当导致的空值、对象引用异常等问题,并提供可运行的完整示例。 在 Textual 应用中,In...

Python Pyecharts怎么实现多个不同图表的联动展示_利用Grid和Page组件打包输出HTML文件

Pyecharts的Grid和Page仅为布局容器,不支持图表间事件联动;Grid用于同页多图对齐与坐标共享,Page用于垂直分页展示,真联动需原生JS或Streamlit等框架。 Pyecharts 的 Grid 和 Page 都不能真正实现“联动”(比如点击柱状图某柱子,折线图高亮对应时间点),它们只是布局容器——把多个独立图表拼在一起或分页展示。真要联动,得上 echarts 原生 JS 或...

文本分类在Python里怎么应对新词与未登录词_使用Subword与BPE算法构建分词器

结论:subword/BPE并非解决未登录词,而是让模型无需认识整词——靠子词拼合;关键在训练与下游任务的tokenization逻辑对齐。 直接说结论:用 subword 或 BPE 不是“解决”未登录词,而是让模型根本不需要“认识”整词——它靠子词拼出来。关键不在分词器本身多聪明,而在训练时是否对齐了 subword 切分与下游任务的 tokenization 逻辑。 为什么 jieba / ...

如何在Python中实现异步定时任务_使用asyncio.sleep构建高精度循环调度

asyncio.sleep比time.sleep更适合异步定时循环,因为前者是协程,只挂起当前任务并让出控制权,后者是同步阻塞函数,会卡死整个事件循环;实操中必须用await asyncio.sleep(n),且需用绝对时间锚点避免调度漂移。 asyncio.sleep 为什么比 time.sleep 更适合异步定时循环 因为 time.sleep 是同步阻塞的,会直接卡住整个事件循环;而 asy...

怎么在Python Django中实现API接口的版本控制_利用DRF的Versioning组件

绝大多数 Laravel 和 DRF 项目应将 API 版本号放在 URL 路径中(如 /api/v1/users),因其调试直观、缓存友好、日志可读、Nginx/CDN 路由可控;请求头方式虽更符合 REST 语义,但调试麻烦且代理可能丢弃自定义头。 API版本号该放在URL路径里还是请求头中 DRF默认支持多种版本控制方案,但URLPathVersioning和AcceptHeaderVers...

Python中Scikit-learn如何构建机器学习流水线_使用Pipeline简化流程

Pipeline的核心作用是防止数据泄露、避免训练/预测不一致、减少重复代码;其fit()在每次交叉验证fold内仅用当前fold训练子集拟合scaler,杜绝跨fold信息泄露。 直接说结论:用 Pipeline 不是为了“看起来更专业”,而是为了堵住数据泄露、避免训练/预测不一致、减少重复代码这三类高频生产事故。 为什么 Pipeline 调用 fit() 时不会提前泄露测试集信息 关键在执行...

Python怎么实现优先级队列_利用heapq模块构建最小堆逻辑

直接用heapq不能当优先级队列用,因其仅提供堆操作原语,不支持更新优先级、按值删除或最大堆;常见错误是直接插入(priority, item)元组而item不可比较,导致TypeError。 为什么直接用 heapq 不能当优先级队列用 因为 heapq 只提供堆操作原语(如 heappush、heappop),不封装成带优先级的队列类;它本身不支持「按优先级自动排序 + 支持重复元素 + 允许...

Python如何实现广度优先搜索BFS_基于collections.deque构建队列

为什么不用list而要用deque实现BFS队列 因为list.pop(0)是O(n)操作,每次从头部弹出都会移动后面所有元素;而deque.popleft()是O(1),BFS频繁出入队时性能差距会指数级放大。实测10万节点图上,list版本可能卡顿数秒,deque几乎瞬时完成。 常见错误是写成queue = []; queue.pop(0),尤其新手从循环队列概念直接套用列表索引,结果在稍大规...