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/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()) 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 模擬逐字加載即可

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/82992.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/82992.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/82992.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

力扣每日一題——找到離給定兩個節點最近的節點

目錄 題目鏈接&#xff1a;2359. 找到離給定兩個節點最近的節點 - 力扣&#xff08;LeetCode&#xff09; 題目描述 解法一&#xff1a;雙指針路徑交匯法? 基本思路 關鍵步驟 為什么這樣可行呢我請問了&#xff1f; 舉個例子 特殊情況 Java寫法&#xff1a; C寫法&a…

Termux可用中間人網絡測試工具Xerosploit

Termux可用中間人網絡測試工具Xerosploit。 Xerosploit 是一款基于 MITM 的本地網絡滲透測試工具包。 食用方法&#xff1a; git clone https://github.com/LionSec/xerosploit cd xerosploit sudo python3 install.py 運行&#xff1a; sudo xerosploit 使用備注&#xff1…

vue3 導出excel

需求&#xff1a;導出自帶格式的excel表格 1.自定義二維數組格式 導出 全部代碼&#xff1a; <el-button click"exportExcel">導出</el-button> const exportExcel () > {const data [[商品, 單價, 數量, 總價],[A, 100, 1.55, { t: n, f: B2*C2…

【SQL】關鍵字

ORDER BY ORDER BY(排序) 語句可以按照一個或多個列的值進行升序&#xff08;ASC&#xff09;或降序&#xff08;DESC&#xff09;排序。 MAX / MIN MAX() 函數返回一組值中的最大值。這個函數常用于數字字段&#xff0c;但也可以用于文本字段來找出按字典順序最后的元素。 …

深度學習篇---OC-SORT實際應用效果

OC-SORT 算法在實際應用中的效果可從準確性、魯棒性、效率三個核心維度評估,其表現與傳統多目標跟蹤算法(如 SORT、DeepSORT)相比有顯著提升,尤其在復雜場景中優勢突出。以下是具體分析: 一、準確性:目標關聯更可靠 1. 遮擋場景下的 ID 保持能力 優勢表現: 傳統算法(…

處理知識庫文件_編寫powershell腳本文件_批量轉換其他格式文件到pdf文件---人工智能工作筆記0249

最近在做部門知識庫&#xff0c;選用的dify&#xff0c;作為rag的工具&#xff0c;但是經過多個對比&#xff0c;最后發現&#xff0c; 比較好用的是&#xff0c;納米搜索&#xff0c;但是可惜納米搜索無法在內網使用&#xff0c;無法把知識庫放到本地&#xff0c;導致 有信息…

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…

微信小店推客系統達人用戶管理的數據支持和便利

達人粉絲畫像關聯&#xff1a;系統通過技術手段&#xff0c;一定程度上獲取達人粉絲的畫像數據&#xff0c;如年齡分布、性別比例、地域分布、消費偏好等。運營者可以根據這些粉絲畫像&#xff0c;為達人匹配更符合其粉絲需求的商品。例如&#xff0c;若某達人的粉絲以年輕女性…

LeetCode 215:數組中的第K個最大元素 - 兩種高效解法詳解

文章目錄 問題描述解法一&#xff1a;快速選擇算法&#xff08;QuickSelect&#xff09;算法思想算法步驟Java實現復雜度分析算法特點 解法二&#xff1a;最小堆&#xff08;優先隊列&#xff09;算法思想算法步驟Java實現復雜度分析算法特點 兩種解法比較測試示例總結 在算法面…

視頻壓制(Video Encoding/Compression)

視頻壓制是指通過特定的算法和技術&#xff0c;將原始視頻文件轉換為更小體積或更適合傳播的格式的過程。其核心目的是在盡量保持畫質的前提下&#xff0c;減少視頻的文件大小&#xff0c;或適配不同播放設備、網絡環境的需求。 --- ### **關鍵概念解析** 1. **為什么需要壓制…

如何做好一個決策:基于 Excel的決策樹+敏感性分析應用

決策點: 開發新產品? (是 / 否) 因素 (如果是): 市場接受度 (高 / 中 / 低);概率: 高(0.3), 中(0.5), 低(0.2) 結果值 (NPV): 高(+$1M), 中(+$0.2M), 低(-$0.5M) 不開發成本/收益: $0 開發計算: EMV(市場接受度) = (0.3 * 1M) + (0.5 * 0.2M) + (0.2 * -0.5M) = $0.3M + $…

Java中的設計模式實戰:單例、工廠、策略模式的最佳實踐

Java中的設計模式實戰&#xff1a;單例、工廠、策略模式的最佳實踐 在Java開發中&#xff0c;設計模式是構建高效、可維護、可擴展應用程序的關鍵。本文將深入探討三種常見且實用的設計模式&#xff1a;單例模式、工廠模式和策略模式&#xff0c;并通過詳細代碼實例&#xff0…

PyTorch學習(1):張量(Tensor)核心操作詳解

PyTorch學習(1)&#xff1a;張量&#xff08;Tensor&#xff09;核心操作詳解 一、張量&#xff08;Tensor&#xff09;核心操作詳解 張量是PyTorch的基礎數據結構&#xff0c;類似于NumPy的ndarray&#xff0c;但支持GPU加速和自動微分。 1. 張量創建與基礎屬性 import to…

Docker部署Spark大數據組件:配置log4j日志

上一篇《Docker部署Spark大數據組件》中&#xff0c;日志是輸出到console的&#xff0c;如果有將日志輸出到文件的需要&#xff0c;需要進一步配置。 配置將日志同時輸出到console和file 1、停止spark集群 docker-compose down -v 2、使用自帶log4j日志配置模板配置 cp -f …

Nginx Lua模塊(OpenResty)實戰:動態化、智能化你的Nginx,實現復雜Web邏輯 (2025)

更多服務器知識&#xff0c;盡在hostol.com 嘿&#xff0c;各位Nginx的“鐵桿粉絲”和“配置大師”們&#xff01;咱們都知道&#xff0c;Nginx以其超凡的性能、穩定性和豐富的模塊化功能&#xff0c;在Web服務器、反向代理、負載均衡等領域獨步青云&#xff0c;簡直是服務器軟…

一、CentOS7通過kubeadm安裝K8S 1.20.1版本

一、準備機器 所有節點執行 準備3臺虛擬機&#xff08;2核4G&#xff0c;CentOS 7&#xff09;&#xff0c;配置如下&#xff1a; hostnamectl set-hostname k8s-master # 在Master節點執行 hostnamectl set-hostname k8s-node1 # Worker1節點執行 hostnamectl set-hostna…

AgenticSeek,開源本地通用AI Agent,自主執行任務

AgenticSeek是一款完全本地化的開源AI助手&#xff0c;作為Manus的開源替代品&#xff0c;專為保護用戶隱私而設計。它能夠在本地設備上執行多種任務&#xff0c;包括網頁瀏覽、代碼編寫和復雜項目的規劃&#xff0c;確保所有操作和數據均在用戶的設備上完成。 AgenticSeek是什…

C 語言學習筆記(指針6)

內容提要 內存操作 內存操作的函數 內存操作 我們對于內存操作需要依賴于string.h頭文件中相關的庫函數。 內存的庫函數 內存填充 頭文件&#xff1a;#include <string.h>函數原型 void* memset(void* s, int c, size_t)函數功能&#xff1a;將內存塊s的前n個字節…

Grafana-Gauge儀表盤

儀表盤是一種單值可視化。 可讓您快速直觀地查看某個值落在定義的或計算出的最小和最大范圍內的位置。 通過重復選項&#xff0c;您可以顯示多個儀表盤&#xff0c;每個對應不同的序列、列或行。 支持的數據格式 單值 數據集中只有一個值&#xff0c;會生成一個顯示數值的…

解決Vue項目依賴錯誤:使用electron-vite重建

文章目錄 開端解決方案&#xff1a;使用 electron-vite Vue 重建項目1. 環境準備2. 創建新項目3. 安裝依賴并啟動項目 開端 在開發過程中&#xff0c;我遇到了一個令人頭疼的錯誤提示&#xff1a; 0:0 error Parsing error: Cannot find module vue/cli-plugin-babel/preset…