shadcn/ui
文章目录
- 前言
- ✅ 核心特点
- 📦 支持组件(常用)
- 🚀 安装使用(框架支持)
- 初始化(Next.js 项目为例)
- 添加一个组件
- 🧠 对比其他组件库
- 📘 官方资源
- ✅ 总结
- ✅ 功能特性:
- 📦 依赖项(需先安装)
- 🧱 页面代码:`ChatPage.tsx`
- 🎨 可选样式增强(全局 CSS)
- 🧪 进一步可添加功能
前言
shadcn/ui
是一个由社区维护的现代 UI 组件库模板集合,专为 React + Tailwind CSS 生态设计,主打:
- ✨ 可完全控制样式 &行为(不像 MUI、AntD 那样封闭)
- 🎯 基于 Radix UI(可访问性强)
- 🧩 可选的组件拼装,不强绑设计系统
- ⚙️ 支持 Server Component、SSR、RSC 等现代特性
✅ 核心特点
特性 | 说明 |
---|---|
✨ 美观现代 | 默认采用干净、优雅的设计(类似 Vercel / Linear) |
🎨 Tailwind 驱动 | 100% Tailwind CSS 控制样式,自由修改 |
⚛️ Radix UI 底层 | 提供无障碍可访问性支持(A11y) |
🧱 可组合 | 所有组件是“导入代码”的方式,无 run-time 限制 |
🔧 可维护性强 | 你拥有组件代码本体(不再受限组件黑箱) |
📦 支持组件(常用)
分类 | 组件 |
---|---|
表单 | Input , Textarea , Select , Switch , Checkbox , Form |
弹窗 | Dialog , Popover , Tooltip , AlertDialog , Sheet |
导航 | Tabs , Accordion , DropdownMenu , NavigationMenu |
其他 | Toast , Badge , Card , Avatar , Skeleton , Progress |
🚀 安装使用(框架支持)
支持 Vite、Next.js、Remix 等现代 React 框架。
初始化(Next.js 项目为例)
npx shadcn-ui@latest init
你会被提示:
- 是否使用 TypeScript
- UI 目录位置(如
components/ui
) - Tailwind 配置路径
- 是否安装组件(如
Button
,Dialog
)
添加一个组件
npx shadcn-ui@latest add button
生成的文件:
components/ui/button.tsx
你可以自由修改样式类或行为。
🧠 对比其他组件库
特性 | shadcn/ui | MUI | Ant Design | Chakra UI |
---|---|---|---|---|
样式控制 | ✅ 完全控制 | ❌ 封闭 | ❌ 封闭 | ⚠️ 类似 |
设计系统 | ⚠️ 提供默认样式 | ✅ 有 | ✅ 有 | ✅ 有 |
SSR 支持 | ✅ 优秀 | ⚠️ 需调整 | ⚠️ 有限 | ⚠️ 有限 |
适合 Tailwind | ✅ 最佳搭配 | ❌ 不兼容 | ❌ 不兼容 | ❌ 有冲突 |
📘 官方资源
- 官网:https://ui.shadcn.com
- GitHub:https://github.com/shadcn-ui/ui
- Demo 示例:https://ui.shadcn.com/docs/components/slider
✅ 总结
适合你吗? | 条件 |
---|---|
✅ 喜欢 Tailwind | 强烈推荐 |
✅ 需要 SSR / RSC 兼容 | 推荐 |
✅ 想要样式可控且干净 UI | 推荐 |
❌ 想要“开箱即用 + Theme切换 + 组件黑盒” | 不太适合 |
下面是一个基于 shadcn/ui
、React
和 Tailwind CSS
封装的 AI 聊天界面模板,具备如下特性:
✅ 功能特性:
- 支持聊天消息滚动显示
- 用户输入框 + 发送按钮
- 显示用户消息和 AI 消息
- 使用
shadcn/ui
组件:Input
,Button
,Card
,ScrollArea
,Skeleton
- Tailwind 风格美观整洁
📦 依赖项(需先安装)
npx shadcn-ui@latest init
npx shadcn-ui@latest add button input card scroll-area
🧱 页面代码:ChatPage.tsx
import { useState, useRef, useEffect } from "react"
import { Input } from "@/components/ui/input"
import { Button } from "@/components/ui/button"
import { ScrollArea } from "@/components/ui/scroll-area"
import { Card, CardContent } from "@/components/ui/card"interface Message {role: "user" | "assistant"content: string
}export default function ChatPage() {const [messages, setMessages] = useState<Message[]>([])const [input, setInput] = useState("")const scrollRef = useRef<HTMLDivElement>(null)const handleSend = async () => {if (!input.trim()) returnconst userMsg: Message = { role: "user", content: input }setMessages((prev) => [...prev, userMsg])setInput("")// 模拟 AI 回复setTimeout(() => {const aiMsg: Message = {role: "assistant",content: `你说的是:“${userMsg.content}”`}setMessages((prev) => [...prev, aiMsg])}, 1000)}useEffect(() => {scrollRef.current?.scrollIntoView({ behavior: "smooth" })}, [messages])return (<div className="flex flex-col h-screen p-4 max-w-2xl mx-auto"><h2 className="text-2xl font-bold mb-4">AI Chat Assistant</h2><ScrollArea className="flex-1 border rounded-lg p-4 space-y-2 bg-muted">{messages.map((msg, index) => (<Card key={index} className={msg.role === "user" ? "ml-auto bg-white" : "mr-auto bg-gray-100"}><CardContent className="p-3 text-sm whitespace-pre-wrap"><strong>{msg.role === "user" ? "You" : "AI"}:</strong> {msg.content}</CardContent></Card>))}<div ref={scrollRef} /></ScrollArea><div className="mt-4 flex gap-2"><Inputplaceholder="Ask something..."value={input}onChange={(e) => setInput(e.target.value)}onKeyDown={(e) => e.key === "Enter" && handleSend()}/><Button onClick={handleSend}>Send</Button></div></div>)
}
🎨 可选样式增强(全局 CSS)
body {@apply bg-background text-foreground;
}
🧪 进一步可添加功能
功能 | shadcn 组件建议 |
---|---|
Markdown 渲染 | react-markdown 自定义卡片内容 |
Skeleton 骨架 | Skeleton 组件用于 AI 回复加载中 |
多轮对话滚动 | ScrollArea + useRef 自动滚动到底部 |
AI 流式回复 | 用 useEffect 模拟逐字加载即可 |
相关文章:
shadcn/ui
文章目录 前言✅ 核心特点📦 支持组件(常用)🚀 安装使用(框架支持)初始化(Next.js 项目为例)添加一个组件 🧠 对比其他组件库📘 官方资源✅ 总结✅ 功能特性&…...

华为FreeArc能和其他华为产品共用充电线吗?
最近刚买的FreeArc终于到手啦,看到网上有朋友说,这次的耳机是不附带充电线,开箱后发现果真如此,那FreeArc到底用什么规格的充电线,能不能和华为的Type-C数据线通用,我来给大家解答一下吧! Free…...

[网页五子棋][匹配模式]创建房间类、房间管理器、验证匹配功能,匹配模式小结
文章目录 创建房间类创建房间类实现房间管理器 实现匹配器(3)验证匹配功能问题:匹配按钮不改变验证多开 小结 创建房间类 LOL,通过匹配的方式,自动给你加入到一个房间,也可手动创建游戏房间 这一局游戏,进行的“场所…...

实验设计与分析(第6版,Montgomery)第3章单因子实验:方差分析3.11思考题3.7 R语言解题
本文是实验设计与分析(第6版,Montgomery著,傅珏生译) 第3章单因子实验:方差分析3.11思考题3.7 R语言解题。主要涉及单因子方差分析,正态性假设检验,残差与拟合值的关系图,平方根变换。 X<-c(…...

【知识点】第2章:Python程序实例解析
文章目录 知识点整理Python程序语法元素分析 练习题判断题填空题选择题 知识点整理 Python程序语法元素分析 Python程序包括格式框架、注释、变量、表达式、分支语句、循环语句、函数等语法元素。 程序的格式框架 Python语言采用严格的 “缩进” 来表明程序的格式框架。缩进…...
从解决一个分享图片生成的历史bug出发,详解LayoutInflater和View.post的工作原理
问题背景 最近在项目中遇到一个问题:在档口分享功能中,需要动态生成一个分享图片。代码是这样写的: // 项目中的代码 val shareView LayoutInflater.from(thisStallMainActivityV1).inflate(R.layout.share_header_stall_main_layout, nul…...
Ubuntu 22.04 上使用 Docker 安装 RagFlow
GitHub地址:添加链接描述 RAGFlow 是一款开源的检索增强生成(Retrieval-Augmented Generation,简称 RAG)引擎,旨在通过深度文档理解技术,结合大语言模型(LLM),为用户提供高质量、可溯源的问答服务。 🚀 快速入门 RAGFlow 提供了便捷的部署方式,支持 Docker 环境。…...

每日Prompt:指尖做画
提示词 微缩景观,微距摄影,俯瞰角度,特写,硕大食指手指甲,一个小小的人正在做画,小人右手拿画笔,小人左手拿调色盘,在指甲上作画,画的是中国古代山水画,背景…...
Python打卡训练营day40——2025.05.30
知识点回顾: 彩色和灰度图片测试和训练的规范写法:封装在函数中 展平操作:除第一个维度batchsize外全部展平 dropout操作:训练阶段随机丢弃神经元,测试阶段eval模式关闭dropout 作业:仔细学习下测试和训练…...
Java八股-数据类型转换有哪些?类型互转会有什么问题?为什么用bigDecimal 不用double ?自动装箱和拆箱?包装类?
Java中有哪些数据类型转换? 显示类型转换:在前面一个括号,里面写上要转换的类型 隐式类型转换:小范围的数据类型转大范围的,int到long,float到double 字符串转整形或浮点:整形:In…...

redis未授权(CVE-2022-0543)
概述 Redis 默认绑定在 0.0.0.0:6379,在未配置防火墙或访问控制的情况下会将服务暴露在公网上。若未设置访问密码(默认通常为空),攻击者可直接未授权访问 Redis。利用 Redis 提供的 CONFIG 命令,攻击者可修改配置并将…...

【运维实战】Linux 中su和sudo之间的区别以及如何配置sudo!
Linux 系统相比其他操作系统具有更高的安全性,其安全机制的核心之一在于用户管理策略和权限控制--普通用户默认无权执行任何系统级操作。 若普通用户需要进行系统级变更,必须通过su或sudo命令提权。 1.su与sudo的本质区别 su 要求直接共享 root 密码&…...
LevelDB、BoltDB 和 RocksDB区块链应用比较
LevelDB、BoltDB 和 RocksDB 是三种常用的键值存储数据库,它们在区块链领域(如以太坊、比特币等)或其他高性能应用中有广泛应用。虽然它们都是嵌入式键值存储,但设计目标、性能特性、功能支持和适用场景有显著差异。以下是它们的详…...
c/c++的opencv图像金字塔缩放
图像金字塔缩放:OpenCV C/C 实践 📐 图像金字塔是计算机视觉中一种重要且基础的多尺度表示方法。它通过对原始图像进行连续的下采样(缩小)或上采样(放大)操作,生成一系列不同分辨率的图像。这些…...
PDF文件转换之输出指定页到新的 PDF 文件
背景 一份 PDF 学习资料需要打印其中某几页,文件有几百兆,看到 WPS 有PDF拆分功能,但是需要会员,开了一个月会员后完成了转换。突然想到,会员到期后如果还要拆解的话,怎么办呢?PDF 文件拆解功能…...

浏览器之禁止打开控制台【F12】
前言 在有时我们的日常开发工作中,有些项目要求我们增加禁用控制台的要求,这种虽然很鸡肋,但是它确实存在,并且会让哈哈心里觉得很有成就感。 所以今天他来了。 文章目录 前言无限debugger实现思路:效果如下࿱…...
进阶智能体实战九、图文需求分析助手(ChatGpt多模态版)(帮你生成 模块划分+页面+表设计、状态机、工作流、ER模型)
🧠 基于 ChatGPT 多模态大模型的需求文档分析助手 本文将介绍如何利用 OpenAI 的 GPT-4o 多模态能力,构建一个智能的需求文档分析助手,自动提取功能模块、菜单设计、字段设计、状态机、流程图和 ER 模型等关键内容。 一、🔧 环境准备 在开始之前,请确保您已经完成了基础…...

GEARS以及与基础模型结合
理解基因扰动的反应是众多生物医学应用的核心。然而,可能的多基因扰动组合数量呈指数级增长,严重限制了实验探究的范围。在此,图增强基因激活与抑制模拟器(GEARS),将深度学习与基因-基因关系知识图谱相结合…...
SFINAE(替换并不是错误)机制详解详解
C—SFINAE机制详解 1. 核心概念 SFINAE(替换失败并非错误)是C模板元编程的核心机制,它规定了: 在模板参数推导/替换过程中如果某个替换导致无效代码不会引发编译错误而是从候选函数集中静默移除该模板特化 关键特性 template …...
怎么用外网打开内网的网址?如在异地在家连接访问公司局域网办公网站
什么是内网:即本地网络,私有网,内网IP,如学校局域网,家庭内网,公司内部网络等。可以简单理解为同一个路由下的几个电脑网络。 外网概念:即公网,互联网,是相对于内网而言…...

计算机网络 | 1.1 计算机网络概述思维导图
附大纲: 计算机网络的概念 一个通过通信设备与线路把不同计算机系统连接起来,实现资源共享和信息传递的系统 计算机网络的组成 从组成成分上 硬件:主机、通信链路、交换设备、通信处理机软件:网络操作系统、聊天软件等协议&…...
AI对软件工程的影响及未来发展路径分析报告
目录 第一部分:引言 研究背景与意义 报告框架与方法论 第二部分:AI对不同行业软件工程的影响分析 数字化行业 制造业 零售业 工业领域 第三部分:大厂AI软件工程实践案例分析 微软 谷歌 阿里巴巴 华为 第四部分:未来…...
redis缓存与数据库协调读写机制设计
1.读机制: 读机制没有太大的争议点,因为缓存机制的设计,就是为了更快的命中目标数据,所以读机制先天固定好了:先去读取缓存,缓存未命中再去读取数据库。 2.写机制: 写机制其实也没什么争议点…...

最悉心的指导教程——阿里云创建ECS实例教程+Vue+Django前后端的服务器部署(通过宝塔面板)
各位看官老爷们,点击关注不迷路哟。你的点赞、收藏,一键三连,是我持续更新的动力哟!!! 阿里云创建ECS实例教程 注意: 阿里云有300元额度的免费适用期哟 白嫖~~~~ 注册了阿里云账户后&#x…...
【Python】os模块
目录 🌟 前言🏗️ 技术背景与价值🩹 当前技术痛点🛠️ 解决方案概述👥 目标读者说明 🧠 一、技术原理剖析📊 核心架构图解💡 核心作用讲解🔧 关键技术模块说明⚖️ 技术选…...
Syslog 全面介绍及在 C 语言中的应用
Syslog 概述 Syslog 是一种工业标准的日志记录协议,用于在网络设备之间传递日志消息。它最早由 Eric Allman 在 1980 年代为 BSD Unix 开发,现在已成为系统和网络管理的重要组成部分。Syslog 协议允许设备将事件消息发送到中央服务器(称为 sy…...

windows中Redis、MySQL 和 Elasticsearch启动并正确监听指定端口
Redis:在 localhost 上启动,并监听端口 6379 MySQL:在 localhost 上启动,并监听端口 3306 Elasticsearch:在 127.0.0.1 上启动,并监听端口 9300 1. Redis 确保 Redis 在 localhost 上启动并监听端口 6379…...
Paimon远程文件系统连接机制解析
Paimon 在处理与远程文件系统的连接和使用方面,设计了一套灵活的抽象机制。下面将结合源代码分析 Paimon 是如何实现这一点的。 核心思想是定义一个通用的 FileIO 接口,然后为不同的文件系统提供具体的实现。对于常见的 HDFS、S3、OSS 等,Pa…...

学者观察 | Web3.0的技术革新与挑战——北京理工大学教授沈蒙
导语 沈蒙老师认为Web3.0正推动形成新型数据基础设施架构和数据要素流通机制,有望在数字经济时代发挥重要作用,对我国经济发展和社会进步将产生深远影响。AI在推动Web3.0发展方面具有巨大的潜力,但在隐私保护、公平性与安全性等方面也存在“…...

pycharm终端遇不显示虚拟环境的问题
大部分我们用pycharm会配合我们的anaconda来使用,但是配置好后,可能会出现pycharm终端不显示虚拟环境的问题。 首先是确定不显示环境,下图中如果没有这个方框,就是不显示虚拟环境。此时用pip或者conda的命令是会提示不是 “不是内…...