Skip to content

Commit e46d5dd

Browse files
committed
feat: fix carouse
1 parent af8f741 commit e46d5dd

2 files changed

Lines changed: 122 additions & 1 deletion

File tree

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
import React, { useState, useEffect } from 'react'
2+
import { Select, Button } from 'antd'
3+
import { ChevronRight, ChevronLeft } from 'lucide-react'
4+
5+
const mockData = Array.from({ length: 30 }, (_, i) => ({
6+
name: `Item ${i + 1}`,
7+
category: ['A', 'B', 'C'][i % 3],
8+
}))
9+
10+
const FixCarousel = ({ tradeList = [] }) => {
11+
const [data, setData] = useState([...tradeList, ...mockData])
12+
const [selectedFilter, setSelectedFilter] = useState('all')
13+
const [filteredData, setFilteredData] = useState([...tradeList, ...mockData])
14+
const [currentPage, setCurrentPage] = useState(0)
15+
const filters = [
16+
{ label: '全部', value: 'all' },
17+
{ label: '分类 A', value: 'A' },
18+
{ label: '分类 B', value: 'B' },
19+
{ label: '分类 C', value: 'C' },
20+
]
21+
22+
const filterData = () => {
23+
if (selectedFilter === 'all') {
24+
setFilteredData([...data])
25+
} else {
26+
setFilteredData(data.filter((item) => selectedFilter.includes(item.category)))
27+
}
28+
setCurrentPage(0)
29+
}
30+
31+
const handleClear = () => {
32+
setSelectedFilter('all')
33+
filterData()
34+
}
35+
36+
const itemsPerPage = 6
37+
const paginatedData = React.useMemo(() => {
38+
const pages = []
39+
for (let i = 0; i < filteredData.length; i += itemsPerPage) {
40+
pages.push(filteredData.slice(i, i + itemsPerPage))
41+
}
42+
return pages
43+
}, [filteredData])
44+
45+
const totalPages = Math.ceil(filteredData.length / itemsPerPage)
46+
47+
const prevPage = () => setCurrentPage(Math.max(0, currentPage - 1))
48+
const nextPage = () => setCurrentPage(Math.min(totalPages - 1, currentPage + 1))
49+
const goToPage = (index) => setCurrentPage(index)
50+
51+
useEffect(() => {
52+
filterData()
53+
}, [selectedFilter, data])
54+
55+
return (
56+
<div className="relative mx-auto w-full max-w-6xl">
57+
<div className="mb-4 flex justify-end">
58+
<Select
59+
value={selectedFilter}
60+
onChange={setSelectedFilter}
61+
className="w-[240px]"
62+
placeholder="请选择分类"
63+
options={filters}
64+
/>
65+
</div>
66+
<div className="relative flex items-center justify-between">
67+
<Button className="cursor-pointer rounded-full" onClick={prevPage} disabled={currentPage === 0} shape="circle">
68+
<ChevronLeft />
69+
</Button>
70+
<div className="relative mx-4 flex-grow overflow-hidden">
71+
<div
72+
className="flex transition-transform duration-300 ease-in-out"
73+
style={{ transform: `translateX(-${currentPage * 100}%)` }}
74+
>
75+
{paginatedData.length === 0 ? (
76+
<div className="w-full text-center text-gray-500">暂无数据</div>
77+
) : (
78+
<>
79+
{paginatedData.map((page, pageIndex) => (
80+
<div key={pageIndex} className="flex min-w-full flex-wrap justify-center">
81+
{page.map((item, itemIndex) => (
82+
<div key={itemIndex} className="w-1/3 p-2">
83+
<div className="cus-bg mx-auto rounded-md border border-sky-500 p-4 text-center shadow-md">
84+
<div className="mb-2 text-xl text-sky-500">{item.name}</div>
85+
<div className="text-gray-500">{item.category}</div>
86+
</div>
87+
</div>
88+
))}
89+
</div>
90+
))}
91+
</>
92+
)}
93+
</div>
94+
</div>
95+
<Button
96+
className="cursor-pointer rounded-full"
97+
onClick={nextPage}
98+
goToPage
99+
disabled={currentPage === totalPages - 1 || data.length === 0}
100+
shape="circle"
101+
>
102+
<ChevronRight />
103+
</Button>
104+
</div>
105+
<div className="mt-4 flex justify-center gap-4 space-x-4">
106+
{Array.from({ length: totalPages }).map((_, index) => (
107+
<button
108+
key={index}
109+
className={`h-2 w-2 rounded-full ring ring-blue-600/80 transition-colors duration-300 hover:bg-blue-600/80 ${
110+
currentPage === index ? 'bg-blue-600/80' : 'bg-white'
111+
}`}
112+
onClick={() => index}
113+
></button>
114+
))}
115+
</div>
116+
</div>
117+
)
118+
}
119+
120+
export default FixCarousel

src/pages/demo/index.jsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import { Command, Cannabis, Beer, Mail } from 'lucide-react'
1919
import ScriptView from '@stateless/ScriptView'
2020
import AnimatedList from '@stateless/AnimatedList'
2121
import { DraggableList, DraggableItem } from '@stateless/DraggableList'
22-
22+
import FixCarousel from '@stateless/FixCarouse'
2323
import styles from './index.module.less'
2424

2525
const companies = [SpringPng, HePng, SongPng, XuePng]
@@ -118,6 +118,7 @@ const ProDemo = () => {
118118

119119
return (
120120
<FixTabPanel>
121+
<FixCarousel />
121122
{/* <OrbitingCirclesDemo /> */}
122123
{/* <ScriptView showMultiplePackageOptions={true} codeLanguage="shell" commandMap={customCommandMap} /> */}
123124
{/* <section style={{ height: 240, overflow: 'hidden', margin: 20 }}>

0 commit comments

Comments
 (0)