50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Dad Jokes(冷笑话卡片)
📅 我们继续 50 个小项目挑战!—— DadJokes
组件
-
仓库地址:https://github.com/SunACong/50-vue-projects
-
项目预览地址:https://50-vue-projects.vercel.app/
豆包翻译确实可以,冷笑话应该属于各类语言比较难理解的风格,这里豆包自动解析出了其中的含义。确实不错!!!
😂 组件目标
构建一个轻量有趣的“Dad Jokes”组件,点击按钮即可获取一个随机冷笑话,用于放松心情、提升用户体验,也适合嵌入仪表盘或侧边栏作为互动装饰组件。
🛠️ 技术实现点
- 使用 Vue3 的
<script setup>
写法,逻辑清晰简洁。 - 使用
fetch
请求公开 API(https://icanhazdadjoke.com)。 - 使用 TailwindCSS 快速搭建居中卡片样式,提升视觉层次感。
- 使用响应式变量
ref
和基础的异步请求逻辑。
🧱 组件实现
<template><div class="flex h-screen items-center justify-center"><div class="flex w-xl flex-col items-center justify-center gap-20 rounded-2xl bg-white p-8"><h3 class="text-xl font-bold text-gray-600">Don't Laugh Challenge</h3><div id="joke" class="text-2xl">{{ joke }}</div><button class="btn bg-blue-500 hover:bg-blue-300" @click="getJoke">Get Another Joke</button></div></div>
</template>
🤖 API 说明
<script setup>
import { ref } from 'vue'const joke = ref('')async function getJoke() {const config = {headers: {Accept: 'application/json',},}try {const response = await fetch('https://icanhazdadjoke.com', config)const data = await response.json()joke.value = data.joke} catch (error) {console.error('Error fetching joke:', error)joke.value = 'Failed to load joke. Try again!'}
}// 初始化时获取第一个笑话
getJoke()
</script>
-
https://icanhazdadjoke.com
- 免费公开的 dad joke API。
- 通过设置 Accept: application/json 头即可返回 JSON 格式。
💡 用户交互亮点
- 初次进入页面即展示一个冷笑话,避免“空白页面”冷场。
- 每次点击按钮即可刷新笑话,交互直接。
- 响应式变量自动更新视图,无需刷新页面。
🎨 TailwindCSS 样式重点
类名 | 说明 |
---|---|
flex items-center justify-center | 实现页面居中对齐 |
w-xl p-8 rounded-2xl bg-white | 卡片容器样式,居中圆角白底 |
text-xl font-bold text-gray-600 | 标题样式 |
text-2xl | 笑话正文文字 |
bg-blue-500 hover:bg-blue-300 | 按钮颜色及悬停状态 |
🧾 常量定义 + 组件路由建议
constants/index.js
添加组件预览常量:
export const projectList = [
{id: 10,title: 'Dad Jokes',image: 'https://50projects50days.com/img/projects-img/10-dad-jokes.png',link: 'DadJokes',},
]
router/index.js
中添加路由选项:
{path: '/DadJokes',name: 'DadJokes',component: () => import('@/projects/DadJokes.vue'),},
🧾总结
此组件非常适合嵌入到:
- 🎯 仪表盘(Dashboard):增加轻松氛围
- 🧩 首页右栏 / 抽屉组件:作为彩蛋趣味功能
- 👨💻 项目加载页:等待时读笑话减压
👉 下一篇,我们将完成 EventKeyCodes
组件,一个可以显示用户按下的键盘按键信息!🚀
相关文章:

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Dad Jokes(冷笑话卡片)
📅 我们继续 50 个小项目挑战!—— DadJokes 组件 仓库地址:https://github.com/SunACong/50-vue-projects 项目预览地址:https://50-vue-projects.vercel.app/ 豆包翻译确实可以,冷笑话应该属于各类语言比较难理解的…...

Spring AOP执行原理源码解析
对【com.example.demo.TestAspect#aopTest】连接点增加了五个通知 在调用【com.example.demo.A#testAop()】(用户自定义)方法时,Cglib拦截器对其进行了拦截 可以看到执行顺序分别是环绕前置,前置,环绕后置,…...

基于FPGA的超声波显示水位距离,通过蓝牙传输水位数据到手机,同时支持RAM存储水位数据,读取数据。
基于FPGA的超声波显示水位距离 前言一、整体框架二、代码架构1.超声波测距模块2.蓝牙数据发送模块3.数码管数据切换模块4.数码管驱动模块6.串口驱动7.顶层模块8.RAM ip核 仿真相关截图 前言 随着工业化进程的加速和环境保护意识的提升,对水资源管理和水位监测的需求…...
使用swoole作为MQTT客户端并接收实现即时消息推送
环境准备 首先需要安装swoole 可以使用pecl进行安装 ,如 pecl install swool, 注意加上版本号 或者使用构建好的docker镜像,这里使用构建好的 zacksleo/php:7.1-alpine-fpm-swoole 镜像 使用 compose 安装依赖库 composer require jesusslim/mqttcl…...

在Windows下利用LoongArch-toolchain交叉编译Qt
文章目录 0.交叉编译的必要性1.下载交叉编译工具链1.1.直接在Windows下使用mingw(不使用虚拟机)编译(还没成功,无法编译)1.2.在虚拟机中的Ubuntu中进行交叉编译 2.下载qt源码3.编译Qt3.1.创建loongarch64的mkspec3.2.创…...
如何在 React 中监听 div 的滚动事件
在 React 中监听 div 的滚动事件(scroll),可以通过为该 div 添加 onScroll 属性来实现。以下是一个基本的例子: ✅ 示例:监听 div 的滚动事件 import React, { useRef } from react;function ScrollComponent() {cons…...

AIRIOT无人机安防解决方案
随着无人机技术的飞速发展和广泛应用,其在安防领域的价值日益凸显,从关键设施巡检、大型活动安保到边境巡防、应急救援,无人机正成为立体化安防体系不可或缺的“空中哨兵”。然而,无人机安防应用蓬勃发展的同时,其自身…...

华为OD机考 - 水仙花数 Ⅰ(2025B卷 100分)
import java.util.*; public static Integer get(int count,int c){if(count<3||count>7){return -1;}//存储每位数的最高位……最低位int[] arr new int[count];List<Integer> res new ArrayList<>();for(int i(int) Math.pow(10,count-1);i<(int) Math…...
软考 系统架构设计师系列知识点之杂项集萃(81)
接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(80) 第145题 商业智能是企业对商业数据的搜集、管理和分析的系统过程,主要技术包括()。 A. 数据仓库、联机分析和数据挖掘 B. 数据采集、数据清洗…...

php apache构建 Web 服务器
虚拟机配置流程winsever2016配置Apache、Mysql、php_windows server 2016配置web服务器-CSDN博客 PHP 和 Apache 通过 模块化协作 共同构建 Web 服务器,以下是它们的交互机制和工作流程: 一、核心组件分工 组件角色ApacheWeb …...
Ntfs!ReadIndexBuffer函数分析之nt!CcGetVirtualAddress函数之nt!CcGetVacbMiss
第一部分: NtfsMapStream( IrpContext, Scb, LlBytesFromIndexBlocks( IndexBlock, Scb->ScbType.Index.IndexBlockByteShift ), Scb->ScbType.Index.BytesPerIndexBuffer, &am…...
Vue3 + TypeSrcipt 防抖、防止重复点击实例
需要实现防抖应用场景: 点击【查询】按钮,发送网络请求,等待并接收响应数据 原来点击【查询】的代码: <script setup lang"ts" name"ReagentTransactionsDrawer"> ...... // 查询,没有防…...
SQL进阶之旅 Day 14:数据透视与行列转换技巧
【SQL进阶之旅 Day 14】数据透视与行列转换技巧 开篇 欢迎来到“SQL进阶之旅”系列的第14天!今天我们将探讨数据透视与行列转换技巧,这是数据分析和报表生成中的核心技能。无论你是数据库开发工程师、数据分析师还是后端开发人员,行转列或列…...

打通印染车间“神经末梢”:DeviceNet转Ethernet/IP连接机器人的高效方案
在印染行业自动化升级中,设备联网需求迫切。老旧印染设备多采用Devicenet协议,而新型工业机器人普遍支持Ethernet/IP协议,协议不兼容导致数据交互困难,设备协同效率低、生产监控滞后,成了行业数字化转型的阻碍。本文将…...
Ubuntu挂载本地镜像源(像CentOS 一样挂载本地镜像源)
1.挂载 ISO 镜像 sudo mount -o loop /ubuntu-22.04.5-desktop-amd64.iso /mnt/iso 2.备份现有的软件源配置文件: sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 3.编辑软件源配置文件 编辑 /etc/apt/sources.list sudo nano /etc/apt/sources.l…...

2025-06-02-IP 地址规划及案例分析
IP 地址规划及案例分析 参考资料 Plan for IP addressing - Cloud Adoption Frameworkwww.cnblogs.comimage-hosting/articles at master jonsam-ng/image-hosting 概述 在网络通信中,MAC 地址与 IP 地址分别位于 OSI 模型的数据链路层和网络层,二者协…...

AUTOSAR实战教程--开放式通用DoIP刷写工具OpenOTA开发计划
目录 软件概述 安装与运行 界面说明 3.1 功能区划分 3.2 状态显示 基本操作流程 4.1 DoIP连接配置 4.2 服务配置(刷写流程) 4.3 执行操作 4.4 保存配置 4.5 加载配置 功能详解 5.1 核心功能模块 诊断服务配置 通信设置 文件下载 工具功…...
Vue 学习路线图(从零到实战)
🎯 学习目标:掌握 Vue 并能独立开发中大型项目 ✅ 适合人群:前端初学者、想快速上手做项目的开发者、中小型团队成员 🧭 Vue 学习路线图(从零到实战) 第一阶段:基础语法 核心功能(…...

AI赋能的浏览器自动化:Playwright MCP安装配置与实操案例
以下是对Playwright MCP的简单介绍: Playwright MCP 是一个基于 Playwright 的 MCP 工具,提供浏览器自动化功能不要求视觉模型支持,普通的文本大语言模型就可以通过结构化数据与网页交互支持多种浏览器操作,包括截图、点击、拖动…...
AI编程助手入门指南:GitHub Copilot、Cursor与Claude的安装与基础使用
🔥 AI编程助手入门指南:GitHub Copilot、Cursor与Claude的安装与基础使用 你是否曾幻想过拥有一个24小时在线的编程搭档?它能理解你的思路、自动补全代码、解释复杂逻辑,甚至帮你调试错误?如今,这个幻想已成…...
Android 线性布局中常见的冲突属性总结
1. gravity vs layout_gravity 冲突原因:两者作用对象不同,混用会导致行为异常。 区别: android:gravity:父容器的属性,控制子元素在容器内的对齐方式。android:layout_gravity:子元素的属性,控…...

【技术笔记】MSYS2 指定 Python 版本安装方案
#工作记录 MSYS2 指定 Python 版本安装 一、前置条件 安装指定版本需要在干净的 MSYS2 环境中执行,为保证工具链的兼容性,若已安装 Python,需先卸载 Python 及与该版本深度绑定的工具链。具体操作如下: 卸载 Python:…...

《校园生活平台从 0 到 1 的搭建》第一篇:创建项目与构建目录结构
在本系列第一篇中,我们将从项目初始化开始,搭建基本的目录结构,并完成四个主页面的创建与 TabBar 设置。 (tip:你可能会觉得有点 ai 化,因为这个文案是我自己写了一遍文案之后让 ai 去优化输出的࿰…...
Boost ASIO 库深入学习(3)
Boost ASIO 库深入学习(3) UDP简单通信导论 在继续深入前,我们不妨也来点碎碎念,因为UDP通信协议的模型与TCP是不同的,这种差异正是理解“无连接通信”的关键所在。我们下面要构建的,是一个经典的UDP通信…...
【如何做好应用架构?】
一、应用架构定义 应用架构描述了各种用于支持业务架构并对数据架构所定义的各种数据进行出来的应用功能。这些应该功能指的是用来管理在数据架构中定义的数据,并对业务架构中定义的各项业务功能进行支持的能力。 其核心目标是确保应用系统高效、灵活、安全的支撑…...

1 Studying《蓝牙核心规范5.3》
目录 [Vol 0][Part B 蓝牙规范要求] 3 定义 3.1 蓝牙产品类型 4 核心配置 4.1 基本速率核心配置 4.2 增强型数据速率核心配置 4.4 低功耗核心配置 4.5 基本速率和低功耗结合的核心配置 4.6 主机控制器接口核心配置 [Vol 1][Part A 架构]1 概述 1.1 BR/EDR操作概述 …...

STM32+MPU6050传感器
#创作灵感## 在嵌入式系统开发中,STM32F103C8T6单片机与MPU6050传感器的组合因其高性能、低功耗以及丰富的功能而备受青睐。本文将简单介绍如何在Keil 5开发环境中实现STM32F103C8T6与MPU6050的连接和基本数据采集,带你快速入门智能硬件开发。 一、硬件…...
el-input限制输入数字,输入中文后数字校验失效
想要的效果:默认值为0,只能输入0-100的数字。 实现方式如下,使用 οnkeyup"this.valuethis.value.replace(/\D/g,‘’)"限制只能输入数字,输入数字没有问题,使用input实现数字不以0开头,也只能是…...

26考研——数据的表示和运算_整数和实数的表示(2)
408答疑 文章目录 二、整数和实数的表示1、整数的表示1.1、无符号整数的表示1.2、有符号整数的表示1.3、C 语言中的整数类型及类型转换1.3.1、C 语言中的整型数据类型1.3.2、有符号数和无符号数的转换1.3.3、不同字长整数之间的转换 2、实数的表示2.1、浮点数的相关概念2.2、浮…...
用 Lazarus IDE 写一个邮件客户端软件,能收发邮件,编写邮件
下面是一个使用Lazarus IDE开发的基本邮件客户端实现方案,包含收发邮件和编写邮件的核心功能。我们将使用Synapse库(跨平台的网络通信库)来处理邮件协议。 步骤1:安装依赖 安装Synapse库: 下载地址:https:…...