1
- import { Link } from 'react-router-dom'
2
- import { Breadcrumb , Button , Card , DatePicker , Form , Radio , Select , Space , Table , Tag } from 'antd'
1
+ import { Link , useNavigate } from 'react-router-dom'
2
+ import { Breadcrumb , Button , Card , DatePicker , Form , Popconfirm , Radio , Select , Space , Table , Tag } from 'antd'
3
3
// 引入时间选择器汉化包
4
4
import locale from 'antd/es/date-picker/locale/zh_CN'
5
5
import { DeleteOutlined , EditOutlined } from '@ant-design/icons'
6
6
import img404 from '@/assets/error.png'
7
7
import { useChannelList } from "@/hooks/useChannelList"
8
8
import { useEffect , useState } from "react"
9
- import { getArticleListAPI } from "@/apis/article"
9
+ import { delArticleAPI , getArticleListAPI } from "@/apis/article"
10
10
11
11
const { Option} = Select
12
12
const { RangePicker} = DatePicker
13
13
14
14
const Article = ( ) => {
15
15
const { channelList} = useChannelList ( )
16
+ const navigate = useNavigate ( )
16
17
17
18
// 定义 status 枚举
18
19
const status = {
@@ -62,30 +63,83 @@ const Article = () => {
62
63
render : data => {
63
64
return (
64
65
< Space size = "middle" >
65
- < Button type = "primary" shape = "circle" icon = { < EditOutlined /> } />
66
- < Button
67
- type = "primary"
68
- danger
69
- shape = "circle"
70
- icon = { < DeleteOutlined /> }
71
- />
66
+ < Button type = "primary" shape = "circle" icon = { < EditOutlined /> }
67
+ onClick = { ( ) => navigate ( `/publish?id=${ data . id } ` ) } />
68
+ < Popconfirm
69
+ placement = "top"
70
+ title = "删除文章"
71
+ description = "确认要删除当前文章吗"
72
+ okText = "Yes"
73
+ cancelText = "No"
74
+ onConfirm = { ( ) => onDelConfirm ( data ) }
75
+ >
76
+ < Button
77
+ type = "primary"
78
+ danger
79
+ shape = "circle"
80
+ icon = { < DeleteOutlined /> }
81
+ />
82
+ </ Popconfirm >
72
83
</ Space >
73
84
)
74
85
}
75
86
}
76
87
]
77
88
89
+ // 筛选功能
90
+ // 1. 准备参数
91
+ const [ reqData , setReqData ] = useState ( {
92
+ status : '' ,
93
+ channel_id : '' ,
94
+ begin_pubdate : '' ,
95
+ end_pubdate : '' ,
96
+ page : 1 ,
97
+ per_page : 4
98
+ } )
99
+
100
+ // 2. 获取筛选数据
101
+ const onFinish = ( formValue ) => {
102
+ // 3. 把表单数据放到参数中
103
+ setReqData ( {
104
+ ...reqData ,
105
+ channel_id : formValue . channel_id ,
106
+ status : formValue . status ,
107
+ begin_pubdate : formValue . date [ 0 ] . format ( 'YYYY-MM-DD' ) ,
108
+ end_pubdate : formValue . date [ 1 ] . format ( 'YYYY-MM-DD' )
109
+ } )
110
+ }
111
+
112
+ // 4. 重新拉取文章列表 + 渲染 table 逻辑(复用)
113
+ // 由 reqData 依赖项变化,重复执行 useEffect
114
+
115
+ // 分页
116
+ const onPageChange = ( page ) => {
117
+ setReqData ( {
118
+ ...reqData ,
119
+ page : page . current
120
+ } )
121
+ }
122
+
78
123
// 获取文章列表
79
124
const [ articleList , setArticleList ] = useState ( [ ] )
80
125
const [ articleCount , setArticleCount ] = useState ( 0 )
81
126
useEffect ( ( ) => {
82
127
async function getList ( ) {
83
- const res = await getArticleListAPI ( )
128
+ const res = await getArticleListAPI ( reqData )
84
129
setArticleList ( res . data . results )
85
130
setArticleCount ( res . data . total_count )
86
131
}
132
+
87
133
getList ( )
88
- } , [ ] ) ;
134
+ } , [ reqData ] )
135
+
136
+ // 删除
137
+ const onDelConfirm = async ( data ) => {
138
+ await delArticleAPI ( data [ 'id' ] )
139
+ setReqData ( {
140
+ ...reqData
141
+ } )
142
+ }
89
143
90
144
return (
91
145
< div >
@@ -98,7 +152,7 @@ const Article = () => {
98
152
}
99
153
style = { { marginBottom : 20 } }
100
154
>
101
- < Form initialValues = { { status : '' } } >
155
+ < Form initialValues = { { status : '' } } onFinish = { onFinish } >
102
156
< Form . Item label = "状态" name = "status" >
103
157
< Radio . Group >
104
158
< Radio value = { '' } > 全部</ Radio >
@@ -110,7 +164,6 @@ const Article = () => {
110
164
< Form . Item label = "频道" name = "channel_id" >
111
165
< Select
112
166
placeholder = "请选择文章频道"
113
- defaultValue = "lucy"
114
167
style = { { width : 120 } }
115
168
>
116
169
{ channelList . map ( item => < Option key = { item . id } value = { item . id } > { item . name } </ Option > ) }
@@ -130,7 +183,16 @@ const Article = () => {
130
183
</ Form >
131
184
</ Card >
132
185
< Card title = { `根据筛选条件共查询到 ${ articleCount } 条结果:` } >
133
- < Table rowKey = "id" columns = { columns } dataSource = { articleList } />
186
+ < Table
187
+ rowKey = "id"
188
+ columns = { columns }
189
+ pagination = { {
190
+ total : articleCount ,
191
+ pageSize : reqData . per_page
192
+ } }
193
+ onChange = { onPageChange }
194
+ dataSource = { articleList }
195
+ />
134
196
</ Card >
135
197
</ div >
136
198
)
0 commit comments