Ant Design Card 组件展示图片

文章目录

  • Ant Design Card 组件展示图片
    • 理解card组件结构
      • 隐藏卡片内容区域
    • 下拉时加载图片卡片
      • 加载更多
      • 代码
    • 分页的方式加载图片列表【推荐】
      • 实现思路
      • 代码demo
      • 缩略图
      • 在card组件下发显示图片文件名
      • 卡片操作
    • 分页

Ant Design Card 组件展示图片

官方文档:
Card卡片组件 https://4x.ant.design/components/card-cn/#Card
ProCard高级卡片 https://procomponents.ant.design/components/card

Card卡片
通用卡片容器。

何时使用#
最基础的卡片容器,可承载文字、列表、图片、段落,常用于后台概览页面。

理解card组件结构

在这里插入图片描述如上图,Card组件分成如上组成部分,

  1. header这部分 是,title属性来配置
  2. 卡片封面 是sove属性来配置
  3. 卡片内容区域 Card.Meta 来配置
  4. 卡片动作部分,是action属性来配置

隐藏卡片内容区域

我们使用一个名为 custom-card 的类名来设置卡片容器的样式,并通过 bodyStyle 属性将内容区域的样式设置为 display: none,完全隐藏内容区域。

在这里插入图片描述

下拉时加载图片卡片

需求是展示支持分页的图片,并且希望在下拉时加载新的图片卡片,可以使用 Ant Design 的 List 组件和滚动事件来实现。

容器的高度自适应,并且卡片在宽度不足时自动换行显示,可以使用 CSS 中的 Flexbox 布局来实现

  return (<div style={{ display: 'flex', flexWrap: 'wrap' }} onScroll={handleScroll}><Listgrid={{ gutter: 16, column: 4 }}dataSource={data}loading={loading}loadMore={loading ? <Spin /> : undefined}renderItem={(item) => (<List.Item style={{ flexBasis: '25%' }}><Card cover={<img alt="Example Image" src={item} />} /></List.Item>)}/></div>);

我们将容器的样式设置为 display: ‘flex’,并使用 flexWrap: ‘wrap’ 让卡片在宽度不足时自动换行显示。

将卡片项的样式设置为 flexBasis: ‘20%’,这样每个卡片项将占据容器宽度的 20%。通过将 column 属性设置为 5,我们让 List 组件一行显示 5 个卡片。

加载更多

将List组件的 loadMore 属性的值设置为一个函数,用于触发加载更多数据的操作。

在这里插入图片描述
将 handleLoadMore 定义为一个函数,用于触发加载更多数据的操作。如果正在加载中,将 handleLoadMore 设置为空函数;否则,将其设置为 fetchData 函数,以触发加载更多数据。

通过这个修改,当滚动到底部时,将触发加载更多数据的操作,并通过模拟异步加载数据的方式展示加载更多的效果。

代码

import { List, Card, Spin } from 'antd';
import { useEffect, useState } from 'react';const ImageList: React.FC = () => {const [loading, setLoading] = useState(false);const [data, setData] = useState<string[]>([]);const fetchData = () => {setLoading(true);// 模拟异步加载数据setTimeout(() => {const newData = Array.from({ length: 10 }, (_, index) => `https://via.placeholder.com/300?text=Image${index + 1}`);setData((prevData) => [...prevData, ...newData]);setLoading(false);}, 1000);};useEffect(() => {fetchData();}, []);const handleScroll = (e: React.UIEvent<HTMLDivElement>) => {const { scrollTop, clientHeight, scrollHeight } = e.currentTarget;const isAtBottom = scrollTop + clientHeight === scrollHeight;if (isAtBottom && !loading) {fetchData();}};const handleLoadMore = loading ? () => {} : null;return (<div style={{ display: 'flex', flexWrap: 'wrap' }} onScroll={handleScroll}><Listgrid={{ gutter: 16, column: 5 }}dataSource={data}loading={loading}loadMore={handleLoadMore}renderItem={(item) => (<List.Item style={{ flexBasis: '20%' }}><Card cover={<img alt="Example Image" src={item} />} /></List.Item>)}/></div>);
};export default ImageList;

分页的方式加载图片列表【推荐】

使用分页的方式可以更加可控地展示数据,并提供更好的用户体验。通过显示当前页数、总页数以及提供页码切换的功能,用户可以清楚地知道当前所处的页面位置,并且可以自由地在不同页面之间进行切换。

实现思路

我更喜欢使用分页而不是加载更多的方式来展示数据,您可以结合 Ant Design 的 Pagination 组件来实现分页效果

代码demo

import { List, Card, Pagination } from 'antd';
import { useEffect, useState } from 'react';const ImageList: React.FC = () => {const [loading, setLoading] = useState(false);const [data, setData] = useState<string[]>([]);const [page, setPage] = useState(1);const pageSize = 12; // 每页显示的图片数量const fetchData = () => {setLoading(true);// 模拟异步加载数据setTimeout(() => {const newData = Array.from({ length: pageSize }, (_, index) => `https://via.placeholder.com/300?text=Image${(page - 1) * pageSize + index + 1}`);setData(newData);setLoading(false);}, 1000);};useEffect(() => {fetchData();}, [page]);const handlePageChange = (pageNumber: number) => {setPage(pageNumber);};return (<div><Listgrid={{ gutter: 16, column: 4 }}dataSource={data}loading={loading}renderItem={(item) => (<List.Item><Card cover={<img alt="Example Image" src={item} />} /></List.Item>)}/><Pagination current={page} pageSize={pageSize} total={100} onChange={handlePageChange} /></div>);
};export default ImageList;

缩略图

import { List, Card, Pagination } from 'antd';
import axios from 'axios';
import { useEffect, useState } from 'react';const ImageList: React.FC = () => {const [loading, setLoading] = useState(false);const [data, setData] = useState<string[]>([]);const [page, setPage] = useState(1);const pageSize = 12; // 每页显示的图片数量const fetchData = async () => {setLoading(true);try {let token = localStorage.getItem('token');if (null === token) {token = '';}const response = await axios.get('/api/v1/imageManage/listThumbImages', {params: {page: page,pageSize: pageSize,},headers: {Authorization: `Bearer ${token}`,  // 替换为您的 Bearer Token},});console.log("listThumbImages  response data: ", response.data)//前端只通过 Base64 字符串无法确定图片的格式。Base64 只是一种表示图像数据的编码方式,并不能直接指示图像的格式。//在前端展示 Base64 图片时,通常需要提供图像的 MIME 类型来指示图像的格式。MIME 类型是一种标识数据类型的字符串,例如 "image/jpeg" 表示 JPEG 图像,"image/png" 表示 PNG 图像。// 将图像的 MIME 类型一并返回,这样前端就能够根据提供的 MIME 类型来正确解析和显示图像//根据文件名组装图像的 MIME 类型const updatedData = response.data.map(item => {const fileExtension = item.FileName.split('.').pop().toLowerCase();let imageFormat = "image/jpeg"; // 默认格式为 JPEGif (fileExtension === "png") {imageFormat = "image/png";} else if (fileExtension === "gif") {imageFormat = "image/gif";}return {...item,ImageFormat: imageFormat,};});setData(updatedData);setLoading(false);} catch (error) {console.error('Error fetching thumbnails:', error);setLoading(false);}};useEffect(() => {fetchData();}, [page]);const handlePageChange = (pageNumber: number) => {setPage(pageNumber);};return (<div><Listgrid={{ gutter: 16, column: 6 }}dataSource={data}loading={loading}renderItem={(item: any) => (<List.Item><Cardcover={item.ThumbnailBase64 ? (<img alt="Example Image" src={`data:${item.ImageFormat};base64,${item.ThumbnailBase64}`} />) : (<div>No Thumbnail</div>)}/></List.Item>)}/><Pagination current={page} pageSize={pageSize} total={100} onChange={handlePageChange} /></div>);
};export default ImageList;

代码细节解释:

  1. 每行显示多个?
<Listgrid={{ gutter: 16, column: 6 }}  

grid 属性设置为 { gutter: 16, column: 6 },表示创建一个具有 6 列的网格布局,并且网格项之间的间距为 16 像素。

在 List 组件中,grid 属性用于定义网格布局的样式。它接受一个对象作为参数,该对象包含两个属性:gutter 和 column。

  • gutter:用于设置网格项之间的间距。可以将其设置为一个数字来表示像素值,或者设置为一个数组 [水平间距, 垂直间距] 来分别表示水平和垂直方向上的间距。
  • column:用于设置网格的列数。可以将其设置为一个数字来表示列数,或者设置为一个数组 [列数, 列宽] 来分别表示列数和列宽。
  1. 分页?
    如下,添加 分页组件Pagination即可
    在这里插入图片描述
    为 Card 添加预览、下载和删除功能的按钮

通过以上修改,预览、下载和删除的图标会在鼠标悬停在 Card 上时放大并显示。
在上述 CSS 文件中,我们通过设置 .image-actions 类的样式来实现鼠标悬停时的显示效果,并使用 .custom-card:hover .image-actions 选择器来控制悬停时图标的显示。我们还设置了 .icon 类的样式,用于调整图标的大小和颜色。

实现鼠标悬停时图标变色的效果,你可以使用 CSS 的 :hover 伪类选择器来设置图标的样式

  .icon-wrapper {display: flex;gap: 10px;}.icon-wrapper .icon {font-size: 24px;color: #000;cursor: pointer;}.icon-wrapper .icon:hover {color: #ff0000; /* 设置图标的悬停颜色 */}

在card组件下发显示图片文件名

Meta官方说明:https://4x.ant.design/components/card-cn/#Card.Meta

要将文件名显示在卡片的底部,您可以在 Card 组件中添加一个位于底部的 Meta 组件,并将文件名作为 Meta 组件的 description 属性。

在这里插入图片描述
可以利用 Card.Meta 支持更灵活的内容

卡片操作

官方文档:https://4x.ant.design/components/card-cn/#Card
使用 actions 卡片操作组,位置在卡片底部

在这里插入图片描述

分页

分页组件用法:

<Pagination current={page} pageSize={pageSize} total={totalRecords} onChange={handlePageChange} />

分页相关变量

  const [page, setPage] = useState(1);const pageSize = 10; // 每页显示的图片数量const [totalRecords, setTotalRecords] = useState(0);

在 fetchData 函数中的成功回调中,使用 setPage 和 setTotalRecords来更新 page 和 totalRecords状态。这样就能确保在获取数据后及时更新这些状态。

获取数据后,设置分页信息变量

// 获取分页信息const pagination = responseData.pagination;console.log("获取分页信息 pagination: ",pagination)setPage(pagination.page);setTotalRecords(pagination.totalItems);

注意:在 Pagination 组件中,total 属性应该是总记录数。前端会根据 total 属性和每页显示的数量自动计算出分页的页数。这样做可以确保在数据更新或动态加载时,分页组件能够正确地显示页码和处理分页逻辑。

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

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

相关文章

二维码的颜色怎么改变?轻松3步修改二维码样式

怎么修改二维码的颜色呢&#xff1f;一般我们制作的二维码或者经过系统生成的二维码大多都是黑白颜色的&#xff0c;有些小伙伴会觉得不太美观无法满足自己的使用需求。那么对于想要修改二维码样式的小伙伴&#xff0c;可以使用二维码生成器的二维码美化功能来处理&#xff0c;…

Vue3

目录 一、 Vue3简介 1. 性能的提升 2. 源码的升级 3. 拥抱TypeScript 4. 新的特性 二、 创建Vue3工程 1. 基于 vue-cli 创建 2. 基于 vite 创建(推荐) 3. 一个简单的效果 三、Vue3核心语法 1. OptionsAPI 与 CompositionAPI &#xff08;1&#xff09;Options API …

2024春日营销三大内容趋势,种草爆文轻松get丨小红书数据分析

春季是市场迎来消费焕活的新周期&#xff0c;也是新一年品牌实现生意高速起步的必争节点。一年之“计”在于春&#xff0c;春日营销&#xff0c;吹响品牌营销第一声号角。那么&#xff0c;春日营销在小红书上有何内容趋势&#xff0c;跟着小编的脚步一起来看看~ 内容趋势 1、亲…

网页设计升阶秘籍:用Bootstrap打造响应式网站!

介绍&#xff1a;Bootstrap是一个流行的前端框架&#xff0c;它集成了HTML、CSS和JavaScript&#xff0c;旨在帮助开发者快速构建响应式和移动优先的网站。以下是Bootstrap的详细介绍&#xff1a; 响应式设计&#xff1a;Bootstrap的核心特性之一是其响应式布局系统&#xff0c…

相机图像质量研究(34)常见问题总结:图像处理对成像的影响--拖影

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

集团企业大数据应用:突破痛点,释放数据价值

在数字经济日益崛起的背景下&#xff0c;集团企业以其管理范围广泛、业务领域多元化和分支机构复杂化的特性&#xff0c;在市场竞争中扮演着重要角色。为了维持和提升这种竞争力&#xff0c;大数据应用成为了集团企业不可或缺的战略工具。然而&#xff0c;在实际应用中&#xf…

计算机网络-数据通信基础

目录 前言 一、数据通信基本概念 二、数据通信相关知识1 总结 前言 正在学习计算机网络体系&#xff0c;把每日所学的知识梳理出来&#xff0c;既能够当作读书笔记&#xff0c;又能分享出来和大家一同学习讨论。 一、数据通信基本概念 基本概念&#xff1a;信源、信道、信宿&…

wps快速生成目录及页码设置(自备)

目录 第一步目录整理 标题格式设置 插入页码&#xff08;罗马和数字&#xff09; 目录生成&#xff08;从罗马尾页开始&#xff09; ​编辑目录格式修改 第一步目录整理 1罗马标题 2罗马标题1一级标题 1.1 二级标题 1.2二级标题2一级标题 2.1 二级标题 2.2二级标题3一级标…

红队打靶练习:IMF: 1

目录 信息收集 1、arp 2、nmap 3、nikto 目录探测 gobuster dirsearch WEB 信息收集 get flag1 get flag2 get flag3 SQL注入 漏洞探测 脱库 get flag4 文件上传 反弹shell 提权 get flag5 get flag6 信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# a…

Acwing 5471. 数对推理【思维+模拟】

原题链接&#xff1a;https://www.acwing.com/problem/content/5474/ 题目描述&#xff1a; 奶牛贝茜和奶牛贝蒂各有一个整数数对。 每个数对都包含两个 1∼9 之间的不同整数。 这两个数对恰好包含一个公共数&#xff0c;即恰好有一个整数同时包含于这两个数对。 初始时&a…

MySQL有哪些优化方式

参考&#xff1a;等不及了&#xff0c;冲字节去了&#xff01;

基于SpringBoot+Vue的零食零售管理系统

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是墨韵&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c;不进则退。学习如赶路&#xff0c;不能慢一步。 目录 一、项目简介 二、开发技术与环…