@@ -24,6 +24,7 @@ export default function ArticleList() {
2424
2525 const gridRef = useRef ( null ) ;
2626 const [ holdHeight , setHoldHeight ] = useState ( null ) ;
27+ const abortControllerRef = useRef ( null ) ;
2728
2829 useEffect ( ( ) => {
2930 const checkMobile = ( ) => setForceMobile ( window . innerWidth < 768 ) ;
@@ -40,13 +41,24 @@ export default function ArticleList() {
4041
4142 useEffect ( ( ) => {
4243 loadArticlesFromUrl ( ) ;
44+ return ( ) => {
45+ if ( abortControllerRef . current ) {
46+ abortControllerRef . current . abort ( ) ;
47+ }
48+ } ;
4349 } , [ location . search , location . pathname , pageParam , tagName ] ) ;
4450
4551 useEffect ( ( ) => {
4652 localStorage . setItem ( 'showImages' , JSON . stringify ( showImages ) ) ;
4753 } , [ showImages ] ) ;
4854
4955 const loadArticlesFromUrl = async ( ) => {
56+ if ( abortControllerRef . current ) {
57+ abortControllerRef . current . abort ( ) ;
58+ }
59+ const abortController = new AbortController ( ) ;
60+ abortControllerRef . current = abortController ;
61+
5062 try {
5163 if ( gridRef . current ) {
5264 setHoldHeight ( gridRef . current . offsetHeight ) ;
@@ -55,21 +67,30 @@ export default function ArticleList() {
5567 let result ;
5668
5769 if ( categoryName ) {
58- result = await apiClient . get ( `/categories/articles?category=${ encodeURIComponent ( categoryName ) } &page=${ pageParam } &size=6` ) ;
70+ result = await apiClient . get ( `/categories/articles?category=${ encodeURIComponent ( categoryName ) } &page=${ pageParam } &size=6` , { signal : abortController . signal } ) ;
5971 } else if ( tagName ) {
60- result = await apiClient . get ( `/tags/${ tagName } /articles?page=${ pageParam } &size=6` ) ;
72+ result = await apiClient . get ( `/tags/${ tagName } /articles?page=${ pageParam } &size=6` , { signal : abortController . signal } ) ;
6173 } else {
62- result = await fetchArticles ( pageParam , 6 ) ;
74+ result = await fetchArticles ( pageParam , 6 , null , abortController . signal ) ;
6375 }
6476
65- setArticles ( Array . isArray ( result . data ) ? result . data : [ ] ) ;
66- setTotalPages ( result . total_pages || 1 ) ;
77+ if ( ! abortController . signal . aborted ) {
78+ setArticles ( Array . isArray ( result . data ) ? result . data : [ ] ) ;
79+ setTotalPages ( result . total_pages || 1 ) ;
80+ }
6781 } catch ( error ) {
82+ if ( error . name === 'AbortError' || error . code === 'ERR_CANCELED' ) {
83+ return ;
84+ }
6885 console . error ( '加载文章失败:' , error ) ;
69- setArticles ( [ ] ) ;
70- setTotalPages ( 1 ) ;
86+ if ( ! abortController . signal . aborted ) {
87+ setArticles ( [ ] ) ;
88+ setTotalPages ( 1 ) ;
89+ }
7190 } finally {
72- setLoading ( false ) ;
91+ if ( ! abortController . signal . aborted ) {
92+ setLoading ( false ) ;
93+ }
7394 }
7495 } ;
7596
0 commit comments