🎈 perf(优化首页完成):
This commit is contained in:
@@ -14,8 +14,7 @@
|
||||
display: flex;
|
||||
box-sizing: border-box;
|
||||
.product_class_item {
|
||||
min-width: 170px;
|
||||
height: 56px;
|
||||
padding: 10px 20px;
|
||||
background: #f5f5f5;
|
||||
border-radius: 29px;
|
||||
display: flex;
|
||||
@@ -24,6 +23,8 @@
|
||||
font-size: 24px;
|
||||
color: rgba(0, 0, 0, 0.8);
|
||||
box-sizing: border-box;
|
||||
max-width: 260px;
|
||||
// @include common_ellipsis;
|
||||
&:nth-last-child(n + 1) {
|
||||
margin-right: 16px;
|
||||
}
|
||||
@@ -76,17 +77,23 @@
|
||||
flex-wrap: wrap;
|
||||
box-sizing: border-box;
|
||||
.product_class_item {
|
||||
min-width: 167px;
|
||||
height: 56px;
|
||||
background: #ecf2ff;
|
||||
border: 1px solid #3c78f4;
|
||||
padding: 10px 20px;
|
||||
background: #f5f5f5;
|
||||
border-radius: 29px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 24px;
|
||||
color: rgba(0, 0, 0, 0.8);
|
||||
margin: 0 8px 20px 8px;
|
||||
box-sizing: border-box;
|
||||
max-width: 260px;
|
||||
// @include common_ellipsis(1);
|
||||
}
|
||||
.product_class_item_selected {
|
||||
border: 1px solid #3c78f4;
|
||||
color: #3c78f4;
|
||||
margin: 0 6px 20px 6px;
|
||||
background: #ecf2ff;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,67 +6,67 @@ import { useEffect, useMemo, useState } from 'react'
|
||||
type Param = {
|
||||
open: boolean
|
||||
onOpenClick?: (val: boolean) => void
|
||||
onSelect?: (val: number) => void
|
||||
onSelect?: (id: number) => void
|
||||
list?: { name: string; id: number }[]
|
||||
defaultSelectId: number
|
||||
}
|
||||
|
||||
type ParamProduct = Omit<Param, 'open'> & {
|
||||
defaultSelectIded: number
|
||||
}
|
||||
type ParamProduct = Omit<Param, 'open'>
|
||||
|
||||
export default (option: Param) => {
|
||||
const { open = false, onOpenClick, onSelect } = option
|
||||
const [defaultSelectIded, setDefaultSelectIded] = useState(-1)
|
||||
const { open = false, onOpenClick, onSelect, list, defaultSelectId } = option
|
||||
// const [defaultSelectIded, setDefaultSelectIded] = useState(-1)
|
||||
const getSelect = (id) => {
|
||||
// setDefaultSelectIded(id)
|
||||
onSelect?.(id)
|
||||
}
|
||||
return (
|
||||
<>
|
||||
{open ? (
|
||||
<ProductClassBlock defaultSelectIded={defaultSelectIded} onSelect={onSelect} onOpenClick={(val) => onOpenClick?.(val)}></ProductClassBlock>
|
||||
<ProductClassBlock list={list} defaultSelectId={defaultSelectId} onSelect={getSelect} onOpenClick={(val) => onOpenClick?.(val)}></ProductClassBlock>
|
||||
) : (
|
||||
<ProductClassLine defaultSelectIded={defaultSelectIded} onSelect={onSelect} onOpenClick={(val) => onOpenClick?.(val)}></ProductClassLine>
|
||||
<ProductClassLine list={list} defaultSelectId={defaultSelectId} onSelect={getSelect} onOpenClick={(val) => onOpenClick?.(val)}></ProductClassLine>
|
||||
)}
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
const ProductClassLine = (option: ParamProduct) => {
|
||||
const { onOpenClick, defaultSelectIded = -1, onSelect } = option
|
||||
const { onOpenClick, defaultSelectId = -1, onSelect, list = [] } = option
|
||||
const [selectInfo, setSelectInfo] = useState({
|
||||
selected: -1, //当前选中的id
|
||||
tabId: '', //需要滚动到的id
|
||||
tabId: 0, //需要滚动到的id
|
||||
})
|
||||
|
||||
const list = useMemo(() => {
|
||||
const data = new Array(10).fill('').map((item, index) => {
|
||||
return { id: index, name: '二级分类' + index }
|
||||
})
|
||||
data.unshift({ id: -1, name: '全部' })
|
||||
return data
|
||||
}, [])
|
||||
|
||||
useEffect(() => {
|
||||
let data: { item: any; index: number } = {}
|
||||
list.filter((item, index) => {
|
||||
if (item.id == defaultSelectIded) {
|
||||
let data: { item: any; index: number } = { item: null, index: 0 }
|
||||
list?.filter((item, index) => {
|
||||
if (item.id == defaultSelectId) {
|
||||
data = { item, index }
|
||||
}
|
||||
})
|
||||
clickEvent(data)
|
||||
}, [defaultSelectIded])
|
||||
if (data.item) {
|
||||
const num = data.index > 0 ? data.index - 1 : 0
|
||||
setSelectInfo((e) => ({ ...e, tabId: list[num].id, selected: data.item.id }))
|
||||
}
|
||||
}, [defaultSelectId])
|
||||
|
||||
const clickEvent = ({ item, index }: { item: any; index: number }) => {
|
||||
const num = index > 0 ? index - 1 : 0
|
||||
setSelectInfo((e) => ({ ...e, tabId: list[num].id.toString(), selected: item.id }))
|
||||
setSelectInfo((e) => ({ ...e, tabId: list[num].id, selected: item.id }))
|
||||
onSelect?.(item.id)
|
||||
}
|
||||
|
||||
return (
|
||||
<View className={styles.product_class_main_line}>
|
||||
<ScrollView scrollX scrollWithAnimation={true} className={styles.product_class_scroll} scrollIntoView={`tabs_${selectInfo.tabId}`}>
|
||||
<View className={styles.product_class_list}>
|
||||
{list.map((item, index) => (
|
||||
{list?.map((item, index) => (
|
||||
<View
|
||||
id={`tabs_${item.id}`}
|
||||
className={classnames(styles.product_class_item, item.id == selectInfo.selected ? styles.product_class_item_selected : '')}
|
||||
onClick={() => clickEvent({ item, index })}>
|
||||
{item.name + item.id}
|
||||
{item.name}
|
||||
</View>
|
||||
))}
|
||||
</View>
|
||||
@@ -79,26 +79,26 @@ const ProductClassLine = (option: ParamProduct) => {
|
||||
}
|
||||
|
||||
const ProductClassBlock = (option: ParamProduct) => {
|
||||
const { onOpenClick } = option
|
||||
const { onOpenClick, defaultSelectId = -1, onSelect, list = [] } = option
|
||||
const [selectInfo, setSelectInfo] = useState(-1)
|
||||
const list = useMemo(() => {
|
||||
const data = new Array(10).fill('').map((item, index) => {
|
||||
return { id: index, name: '二级分类' + index }
|
||||
})
|
||||
data.unshift({ id: -1, name: '全部' })
|
||||
return data
|
||||
}, [])
|
||||
|
||||
useEffect(() => {
|
||||
setSelectInfo(defaultSelectId)
|
||||
}, [defaultSelectId])
|
||||
|
||||
const clickEvent = (item) => {
|
||||
setSelectInfo(item.id)
|
||||
onSelect?.(item.id)
|
||||
}
|
||||
return (
|
||||
<View className={styles.product_class_main_block}>
|
||||
<View className={styles.product_class_block_con}>
|
||||
<ScrollView scrollY className={styles.product_class_scroll}>
|
||||
<View className={styles.product_class_list}>
|
||||
{list.map((item, index) => (
|
||||
<View className={styles.product_class_item} onClick={() => clickEvent(item)}>
|
||||
{list?.map((item) => (
|
||||
<View
|
||||
className={classnames(styles.product_class_item, item.id == selectInfo ? styles.product_class_item_selected : '')}
|
||||
onClick={() => clickEvent(item)}>
|
||||
{item.name}
|
||||
</View>
|
||||
))}
|
||||
|
||||
@@ -32,7 +32,6 @@
|
||||
.products {
|
||||
flex: 1;
|
||||
height: 0;
|
||||
margin-top: 20px;
|
||||
.product_right_con {
|
||||
position: relative;
|
||||
.product_class {
|
||||
|
||||
@@ -28,11 +28,13 @@ export default () => {
|
||||
if (res.data?.list) {
|
||||
setKindData({ ...kindData, list: res.data.list, defaultId: res.data.list[0].id })
|
||||
setFiltrate({ ...filtrate, product_kind_id: res.data.list[0].id })
|
||||
product_kind_id_ref.current = res.data.list[0].id
|
||||
}
|
||||
}
|
||||
|
||||
//获取面料列表
|
||||
const [productData, setProductData] = useState({ list: [], total: 0 })
|
||||
const product_kind_id_ref = useRef(0)
|
||||
const [productData, setProductData] = useState<{ list: any; total: number }>({ list: [], total: 0 })
|
||||
const [hasMore, setHasMore] = useState(true)
|
||||
const [filtrate, setFiltrate] = useState({ product_kind_id: 0, size: 5, page: 1 })
|
||||
const pageNum = useRef({ size: filtrate.size, page: filtrate.page })
|
||||
@@ -53,6 +55,7 @@ export default () => {
|
||||
pageNum.current.page = 1
|
||||
setProductData({ list: [], total: 0 })
|
||||
setFiltrate((list) => ({ ...list, size: 5, product_kind_id: e.id }))
|
||||
product_kind_id_ref.current = e.id
|
||||
}, [])
|
||||
|
||||
//上拉加载数据
|
||||
@@ -82,6 +85,16 @@ export default () => {
|
||||
return dataLoadingStatus({ list: productData.list, total: productData.total, status: productState.loading })
|
||||
}, [productData, productState.loading])
|
||||
|
||||
//获取二级分类
|
||||
const product_kind_id_next_ref = useRef(0)
|
||||
const getSelectClassId = useCallback((id) => {
|
||||
pageNum.current.page = 1
|
||||
setProductData({ list: [], total: 0 })
|
||||
let kind_id = id == -1 ? product_kind_id_ref.current : id
|
||||
product_kind_id_next_ref.current = id
|
||||
setFiltrate((list) => ({ ...list, size: 5, product_kind_id: kind_id }))
|
||||
}, [])
|
||||
|
||||
return (
|
||||
<MoveBtn onClick={() => setShowShopCart(!showShopCart)}>
|
||||
<View className={styles.main}>
|
||||
@@ -104,6 +117,7 @@ export default () => {
|
||||
sideBarOnClick={getProductKindId}
|
||||
heightItem={150}
|
||||
refresherTriggered={refresherTriggeredStatus}
|
||||
selectClass={getSelectClassId}
|
||||
selfOnRefresherRefresh={() => getRefresherRefresh()}>
|
||||
<Product productList={productData.list} />
|
||||
</SideBar>
|
||||
|
||||
Reference in New Issue
Block a user