🎈 perf(优化首页完成):

This commit is contained in:
czm 2022-11-23 15:55:02 +08:00
parent 03df61b555
commit 053ced7858
7 changed files with 142 additions and 85 deletions

View File

@ -1,65 +1,74 @@
import { useRequest } from "@/use/useHttp" import { useRequest } from '@/use/useHttp'
/** /**
* *
* @returns * @returns
*/ */
export const GetCategoryList = () => { export const GetCategoryList = () => {
return useRequest({ return useRequest({
url: `/v1/mall/category/list`, url: `/v1/mall/category/list`,
method: "get", method: 'get',
}) })
} }
/** /**
* *
* @returns * @returns
*/ */
export const GetProductKindListApi = () => { export const GetProductKindListApi = () => {
return useRequest({ return useRequest({
url: `/v1/mall/product/kind/list`, url: `/v2/mall/product/kind/list`,
method: "get", method: 'get',
}) })
} }
/** /**
* *
* @returns * @returns
*/ */
export const GetProductListApi = () => { export const GetProductListApi = () => {
return useRequest({ return useRequest({
url: `/v1/mall/product/list`, url: `/v1/mall/product/list`,
method: "get", method: 'get',
}) })
}
/**
*
*/
export const GetClassList = () => {
return useRequest({
url: `/v2/mall/product/kind/sub/list`,
method: 'get',
})
} }
/** /**
* *
* @returns * @returns
*/ */
export const GetProductDetailApi = () => { export const GetProductDetailApi = () => {
return useRequest({ return useRequest({
url: `/v1/mall/product`, url: `/v1/mall/product`,
method: "get", method: 'get',
}) })
} }
/** /**
* LAB匹配色卡基础资料 * LAB匹配色卡基础资料
* @returns * @returns
*/ */
export const GetLabProductApi = () => { export const GetLabProductApi = () => {
return useRequest({ return useRequest({
url: `/v1/mall/product/color/absorb/match`, url: `/v1/mall/product/color/absorb/match`,
method: "get", method: 'get',
}) })
} }
/** /**
* *
* @returns * @returns
*/ */
// export const GetProductDetailApi = () => { // export const GetProductDetailApi = () => {
// return useRequest({ // return useRequest({
// url: `/v1/mall/product`, // url: `/v1/mall/product`,

View File

@ -1,4 +1,4 @@
export const BASE_URL = CURRENT_BASE_URL // export const BASE_URL = CURRENT_BASE_URL
// export const BASE_URL = `http://192.168.0.75:50001/lymarket` // export const BASE_URL = `http://192.168.0.75:50001/lymarket`
// export const BASE_URL = `http://192.168.0.89:50001/lymarket` // export const BASE_URL = `http://192.168.0.89:50001/lymarket`
// export const BASE_URL = `http://10.0.0.5:50001/lymarket` // export const BASE_URL = `http://10.0.0.5:50001/lymarket`
@ -12,7 +12,7 @@ export const BASE_URL = CURRENT_BASE_URL
// export const BASE_URL = `https://dev.zzfzyc.com/lymarket` // 开发环境 // export const BASE_URL = `https://dev.zzfzyc.com/lymarket` // 开发环境
// export const BASE_URL = `https://www.zzfzyc.com/lymarket` // 正式环境 // export const BASE_URL = `https://www.zzfzyc.com/lymarket` // 正式环境
// export const BASE_URL = `http://192.168.1.5:40001/lymarket` // 王霞 // export const BASE_URL = `http://192.168.1.5:40001/lymarket` // 王霞
// export const BASE_URL = `http://192.168.1.7:50002/lymarket` // 添 export const BASE_URL = `http://192.168.1.7:50002/lymarket` // 添
// export const BASE_URL = `http://192.168.1.22:50002/lymarket` // 婷 // export const BASE_URL = `http://192.168.1.22:50002/lymarket` // 婷
// export const BASE_URL = `http://192.168.1.42:50002/lymarket` // 杰 // export const BASE_URL = `http://192.168.1.42:50002/lymarket` // 杰

View File

@ -6,6 +6,7 @@ import Taro, { useReady } from '@tarojs/taro'
import InfiniteScroll, { StatusParam } from '../infiniteScroll' import InfiniteScroll, { StatusParam } from '../infiniteScroll'
import LoadingCard from '../loadingCard' import LoadingCard from '../loadingCard'
import ProductClass from '@/pages/index/components/productClass' import ProductClass from '@/pages/index/components/productClass'
import { GetClassList } from '@/api/material'
type Params = { type Params = {
list?: any[] list?: any[]
@ -19,6 +20,7 @@ type Params = {
selfOnScrolltolower?: () => void selfOnScrolltolower?: () => void
hasMore?: true | false hasMore?: true | false
statusMore?: StatusParam statusMore?: StatusParam
selectClass?: (val: number) => void
} }
export default memo( export default memo(
@ -34,6 +36,7 @@ export default memo(
selfOnScrolltolower, selfOnScrolltolower,
hasMore = true, hasMore = true,
statusMore = 0, statusMore = 0,
selectClass,
}: Params) => { }: Params) => {
let num_half = useRef(0) let num_half = useRef(0)
@ -57,6 +60,8 @@ export default memo(
setSelected(item.id) setSelected(item.id)
sideBarOnClick?.(item) sideBarOnClick?.(item)
computeSelectTab(index) computeSelectTab(index)
setClassId(-1)
selectClass?.(-1)
} }
const computeSelectTab = (index) => { const computeSelectTab = (index) => {
@ -86,7 +91,28 @@ export default memo(
}) })
}) })
//二级面料系列分类
const [openClass, setOpenClass] = useState(false) const [openClass, setOpenClass] = useState(false)
const [classList, setClassList] = useState([])
const [classId, setClassId] = useState(0)
const { fetchData } = GetClassList()
const getClassData = async (id) => {
let res = await fetchData({ id })
if (res.success) {
if (res.data?.list.length > 0) {
res.data.list = [{ id: -1, name: '全部' }, ...res.data.list]
}
setClassList(() => res.data?.list)
}
}
useEffect(() => {
if (selected) getClassData(selected)
}, [selected])
const getSelectClass = (id) => {
selectClass?.(id)
setClassId(id)
}
return ( return (
<> <>
@ -105,10 +131,12 @@ export default memo(
) )
})} })}
</ScrollView> </ScrollView>
<View className={styles.sideBar_con}> <View className={styles.sideBar_con} style={{ paddingTop: classList.length > 0 ? '90rpx' : '20rpx' }}>
<View className={styles.product_class} style={{ height: openClass ? '100%' : '' }}> {classList.length > 0 && (
<ProductClass open={openClass} onOpenClick={(val) => setOpenClass(val)} /> <View className={styles.product_class} style={{ height: openClass ? '100%' : '' }}>
</View> <ProductClass list={classList} open={openClass} onOpenClick={(val) => setOpenClass(val)} onSelect={getSelectClass} defaultSelectId={classId} />
</View>
)}
<InfiniteScroll <InfiniteScroll
statusMore={statusMore} statusMore={statusMore}
hasMore={hasMore} hasMore={hasMore}

View File

@ -14,8 +14,7 @@
display: flex; display: flex;
box-sizing: border-box; box-sizing: border-box;
.product_class_item { .product_class_item {
min-width: 170px; padding: 10px 20px;
height: 56px;
background: #f5f5f5; background: #f5f5f5;
border-radius: 29px; border-radius: 29px;
display: flex; display: flex;
@ -24,6 +23,8 @@
font-size: 24px; font-size: 24px;
color: rgba(0, 0, 0, 0.8); color: rgba(0, 0, 0, 0.8);
box-sizing: border-box; box-sizing: border-box;
max-width: 260px;
// @include common_ellipsis;
&:nth-last-child(n + 1) { &:nth-last-child(n + 1) {
margin-right: 16px; margin-right: 16px;
} }
@ -76,17 +77,23 @@
flex-wrap: wrap; flex-wrap: wrap;
box-sizing: border-box; box-sizing: border-box;
.product_class_item { .product_class_item {
min-width: 167px; padding: 10px 20px;
height: 56px; background: #f5f5f5;
background: #ecf2ff;
border: 1px solid #3c78f4;
border-radius: 29px; border-radius: 29px;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
font-size: 24px; 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; color: #3c78f4;
margin: 0 6px 20px 6px; background: #ecf2ff;
} }
} }
} }

View File

@ -6,67 +6,67 @@ import { useEffect, useMemo, useState } from 'react'
type Param = { type Param = {
open: boolean open: boolean
onOpenClick?: (val: boolean) => void onOpenClick?: (val: boolean) => void
onSelect?: (val: number) => void onSelect?: (id: number) => void
list?: { name: string; id: number }[]
defaultSelectId: number
} }
type ParamProduct = Omit<Param, 'open'> & { type ParamProduct = Omit<Param, 'open'>
defaultSelectIded: number
}
export default (option: Param) => { export default (option: Param) => {
const { open = false, onOpenClick, onSelect } = option const { open = false, onOpenClick, onSelect, list, defaultSelectId } = option
const [defaultSelectIded, setDefaultSelectIded] = useState(-1) // const [defaultSelectIded, setDefaultSelectIded] = useState(-1)
const getSelect = (id) => {
// setDefaultSelectIded(id)
onSelect?.(id)
}
return ( return (
<> <>
{open ? ( {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 ProductClassLine = (option: ParamProduct) => {
const { onOpenClick, defaultSelectIded = -1, onSelect } = option const { onOpenClick, defaultSelectId = -1, onSelect, list = [] } = option
const [selectInfo, setSelectInfo] = useState({ const [selectInfo, setSelectInfo] = useState({
selected: -1, //当前选中的id 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(() => { useEffect(() => {
let data: { item: any; index: number } = {} let data: { item: any; index: number } = { item: null, index: 0 }
list.filter((item, index) => { list?.filter((item, index) => {
if (item.id == defaultSelectIded) { if (item.id == defaultSelectId) {
data = { item, index } data = { item, index }
} }
}) })
clickEvent(data) if (data.item) {
}, [defaultSelectIded]) 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 clickEvent = ({ item, index }: { item: any; index: number }) => {
const num = index > 0 ? index - 1 : 0 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 ( return (
<View className={styles.product_class_main_line}> <View className={styles.product_class_main_line}>
<ScrollView scrollX scrollWithAnimation={true} className={styles.product_class_scroll} scrollIntoView={`tabs_${selectInfo.tabId}`}> <ScrollView scrollX scrollWithAnimation={true} className={styles.product_class_scroll} scrollIntoView={`tabs_${selectInfo.tabId}`}>
<View className={styles.product_class_list}> <View className={styles.product_class_list}>
{list.map((item, index) => ( {list?.map((item, index) => (
<View <View
id={`tabs_${item.id}`} id={`tabs_${item.id}`}
className={classnames(styles.product_class_item, item.id == selectInfo.selected ? styles.product_class_item_selected : '')} className={classnames(styles.product_class_item, item.id == selectInfo.selected ? styles.product_class_item_selected : '')}
onClick={() => clickEvent({ item, index })}> onClick={() => clickEvent({ item, index })}>
{item.name + item.id} {item.name}
</View> </View>
))} ))}
</View> </View>
@ -79,26 +79,26 @@ const ProductClassLine = (option: ParamProduct) => {
} }
const ProductClassBlock = (option: ParamProduct) => { const ProductClassBlock = (option: ParamProduct) => {
const { onOpenClick } = option const { onOpenClick, defaultSelectId = -1, onSelect, list = [] } = option
const [selectInfo, setSelectInfo] = useState(-1) const [selectInfo, setSelectInfo] = useState(-1)
const list = useMemo(() => {
const data = new Array(10).fill('').map((item, index) => { useEffect(() => {
return { id: index, name: '二级分类' + index } setSelectInfo(defaultSelectId)
}) }, [defaultSelectId])
data.unshift({ id: -1, name: '全部' })
return data
}, [])
const clickEvent = (item) => { const clickEvent = (item) => {
setSelectInfo(item.id) setSelectInfo(item.id)
onSelect?.(item.id)
} }
return ( return (
<View className={styles.product_class_main_block}> <View className={styles.product_class_main_block}>
<View className={styles.product_class_block_con}> <View className={styles.product_class_block_con}>
<ScrollView scrollY className={styles.product_class_scroll}> <ScrollView scrollY className={styles.product_class_scroll}>
<View className={styles.product_class_list}> <View className={styles.product_class_list}>
{list.map((item, index) => ( {list?.map((item) => (
<View className={styles.product_class_item} onClick={() => clickEvent(item)}> <View
className={classnames(styles.product_class_item, item.id == selectInfo ? styles.product_class_item_selected : '')}
onClick={() => clickEvent(item)}>
{item.name} {item.name}
</View> </View>
))} ))}

View File

@ -32,7 +32,6 @@
.products { .products {
flex: 1; flex: 1;
height: 0; height: 0;
margin-top: 20px;
.product_right_con { .product_right_con {
position: relative; position: relative;
.product_class { .product_class {

View File

@ -28,11 +28,13 @@ export default () => {
if (res.data?.list) { if (res.data?.list) {
setKindData({ ...kindData, list: res.data.list, defaultId: res.data.list[0].id }) setKindData({ ...kindData, list: res.data.list, defaultId: res.data.list[0].id })
setFiltrate({ ...filtrate, product_kind_id: 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 [hasMore, setHasMore] = useState(true)
const [filtrate, setFiltrate] = useState({ product_kind_id: 0, size: 5, page: 1 }) const [filtrate, setFiltrate] = useState({ product_kind_id: 0, size: 5, page: 1 })
const pageNum = useRef({ size: filtrate.size, page: filtrate.page }) const pageNum = useRef({ size: filtrate.size, page: filtrate.page })
@ -53,6 +55,7 @@ export default () => {
pageNum.current.page = 1 pageNum.current.page = 1
setProductData({ list: [], total: 0 }) setProductData({ list: [], total: 0 })
setFiltrate((list) => ({ ...list, size: 5, product_kind_id: e.id })) 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 }) return dataLoadingStatus({ list: productData.list, total: productData.total, status: productState.loading })
}, [productData, 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 ( return (
<MoveBtn onClick={() => setShowShopCart(!showShopCart)}> <MoveBtn onClick={() => setShowShopCart(!showShopCart)}>
<View className={styles.main}> <View className={styles.main}>
@ -104,6 +117,7 @@ export default () => {
sideBarOnClick={getProductKindId} sideBarOnClick={getProductKindId}
heightItem={150} heightItem={150}
refresherTriggered={refresherTriggeredStatus} refresherTriggered={refresherTriggeredStatus}
selectClass={getSelectClassId}
selfOnRefresherRefresh={() => getRefresherRefresh()}> selfOnRefresherRefresh={() => getRefresherRefresh()}>
<Product productList={productData.list} /> <Product productList={productData.list} />
</SideBar> </SideBar>