50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | GithubProfies(GitHub 个人资料)

📅 我们继续 50 个小项目挑战!—— GithubProfies组件

仓库地址:https://github.com/SunACong/50-vue-projects

项目预览地址:https://50-vue-projects.vercel.app/

在这里插入图片描述


使用 Vue 3 的 Composition API(<script setup>)结合 TailwindCSS 创建一个Github 用户信息展示组件。用户可以在输入框中搜索用户名,组件将通过 Github Public API 获取用户信息和其仓库数据并展示。


🎯 组件目标

  • 用户输入 Github 用户名并提交
  • 通过 Github API 获取用户信息
  • 获取用户的公开仓库并展示
  • 支持错误提示(如用户不存在)
  • 使用 Vue 3 Composition API 管理状态
  • 使用 TailwindCSS 构建响应式 UI
  • 展示清晰的用户信息与仓库列表

⚙️ 技术实现点

技术点描述
Vue 3 <script setup>使用响应式变量管理用户信息、仓库、错误状态
ref 响应式变量控制 usernameuserreposerror
v-model绑定输入框内容
@submit.prevent阻止默认表单提交行为并触发请求
fetch()请求 Github 用户信息与仓库数据
错误处理使用 try/catch 捕获请求错误
TailwindCSS 布局类构建全屏布局、卡片样式、响应式设计
动态条件渲染 v-if, v-else-if根据状态显示错误、用户信息或空状态

🧱 组件实现

模板结构 <template>

<template><div class="flex min-h-screen flex-col items-center justify-center bg-[#2a2a72] p-4 font-sans text-white"><form @submit.prevent="handleSubmit" class="mb-8 w-full max-w-xl"><inputv-model="username"type="text"placeholder="Search a Github User"class="w-full rounded-lg bg-[#4c2885] p-4 text-white shadow-lg placeholder:text-[#bbb] focus:outline-none" /></form><!-- 错误卡片 --><div v-if="error" class="max-w-3xl rounded-2xl bg-[#4c2885] p-6 text-center shadow-lg"><h1 class="text-xl font-bold">{{ error }}</h1></div><!-- 用户信息卡片 --><div v-else-if="user" class="flex w-full max-w-3xl flex-col rounded-2xl bg-[#4c2885] p-6 shadow-lg md:flex-row"><div class="flex flex-shrink-0 justify-center"><img :src="user.avatar_url" :alt="user.name" class="h-36 w-36 rounded-full border-[10px] border-[#2a2a72]" /></div><div class="mt-4 ml-0 flex-grow md:mt-0 md:ml-8"><h2 class="mb-2 text-2xl font-bold">{{ user.name || user.login }}</h2><p v-if="user.bio" class="mb-4">{{ user.bio }}</p><ul class="mb-4 flex max-w-md justify-between text-sm"><li>{{ user.followers }}<strong class="ml-1">Followers</strong></li><li>{{ user.following }}<strong class="ml-1">Following</strong></li><li>{{ user.public_repos }}<strong class="ml-1">Repos</strong></li></ul><div class="flex flex-wrap gap-2"><a v-for="repo in repos.slice(0, 5)" :key="repo.id" :href="repo.html_url" target="_blank"class="inline-block rounded bg-[#212a72] px-2 py-1 text-xs text-white">{{ repo.name }}</a></div></div></div></div>
</template>

脚本逻辑 <script setup>

<script setup>
import { ref } from 'vue'const API_URL = 'https://api.github.com/users/'const username = ref('')
const user = ref(null)
const repos = ref([])
const error = ref('')const getUser = async (name) => {try {error.value = ''const res = await fetch(API_URL + name)if (!res.ok) {throw new Error('Not Found')}user.value = await res.json()console.log(user.value)await getRepos(name)} catch (err) {error.value = 'No profile with this username'user.value = nullrepos.value = []}
}const getRepos = async (name) => {try {const res = await fetch(`${API_URL}${name}/repos?sort=created`)if (!res.ok) {throw new Error('Repo Fetch Failed')}repos.value = await res.json()} catch (err) {error.value = 'Problem fetching repos'}
}const handleSubmit = () => {const trimmed = username.value.trim()if (trimmed) {getUser(trimmed)username.value = ''}
}
</script>

样式部分 <style scoped>

<style scoped>
@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@200;400&display=swap');
:root {font-family: 'Poppins', sans-serif;
}
</style>

🔍 重点效果实现

✅ 用户信息获取

通过 fetch() 请求 Github API 获取用户信息:

const res = await fetch(API_URL + name)

如果用户不存在,抛出错误并设置提示信息。

💡 获取用户仓库

使用 repos 接口获取用户公开仓库:

const res = await fetch(`${API_URL}${name}/repos?sort=created`)

并在页面上展示前 5 个仓库。

🎮 表单提交处理

使用 @submit.prevent 阻止默认提交行为并触发请求:

<form @submit.prevent="handleSubmit">

输入框使用 v-model 双向绑定用户名:

<input v-model="username" type="text" />

🎨 动态条件渲染

根据状态显示不同的内容:

<div v-if="error">...</div>
<div v-else-if="user">...</div>

🎨 TailwindCSS 样式重点讲解

类名作用
flex min-h-screen flex-col items-center justify-center全屏居中布局
bg-[#2a2a72], text-white设置主题颜色
rounded-lg, shadow-lg输入框与卡片阴影样式
border-[10px] border-[#2a2a72]头像边框样式
flex-wrap gap-2仓库标签自动换行与间距
text-xs, rounded, bg-[#212a72]仓库标签样式
max-w-3xl, md:flex-row响应式布局控制

这些 TailwindCSS 类帮助我们快速构建了一个美观、响应式的用户信息展示组件。


📁 常量定义 + 组件路由

constants/index.js 添加组件预览常量:

{id: 28,title: 'Github Profiles',image: 'https://50projects50days.com/img/projects-img/28-github-profiles.png',link: 'GithubProfiles',},

router/index.js 中添加路由选项:

{path: '/GithubProfiles',name: 'GithubProfiles',component: () => import('@/projects/GithubProfiles.vue'),},

🏁 总结

基于 Vue 3 和 TailwindCSS 的 Github 用户信息展示组件不仅实现了基本的用户搜索功能,还展示了如何使用 Vue 的响应式能力、异步请求和条件渲染构建一个完整的功能页面。

你可以进一步扩展此组件的功能包括:

  • ✅ 添加加载动画(如请求时显示 spinner)
  • ✅ 支持分页展示仓库
  • ✅ 添加本地缓存(如使用 localStorage)
  • ✅ 支持主题切换(暗色/亮色)
  • ✅ 将组件封装为 <GithubUserCard /> 可复用组件

👉 下一篇,我们将完成Double Click Heart组件,双击点赞的设计。🚀

感谢阅读,欢迎点赞、收藏和分享 😊

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

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

相关文章

simscape中坐标系和坐标变换Frames and Transforms

为了更便捷地描述单个物体的运动&#xff0c;最好以该物体的质心为坐标原点建立坐标系&#xff0c;从而可以非常方便地描述其旋转运动。因此&#xff0c;在计算多个物体之间的位置关系时&#xff0c;为了计算方便&#xff0c;需要频繁地更换坐标框架&#xff0c;这也是multibod…

构建分布式光伏“四可”能力:支撑新型电力系统安全稳定运行的关键路径

随着我国新能源装机规模的跨越式增长&#xff0c;国家能源战略对新能源电站的规范化接入与精细化调度管理提出了更高要求。在电力市场化改革深化与新型电力系统构建的关键时期&#xff0c;保障电网安全稳定、提升新能源高效消纳能力已成为核心议题。国家能源局于2025年1月17日正…

UART寄存器介绍

在 STM32 微控制器中&#xff0c;UART&#xff08;通用异步收发传输器&#xff09;通信通过多个寄存器实现配置和数据传输。下面详细解析 UART 的核心寄存器及其功能。1. 状态寄存器&#xff08;USART_SR&#xff09;状态寄存器反映 UART 当前的工作状态&#xff0c;用于判断数…

写一个算法对一组值进行归一化映射,使它们在视觉上有明显的区分度,尤其在数据集分布不均时仍能体现差异

问题&#xff1a; 有一批数据&#xff0c;都是随机值范围是不确定&#xff0c;我需要用这个值来绘制同样数量圆&#xff0c;不同值他们的圆半径不同&#xff0c;考虑到数据有时候大小偏差不大&#xff0c;这1000个值有可能是集中在10,20之间&#xff0c;也可能是分布广泛&#…

具身智能零碎知识点(五):VAE中对使用KL散度的理解

VAE中对使用KL散度的理解什么是 VAE (Variational AutoEncoder)&#xff1f;从自编码器 (AE) 说起VAE&#xff1a;让潜在空间变得“有意义”和“连续”KL 散度是如何用到的&#xff1f;通俗理解 KL 散度在 VAE 中的作用&#xff1a;带来的好处&#xff1a;KL 散度公式 (无需背诵…

理解:进程、线程、协程

线程、进程和协程是并发编程的重要组成部分。进程&#xff08;Process&#xff09;定义进程是操作系统分配资源的基本单位&#xff0c;表示一个正在执行的程序。一旦一个程序被加载到内存中&#xff0c;它就成为一个进程&#xff0c;而每个进程都有其独立的内存空间。特征进程之…

总结一下找素数的三种方法

目录 一试除法 二埃氏筛 三线性筛(欧拉筛) 一试除法 思想&#xff1a;就是判断某个数x是不是素数,就判断从2开始到小于根号x的范围内有没有能够取余不等于0的,这个说明当前值就是x的一个因子&#xff0c;所以不是素数。 代码&#xff1a; import java.util.Scanner;public…

基于Yolov8车辆检测及图像处理系统【有代码】

0 引言 随着城市化进程的加速和机动车保有量的快速增长,交通管理、智能监控和自动驾驶等领域对车辆目标检测技术的需求日益增长。车辆目标检测是计算机视觉领域的一个重要研究方向,其目标是从图像或视频序列中准确识别和定位车辆,为后续的车辆跟踪、行为分析和交通流量统计…

MySQL密码管理器“mysql_config_editor“

目录 核心能力 常用命令速查 为什么更安全&#xff1f; 典型场景 mysql_config_editor 是 MySQL 官方自带的一款命令行小工具&#xff0c;作用一句话&#xff1a;把账号、密码、主机、端口等连接信息加密存起来&#xff0c;下次连接时只敲一个名字即可&#xff0c;不用再写…

Kubernetes高级调度01

目录 第一章&#xff1a;初始化容器&#xff08;InitContainer&#xff09;—— 应用启动前的 “准备军” 1.1 InitContainer 的基本概念与核心特性 1.2 InitContainer 与普通容器的关键区别 1.3 InitContainer 的实战场景与示例解析 1.3.1 示例 1&#xff1a;延迟启动 —…

LSV负载均衡

什么是访问压力&#xff1f;--负载 两个客户同时访问一个服务器&#xff0c;会导致服务器崩溃调度---Cluster集群&#xff08;为了解决一个特定问题&#xff0c;多台服务器组合使用形成的一个系统&#xff09;LSV 1、集群Cluster LB&#xff1a;负载均衡&#xff0c;有多个主机…

复习笔记 38

绪论 其实没有一种安稳快乐&#xff0c;永远也不差 专题 2 知识点 继续学数学强化吧&#xff1f;可以。还有概率论要学。还有高数后半部分的数一专项要学。还有政治要学。要学的内容确实还是挺多的啊。加油。下载了一个阅读的软件&#xff0c;可以做一做真题的阅读理解。政治英…

GaussDB like 的用法

1 like 作用在 where 子句中使用 like 运算符来搜索列中的指定模式。 有两个通配符与 like 运算符一起使用&#xff1a;&#xff05; - 百分号表示零个&#xff0c;一个或多个字符 _ - 下划线表示单个字符注&#xff1a;也同时支持正则表达式。2 like 语法select column1, colu…

单例模式:确保全局唯一实例

单例模式确保一个类只有一个实例&#xff0c;并提供全局访问点。适用于需要全局唯一对象的场景&#xff08;如配置管理器、数据库连接池&#xff09;。代码示例&#xff1a;import java.util.stream.IntStream;public class ConfigManager {public static void main(String[] a…

深入理解 QSettings:Qt 中的应用程序配置管理

在开发 Qt 应用程序时&#xff0c;管理应用程序的配置信息是一个常见的需求。无论是保存用户的偏好设置、窗口大小&#xff0c;还是应用程序的运行时配置&#xff0c;都需要一种高效且灵活的方式来存储和检索这些信息。Qt 提供了一个强大的工具——QSettings&#xff0c;它能够…

基于SpringBoot+Vue的体育馆预约管理系统(支付宝沙盒支付、腾讯地图API、协同过滤算法、可视化配置、可视化预约)

“ &#x1f388;系统亮点&#xff1a;支付宝沙盒支付、腾讯地图API、协同过滤算法、可视化配置、可视化预约”01系统开发工具与环境搭建—前后端分离架构 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk17前端&#xff1a; 技术&#xff1a;框架Vue.js&am…

<script>标签对HTML文件解析过程的影响以及async和defer属性的应用

在前端开发中&#xff0c;<script> 标签的 async 和 defer 属性会显著影响 JavaScript 脚本的加载和执行时机。下面结合示例代码&#xff0c;详细解析它们之间的区别&#xff1a; 1. 默认情况&#xff08;无 async/defer&#xff09; <script src"script.js"…

Vue.js:从 Web 到桌面的跨端实践与技术选型指南

一、Vue.js 的核心能力边界 作为渐进式 JavaScript 框架,Vue.js 的核心价值在于构建现代 Web 用户界面: ✅ 前端核心场景:单页应用(SPA)、动态交互界面、可复用组件开发 ❌ 架构限制:无法直接改造 B/S(浏览器/服务器)为 C/S(客户端/服务器)架构 关键差异:B/S 依赖浏…

SSRF11 各种限制绕过之DNS rebinding 绕过内网 ip 限制

ssrf漏洞在厂商的处理下可能进行一些特殊处理导致我们无法直接利用漏洞 有以下四种&#xff1a; 1.ip地址限制绕过 2.域名限制绕过 3.30x跳转绕过域名限制 4.DNS rebinding绕过内网ip限制 本章我们讲DNS rebinding 绕过内网 ip 限制 DNS rebinding 绕过内网 ip 限制 假…

FreeRTOS之链表操作相关接口

FreeRTOS之链表操作相关接口1 FreeRTOS源码下载地址2 任务控制块TCB2.1 任务控制块TCB2.1.1 任务控制块的关键成员2.1.2 TCB 的核心作用2.2 ListItem_t2.3 List_t3 函数接口3.1 vListInitialise3.2 vListInitialiseItem1 FreeRTOS源码下载地址 https://www.freertos.org/ 2 …