1- import React , { useState } from 'react'
1+ import React , { useState , useMemo } from 'react'
22import './index.less'
33
44import { Link } from 'react-router-dom'
@@ -15,10 +15,11 @@ import SvgIcon from '@/components/SvgIcon'
1515// hooks
1616import useFetchList from '@/hooks/useFetchList'
1717
18- function Preview ( { list, showTitle = true } ) {
18+ const LinkList = props => {
19+ const { list, showTitle = true } = props
1920 return (
2021 < ul className = 'preview' >
21- { showTitle && < Divider > 文章列表 </ Divider > }
22+ { showTitle && < Divider > 快速导航 </ Divider > }
2223 { list . map ( item => (
2324 < li key = { item . id } >
2425 < Link to = { `/article/${ item . id } ` } > { item . title } </ Link >
@@ -28,41 +29,58 @@ function Preview({ list, showTitle = true }) {
2829 )
2930}
3031
31- function NoDataDesc ( { keyword } ) {
32- return keyword ? (
33- < span >
34- 不存在标题/内容中含有 < span className = 'keyword' > { keyword } </ span > 的文章!
35- </ span >
32+ /**
33+ * 快速导航
34+ */
35+ const QuickLink = props => {
36+ const isGreaterThan1300 = useMediaQuery ( { query : '(min-width: 1300px)' } )
37+
38+ const { list } = props
39+
40+ const [ drawerVisible , setDrawerVisible ] = useState ( false )
41+
42+ return isGreaterThan1300 ? (
43+ < LinkList list = { list } />
3644 ) : (
37- < span > 暂无数据...</ span >
45+ < >
46+ < div className = 'drawer-btn' onClick = { e => setDrawerVisible ( true ) } >
47+ < Icon type = 'menu-o' className = 'nav-phone-icon' />
48+ </ div >
49+ < Drawer
50+ title = '快速导航'
51+ placement = 'right'
52+ closable = { false }
53+ onClose = { e => setDrawerVisible ( false ) }
54+ visible = { drawerVisible }
55+ getContainer = { ( ) => document . querySelector ( '.app-home' ) } >
56+ < LinkList list = { list } showTitle = { false } />
57+ </ Drawer >
58+ </ >
3859 )
3960}
4061
41- function Home ( props ) {
42- const [ drawerVisible , setDrawerVisible ] = useState ( false )
43-
62+ const Home = props => {
4463 const { loading, pagination, dataList } = useFetchList ( {
4564 requestUrl : '/article/list' ,
4665 queryParams : { pageSize : HOME_PAGESIZE } ,
4766 fetchDependence : [ props . location . search ]
4867 } )
4968
50- const list = [ ...dataList ] . map ( item => {
51- const index = item . content . indexOf ( '<!--more-->' )
52- item . content = translateMarkdown ( item . content . slice ( 0 , index ) )
53- return item
54- } )
55-
56- const isGreaterThan1300 = useMediaQuery ( {
57- query : '(min-width: 1300px)'
58- } )
69+ const list = useMemo ( ( ) => {
70+ return [ ...dataList ] . map ( item => {
71+ const index = item . content . indexOf ( '<!--more-->' )
72+ item . content = translateMarkdown ( item . content . slice ( 0 , index ) )
73+ return item
74+ } )
75+ } , [ dataList ] )
5976
6077 // 跳转到文章详情
6178 function jumpTo ( id ) {
6279 props . history . push ( `/article/${ id } ` )
6380 }
6481
6582 const { keyword } = decodeQuery ( props . location . search )
83+
6684 return (
6785 < Spin tip = 'Loading...' spinning = { loading } >
6886 < div className = 'app-home' >
@@ -94,35 +112,17 @@ function Home(props) {
94112 </ li >
95113 ) ) }
96114 </ ul >
97- { list . length > 0 ? (
98- < >
99- { isGreaterThan1300 ? (
100- < Preview list = { list } />
101- ) : (
102- < >
103- < div className = 'drawer-btn' onClick = { e => setDrawerVisible ( true ) } >
104- < Icon type = 'menu-o' className = 'nav-phone-icon' />
105- </ div >
106- < Drawer
107- title = '文章列表'
108- placement = 'right'
109- closable = { false }
110- onClose = { e => setDrawerVisible ( false ) }
111- visible = { drawerVisible }
112- getContainer = { ( ) => document . querySelector ( '.app-home' ) } >
113- < Preview list = { list } showTitle = { false } />
114- </ Drawer >
115- </ >
116- ) }
117- </ >
118- ) : (
119- < >
120- { keyword && (
121- < div className = 'no-data' >
122- < Empty description = { < NoDataDesc keyword = { keyword } /> } />
123- </ div >
124- ) }
125- </ >
115+ < QuickLink list = { list } />
116+
117+ { /* 结果为空 */ }
118+ { list . length === 0 && keyword && (
119+ < div className = 'no-data' >
120+ < Empty description = { (
121+ < span >
122+ 不存在标题/内容中含有 < span className = 'keyword' > { keyword } </ span > 的文章!
123+ </ span >
124+ ) } />
125+ </ div >
126126 ) }
127127
128128 < Pagination { ...pagination } onChange = {
0 commit comments