前情提要-发布文章模块完成
文章列表模块
5、文章列表模块
5-1 静态结构创建
筛选区结构搭建
- 如何让RangePicker日期范围选择框选择中文
- Select组件配合Form.Item使用时,如何配置默认选中项
<Form initialValues={``{ status: null }} >
代码实现
pages/Article/index.jsx
jsx
import { Link } from 'react-router-dom'
import { Card, Breadcrumb, Form, Button, Radio, DatePicker, Select } from 'antd'
import locale from 'antd/es/date-picker/locale/zh_CN'
const { Option } = Select
const { RangePicker } = DatePicker
const Article = () => {
return (
<div>
<Card
title={
<Breadcrumb items={[
{ title: <Link to={'/'}>首页</Link> },
{ title: '文章列表' },
]} />
}
style={{ marginBottom: 20 }}
>
<Form initialValues={{ status: '' }}>
<Form.Item label="状态" name="status">
<Radio.Group>
<Radio value={''}>全部</Radio>
<Radio value={0}>草稿</Radio>
<Radio value={2}>审核通过</Radio>
</Radio.Group>
</Form.Item>
<Form.Item label="频道" name="channel_id">
<Select
placeholder="请选择文章频道"
defaultValue="lucy"
style={{ width: 120 }}
>
<Option value="jack">Jack</Option>
<Option value="lucy">Lucy</Option>
</Select>
</Form.Item>
<Form.Item label="日期" name="date">
{/* 传入locale属性 控制中文显示*/}
<RangePicker locale={locale}></RangePicker>
</Form.Item>
<Form.Item>
<Button type="primary" htmlType="submit" style={{ marginLeft: 40 }}>
筛选
</Button>
</Form.Item>
</Form>
</Card>
</div>
)
}
export default Article
表格区域结构
代码实现
pages/Article/index.jsx
jsx
// 导入资源
import { Table, Tag, Space } from 'antd'
import { EditOutlined, DeleteOutlined } from '@ant-design/icons'
import img404 from '@/assets/error.png'
const Article = () => {
// 准备列数据
const columns = [
{
title: '封面',
dataIndex: 'cover',
width: 120,
render: cover => {
return <img src={cover.images[0] || img404} width={80} height={60} alt="" />
}
},
{
title: '标题',
dataIndex: 'title',
width: 220
},
{
title: '状态',
dataIndex: 'status',
render: data => <Tag color="green">审核通过</Tag>
},
{
title: '发布时间',
dataIndex: 'pubdate'
},
{
title: '阅读数',
dataIndex: 'read_count'
},
{
title: '评论数',
dataIndex: 'comment_count'
},
{
title: '点赞数',
dataIndex: 'like_count'
},
{
title: '操作',
render: data => {
return (
<Space size="middle">
<Button type="primary" shape="circle" icon={<EditOutlined />} />
<Button
type="primary"
danger
shape="circle"
icon={<DeleteOutlined />}
/>
</Space>
)
}
}
]
// 准备表格body数据
const data = [
{
id: '8218',
comment_count: 0,
cover: {
images: [],
},
like_count: 0,
pubdate: '2019-03-11 09:00:00',
read_count: 2,
status: 2,
title: 'wkwebview离线化加载h5资源解决方案'
}
]
return (
<div>
{/* */}
<Card title={`根据筛选条件共查询到 count 条结果:`}>
<Table rowKey="id" columns={columns} dataSource={data} />
</Card>
</div>
)
}
提交-25文章列表-结构搭建

5-2 渲染频道数据

创建一个use打头的函数,在函数中封装业务逻辑,并return出组件中要用到的状态数据,最后在组件中导入函数执行并解构状态数据使用
实现步骤
- 声明列表相关数据管理
- 使用useState声明参数相关数据管理
- 调用接口获取数据
- 使用接口数据渲染模板
代码实现
src/hooks/useChannel.jsx
bash
import { useEffect, useState } from "react"
import { getChannelAPI } from '@/apis/article'
function useChannel() {
// 1.获取频道列表的所有逻辑
// 获取频道列表
const [channelList, setChannelList] = useState([])
useEffect(() => {
// 1.封装函数,在函数体内调用获取文章频道接口
const getChannelList = async () => {
const res = await getChannelAPI()
setChannelList(res.data.channels)
}
// 2.调用函数
getChannelList()
}, [])
// 2.把组件中要用的数据return出去
return {
channelList
}
}
export { useChannel }
修改pages/Publish/index.jsx

pages/Article/index.jsx

如果加上defaultValue属性,会提示警告[antd: Form.Item] defaultValue will not work on controlled Field,因为 Form.Item 配置了 name="channel_id"(受控字段),控件上的 defaultValue 会和 Form 的 initialValues 冲突。
提交-26文章列表-通过自定义hook获取频道列表

5-3 渲染table文章列表

代码实现
src/apis/article.jsx

pages/Article/index.jsx

测试

提交-27文章列表-基础table的渲染

5-4 适配文章状态



代码实现
pages/Article/index.jsx

提交-28文章列表-状态适配

5-5 筛选功能实现

获取文章列表需要的请求参数
时间要注意,返回的筛选后的数据包含起始时间,不包含结束时间

实现步骤
- 为表单添加
onFinish属性监听表单提交事件,获取参数 - 根据接口字段格式要求格式化参数格式
- 修改
params参数并重新使用新参数重新请求数据
表单获取到的数据

代码实现

通过reqData依赖项的变化自动加载渲染

通过onFinish获取表单数据

改进:解决时间选择为空的时候控制台报错
提交-29文章列表-筛选实现

5-6 分页功能实现

实现步骤
- 为Table组件指定pagination属性来展示分页效果
- 在分页切换事件中获取到筛选表单中选中的数据
- 使用当前页数据修改params参数依赖引起接口重新调用获取最新数据
代码实现


提交30-文章列表分页逻辑实现

5-7 删除功能

实现步骤
- 给删除文章按钮绑定点击事件
- 弹出确认窗口,询问用户是否确定删除文章
- 拿到参数调用删除接口,更新列表
代码实现
借助Popconfirm气泡确认框


但这个实现有一个bug,如果删除的数据是当前页的唯一一条数据时,删除操作完成之后,页面不会自动渲染出上一页的数据,会显示No Data,需要手动刷新才有数据,后续需要改进,判断一下删除的是否是当前页的唯一一条数据
提交31-文章列表-删除功能

5-8 编辑文章跳转

代码实现


提交32-文章列表-携带id跳转到文章编辑页
