feat(user/order): 优化订单列表功能和性能

- 添加防抖搜索功能,提高搜索性能
- 优化筛选逻辑,保留初始状态筛选
- 重构订单数据加载逻辑,支持分批加载
- 完善错误处理和用户提示
- 优化取消订单功能,增加确认对话框
-调整订单状态显示逻辑
This commit is contained in:
2025-08-11 22:31:08 +08:00
parent 8c10b4a66b
commit 46a555b27a
2 changed files with 168 additions and 62 deletions

View File

@@ -1,4 +1,4 @@
import {useState} from "react";
import {useState, useCallback, useRef} from "react";
import Taro, {useDidShow} from '@tarojs/taro'
import {Space, NavBar, Button, Input} from '@nutui/nutui-react-taro'
import {Search, Filter, ArrowLeft} from '@nutui/icons-react-taro'
@@ -10,18 +10,32 @@ import './order.scss'
function Order() {
const {params} = useRouter();
const [statusBarHeight, setStatusBarHeight] = useState<number>()
const [statusBarHeight, setStatusBarHeight] = useState<number>(0) // 默认值为0
const [searchParams, setSearchParams] = useState<ShopOrderParam>({
statusFilter: params.statusFilter != undefined && params.statusFilter != '' ? parseInt(params.statusFilter) : -1
})
const [showSearch, setShowSearch] = useState(false)
const [searchKeyword, setSearchKeyword] = useState('')
const searchTimeoutRef = useRef<NodeJS.Timeout>()
const reload = async (where?: ShopOrderParam) => {
console.log(where,'where...')
setSearchParams(prev => ({ ...prev, ...where }))
}
// 防抖搜索函数
const debouncedSearch = useCallback((keyword: string) => {
if (searchTimeoutRef.current) {
clearTimeout(searchTimeoutRef.current);
}
searchTimeoutRef.current = setTimeout(() => {
if (keyword.trim()) {
handleSearch({keywords: keyword.trim()});
}
}, 500); // 500ms防抖延迟
}, []);
// 处理搜索
const handleSearch = (where: ShopOrderParam) => {
setSearchParams(where)
@@ -30,7 +44,10 @@ function Order() {
// 重置搜索
const handleResetSearch = () => {
setSearchParams({})
setSearchKeyword(''); // 清空搜索关键词
setSearchParams({
statusFilter: params.statusFilter != undefined && params.statusFilter != '' ? parseInt(params.statusFilter) : -1
}); // 重置搜索参数,但保留初始状态筛选
reload().then()
}
@@ -56,10 +73,10 @@ function Order() {
return (
<View className="bg-gray-50 min-h-screen">
<View style={{height: `${statusBarHeight}px`, backgroundColor: '#ffffff'}}></View>
<View style={{height: `${statusBarHeight || 0}px`, backgroundColor: '#ffffff'}}></View>
<NavBar
fixed={true}
style={{marginTop: `${statusBarHeight}px`, backgroundColor: '#ffffff'}}
style={{marginTop: `${statusBarHeight || 0}px`, backgroundColor: '#ffffff'}}
left={
<>
<div className={'flex justify-between items-center w-full'}>
@@ -80,16 +97,12 @@ function Order() {
{/* 搜索和筛选工具栏 */}
<View className="bg-white px-4 py-3 flex justify-between items-center border-b border-gray-100">
<View className="flex items-center">
<Search
size={18}
className="mr-3 text-gray-600"
onClick={() => setShowSearch(!showSearch)}
/>
<Filter
size={18}
className="text-gray-600"
onClick={() => setShowSearch(!showSearch)}
/>
<span className="ml-2 text-sm text-gray-600"></span>
</View>
</View>
@@ -101,7 +114,10 @@ function Order() {
<Input
placeholder="搜索订单号、商品名称"
value={searchKeyword}
onChange={setSearchKeyword}
onChange={(value) => {
setSearchKeyword(value);
debouncedSearch(value); // 使用防抖搜索
}}
onConfirm={() => {
if (searchKeyword.trim()) {
handleSearch({keywords: searchKeyword.trim()});