shadcn/ui

news2025/6/1 16:09:20

文章目录

  • 前言
    • ✅ 核心特点
    • 📦 支持组件(常用)
    • 🚀 安装使用(框架支持)
      • 初始化(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/uiMUIAnt DesignChakra 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/uiReactTailwind 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()) return

    const 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">
        <Input
          placeholder="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 模拟逐字加载即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2392997.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为FreeArc能和其他华为产品共用充电线吗?

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

[网页五子棋][匹配模式]创建房间类、房间管理器、验证匹配功能,匹配模式小结

文章目录 创建房间类创建房间类实现房间管理器 实现匹配器(3)验证匹配功能问题&#xff1a;匹配按钮不改变验证多开 小结 创建房间类 LOL&#xff0c;通过匹配的方式&#xff0c;自动给你加入到一个房间&#xff0c;也可手动创建游戏房间 这一局游戏&#xff0c;进行的“场所…

实验设计与分析(第6版,Montgomery)第3章单因子实验:方差分析3.11思考题3.7 R语言解题

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

【知识点】第2章:Python程序实例解析

文章目录 知识点整理Python程序语法元素分析 练习题判断题填空题选择题 知识点整理 Python程序语法元素分析 Python程序包括格式框架、注释、变量、表达式、分支语句、循环语句、函数等语法元素。 程序的格式框架 Python语言采用严格的 “缩进” 来表明程序的格式框架。缩进…

每日Prompt:指尖做画

提示词 微缩景观&#xff0c;微距摄影&#xff0c;俯瞰角度&#xff0c;特写&#xff0c;硕大食指手指甲&#xff0c;一个小小的人正在做画&#xff0c;小人右手拿画笔&#xff0c;小人左手拿调色盘&#xff0c;在指甲上作画&#xff0c;画的是中国古代山水画&#xff0c;背景…

redis未授权(CVE-2022-0543)

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

【运维实战】Linux 中su和sudo之间的区别以及如何配置sudo!

Linux 系统相比其他操作系统具有更高的安全性&#xff0c;其安全机制的核心之一在于用户管理策略和权限控制--普通用户默认无权执行任何系统级操作。 若普通用户需要进行系统级变更&#xff0c;必须通过su或sudo命令提权。 1.su与sudo的本质区别 su 要求直接共享 root 密码&…

浏览器之禁止打开控制台【F12】

前言 在有时我们的日常开发工作中&#xff0c;有些项目要求我们增加禁用控制台的要求&#xff0c;这种虽然很鸡肋&#xff0c;但是它确实存在&#xff0c;并且会让哈哈心里觉得很有成就感。 所以今天他来了。 文章目录 前言无限debugger实现思路&#xff1a;效果如下&#xff1…

GEARS以及与基础模型结合

理解基因扰动的反应是众多生物医学应用的核心。然而&#xff0c;可能的多基因扰动组合数量呈指数级增长&#xff0c;严重限制了实验探究的范围。在此&#xff0c;图增强基因激活与抑制模拟器&#xff08;GEARS&#xff09;&#xff0c;将深度学习与基因-基因关系知识图谱相结合…

计算机网络 | 1.1 计算机网络概述思维导图

附大纲&#xff1a; 计算机网络的概念 一个通过通信设备与线路把不同计算机系统连接起来&#xff0c;实现资源共享和信息传递的系统 计算机网络的组成 从组成成分上 硬件&#xff1a;主机、通信链路、交换设备、通信处理机软件&#xff1a;网络操作系统、聊天软件等协议&…

最悉心的指导教程——阿里云创建ECS实例教程+Vue+Django前后端的服务器部署(通过宝塔面板)

各位看官老爷们&#xff0c;点击关注不迷路哟。你的点赞、收藏&#xff0c;一键三连&#xff0c;是我持续更新的动力哟&#xff01;&#xff01;&#xff01; 阿里云创建ECS实例教程 注意&#xff1a; 阿里云有300元额度的免费适用期哟 白嫖~~~~ 注册了阿里云账户后&#x…

windows中Redis、MySQL 和 Elasticsearch启动并正确监听指定端口

Redis&#xff1a;在 localhost 上启动&#xff0c;并监听端口 6379 MySQL&#xff1a;在 localhost 上启动&#xff0c;并监听端口 3306 Elasticsearch&#xff1a;在 127.0.0.1 上启动&#xff0c;并监听端口 9300 1. Redis 确保 Redis 在 localhost 上启动并监听端口 6379…

学者观察 | Web3.0的技术革新与挑战——北京理工大学教授沈蒙

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

pycharm终端遇不显示虚拟环境的问题

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

聊聊网络变压器的浪涌等级标准是怎样划分的呢?

Hqst盈盛&#xff08;华强盛&#xff09;电子导读&#xff1a;聊聊网络变压器的浪涌等级标准是怎样划分的呢&#xff1f; 在和做防雷产品的客户的深度沟通网络变压器产品选型中发现&#xff1a;客户对网络变压器的浪涌等级划分也很希望有更深的了解&#xff0c;今天就这个问题和…

2025年Google I/O大会上,谷歌展示了一系列旨在提升开发效率与Web体验的全新功能

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

ONLYOFFICE文档API:编辑器的品牌定制化

在当今数字化办公时代&#xff0c;文档编辑器已成为各类企业、组织和开发者不可或缺的工具之一。ONLYOFFICE 文档提供的功能丰富且强大的文档编辑 API&#xff0c;让开发者能够根据自己的产品需求和品牌特点&#xff0c;定制编辑器界面&#xff0c;实现品牌化展示&#xff0c;为…

HTTP/HTTPS与SOCKS5三大代理IP协议,如何选择最佳协议?

在复杂多变的网络环境中&#xff0c;代理协议的选择直接影响数据安全、访问效率和业务稳定性。HTTP、HTTPS和SOCKS5作为三大主流代理协议&#xff0c;各自针对不同场景提供独特的解决方案。本文将从协议特性、性能对比到选型策略&#xff0c;为您揭示如何根据业务需求精准匹配最…

远程调用 | OpenFeign+LoadBalanced的使用

目录 RestTemplate 注入 OpenFeign 服务 LoadBalanced 服务 LoadBalanced 注解 RestTemplate 注入 创建 配置类&#xff0c;这里配置后 就不用再重新new一个了&#xff0c;而是直接调用即可 import org.springframework.cloud.client.loadbalancer.LoadBalanced; import …

NSSCTF [NISACTF 2022]ezheap

2058.[NISACTF 2022]ezheap(堆溢出) [NISACTF 2022]ezheap 1.准备 2.ida分析 main函数 int __cdecl main(int argc, const char **argv, const char **envp) {char *command; // [esp8h] [ebp-10h]char *s; // [espCh] [ebp-Ch]setbuf(stdin, 0);setbuf(stdout, 0);s (cha…