1, create a new component
1 2
   | mkdir src/components/publish-manage touch src/components/publish-manage/NewsPublish.js
   | 
 
copy RightList.js to NewsPublish.js, modify content as below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
   | import { Button, Table } from 'antd';
  import React from 'react'
  export default function NewsPublish(props) {     const columns = [         {             title: '新闻标题',             dataIndex: 'title',             render: (title, item) => {                 return <a href={`#/news-manage/preview/${item.id}`}>{title}</a>             }         },         {             title: '作者',             dataIndex: 'author',         },         {             title: '新闻分类',             dataIndex: 'category',             render: category => {                 return <div>{category.title}</div>             }         },         {             title: '操作',             render: item => {                 return <div>                     <Button>Button</Button>                 </div>             }         },     ];
      return (         <div>             <Table dataSource={props.dataSource} columns={columns} pagination={{ pageSize: 5 }} rowKey={item => item.id} />;         </div>     ) }
  | 
 
so the Unpublish.js looks like
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
   | import axios from 'axios'; import React, { useEffect, useState } from 'react' import NewsPublish from '../../../components/publish-manage/NewsPublish';
  export default function Unpublished() {     const [dataSource, setDataSource] = useState([])     const { username } = JSON.parse(localStorage.getItem('token'));     useEffect(() => {         axios.get(`/api/news?author=${username}&publishState=1&_expand=category`).then(res => {             console.log(res.data);         })     }, [username]);
      return (         <div>             <NewsPublish dataSource={dataSource}></NewsPublish>         </div>     ) }
 
   | 
 
2. Define a custom hook
Because Published.js and Sunset.js are similar to Unpublish.js, only the publishState is difference. So we can define a custom hook.
1
   | touch src/components/publish-manage/usePublish.js
   | 
 
content is cut from Unpublish.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
   | 
  import { useEffect, useState } from 'react' import axios from 'axios'; import { notification } from 'antd';
  export default function usePublish(type) {     const [dataSource, setDataSource] = useState([])     const { username } = JSON.parse(localStorage.getItem('token'));
      useEffect(() => {         axios.get(`/api/news?author=${username}&publishState=${type}&_expand=category`).then(res => {                          setDataSource(res.data);         })     }, [username, type]);
      const handlePublish = id => {                  setDataSource(dataSource.filter(item => item.id !== id));
          axios.patch(`/api/news/${id}`, {             publishStats: 2,             publishTime: Date.now(),         }).then(res => {             notification.info({                 message: `Notification`,                 description:                     `Please go to published box for reviewing your news`,                 placement: 'bottomRight',             });         })     }
      const handleSunset = id => {         setDataSource(dataSource.filter(item => item.id !== id));         axios.patch(`/api/news/${id}`, {             publishStats: 3,         }).then(res => {             notification.info({                 message: `Notification`,                 description:                     `Please go to Sunset box for reviewing your news`,                 placement: 'bottomRight',             });         })     }
      const handleDelete = id => {         setDataSource(dataSource.filter(item => item.id !== id));
          axios.delete(`/api/news/${id}`).then(res => {             notification.info({                 message: `Notification`,                 description:                     `Your news was deleted`,                 placement: 'bottomRight',             });         })     }
      return {         dataSource,         handlePublish,         handleSunset,         handleDelete,     } }
 
 
  | 
 
So the Unpublished.js change to 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
   | import { Button } from 'antd'; import React from 'react'; import NewsPublish from '../../../components/publish-manage/NewsPublish'; import usePublish from '../../../components/publish-manage/usePublish';
  export default function Unpublished() {                    const { dataSource, handlePublish } = usePublish(1);     return (         <div>             <NewsPublish dataSource={dataSource} button={id => <Button type='primary' onClick={() => handlePublish(id)}>发布</Button>}></NewsPublish>         </div>     ) }
 
  | 
 
and the NewsPublish.js change to
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
   | import { Button, Table } from 'antd';
  import React from 'react'
  export default function NewsPublish(props) {     const columns = [         {             title: '新闻标题',             dataIndex: 'title',             render: (title, item) => {                 return <a href={`#/news-manage/preview/${item.id}`}>{title}</a>             }         },         {             title: '作者',             dataIndex: 'author',         },         {             title: '新闻分类',             dataIndex: 'category',             render: category => {                 return <div>{category.title}</div>             }         },         {             title: '操作',             render: item => {                 return <div>                     {props.button(item.id)}                 </div>             }         },     ];
      return (         <div>             <Table dataSource={props.dataSource} columns={columns} pagination={{ pageSize: 5 }} rowKey={item => item.id} />;         </div>     ) }
  | 
 
according the type, easy to peform Published.js and Sunset.js
Custom hook is important!