提交 486761c6 作者: ZhangLingKun

功能:新闻列表

上级 e474913e
import React from 'react';
import styled from 'styled-components';
import { InterListType } from '@/api/interface';
import { ListNewsType } from '@/api/interface/home';
// 详情类型
type DetailType = InterListType<ListNewsType>[0];
const NewsListItem: React.FC<{ detail: DetailType }> = ({ detail }) => {
return (
<NewsListWrap>
<img
className="item-image"
src={detail?.surfaceImg}
alt={detail?.newsTitle}
/>
<div className="item-content">
<div className="title">{detail?.newsTitle}</div>
<div className="desc two-line-ellipsis">
{detail?.newsContents?.match(/(?<=>)[^<>]+(?=<)/g)}
</div>
<div className="tips flex">
<div className="text text-ellipsis" title={detail?.newsAuthor}>
作者:{detail?.newsAuthor}
</div>
<div className="text text-ellipsis" title={detail?.origin}>
来源:{detail?.origin}
</div>
</div>
</div>
</NewsListWrap>
);
};
export default NewsListItem;
// 样式
const NewsListWrap = styled.div`
position: relative;
width: 86%;
//width: 100%;
box-sizing: border-box;
margin: 0 auto 0.83rem;
min-height: 9.17rem;
background: #ffffff;
box-shadow: 0 0.17rem 1rem 0 rgba(102, 120, 192, 0.11);
border-radius: 0.5rem;
display: flex;
align-items: center;
justify-content: flex-start;
padding: 0 0.83rem;
cursor: pointer;
.item-image {
width: 13.33rem;
height: 7.5rem;
border-radius: 0.25rem;
object-fit: cover;
margin-right: 1.67rem;
}
.item-content {
position: relative;
width: calc(100% - 15rem);
min-height: 7.5rem;
box-sizing: border-box;
.title {
font-weight: bold;
font-size: 16px;
margin-bottom: 0.5rem;
&:hover {
color: #ff552d;
}
}
.desc {
color: #666;
margin-bottom: 0.83rem;
}
.tips {
.text {
width: 6.8rem;
}
.text:not(:last-child) {
margin-right: 0.5rem;
}
}
}
`;
import React from 'react'; import React, { useEffect, useState } from 'react';
import { FieldTimeOutlined, VerticalAlignTopOutlined } from '@ant-design/icons'; import { FieldTimeOutlined, VerticalAlignTopOutlined } from '@ant-design/icons';
import { Carousel } from 'antd'; import { Carousel } from 'antd';
import styled from 'styled-components'; import styled from 'styled-components';
import { HomeAPI } from '@/api';
import { InterListType } from '@/api/interface'; import { InterListType } from '@/api/interface';
import { ListNewsType } from '@/api/interface/home'; import { ListNewsType } from '@/api/interface/home';
// 新闻列表类型 // 新闻列表类型
type ListType = InterListType<ListNewsType>; type ListType = InterListType<ListNewsType>;
const NewsSwiperView: React.FC<{ list: ListType }> = ({ list }) => { const NewsSwiperView = () => {
// 新闻列表
const [newsList, setNewsList] = useState<ListType>([]);
// 热点资讯列表
const getListNews = async () => {
const res = await HomeAPI.getListNews({
pageNo: 1,
pageSize: 10,
isHot: 1,
});
if (res && res.code === '200') {
setNewsList(res.result.list || []);
}
};
// 组件挂载
useEffect(() => {
getListNews().then();
}, []);
return ( return (
<NewsSwiperWrap> <NewsSwiperWrap>
<Carousel autoplay={true}> <Carousel autoplay={true}>
{list {newsList?.map((i, j) => (
?.filter((i) => i.isHot) <div className="swiper-view" key={j}>
?.map((i, j) => ( <div className="swiper-item">
<div className="swiper-view" key={j}> <img
<div className="swiper-item"> className="item-image"
<img src={i?.surfaceImg}
className="item-image" alt={i.newsTitle}
src={i?.surfaceImg} />
alt={i.newsTitle} <div className="item-content">
/> <div className="content-head">
<div className="item-content"> <div className="top">
<div className="content-head"> <VerticalAlignTopOutlined />
<div className="top"> <span className="text">置顶</span>
<VerticalAlignTopOutlined />
<span className="text">置顶</span>
</div>
<div className="time">
<FieldTimeOutlined />
<span className="text">{i?.createTime}</span>
</div>
</div> </div>
<div className="content-title">{i?.newsTitle}</div> <div className="time">
<div className="content-desc two-line-ellipsis"> <FieldTimeOutlined />
{i?.newsContents?.match(/(?<=>)[^<>]+(?=<)/g)} <span className="text">{i?.createTime}</span>
</div> </div>
</div> </div>
<div className="content-title">{i?.newsTitle}</div>
<div className="content-desc two-line-ellipsis">
{i?.newsContents?.match(/(?<=>)[^<>]+(?=<)/g)}
</div>
</div> </div>
</div> </div>
))} </div>
))}
</Carousel> </Carousel>
</NewsSwiperWrap> </NewsSwiperWrap>
); );
...@@ -51,6 +67,7 @@ export default NewsSwiperView; ...@@ -51,6 +67,7 @@ export default NewsSwiperView;
const NewsSwiperWrap = styled.div` const NewsSwiperWrap = styled.div`
position: relative; position: relative;
width: 86%; width: 86%;
//width: 100%;
box-sizing: border-box; box-sizing: border-box;
margin: 0 auto; margin: 0 auto;
.swiper-view { .swiper-view {
......
import React, { useEffect, useState } from 'react'; import React, { useEffect, useState } from 'react';
import { Empty, Tabs, TabsProps } from 'antd';
import styled from 'styled-components'; import styled from 'styled-components';
import { HomeAPI } from '@/api'; import { HomeAPI } from '@/api';
import { InterListType } from '@/api/interface'; import { InterListType } from '@/api/interface';
import { ListNewsType } from '@/api/interface/home'; import { ListNewsType } from '@/api/interface/home';
import BreadcrumbView from '@/components/breadcrumb'; import BreadcrumbView from '@/components/breadcrumb';
import LayoutView from '@/components/layout'; import LayoutView from '@/components/layout';
import ProductListView from '@/components/productList';
import NewsListItem from '@/pages/news/comp/_newsListItem';
import NewsSwiperView from '@/pages/news/comp/_newsSwiper'; import NewsSwiperView from '@/pages/news/comp/_newsSwiper';
// 新闻列表类型 // 新闻列表类型
type NewsListType = InterListType<ListNewsType>; type NewsListType = InterListType<ListNewsType>;
// tab列表
const items: TabsProps['items'] = [
{
key: '1',
label: '热点新闻',
},
{
key: '2',
label: '招标快讯',
},
];
const NewsListView = () => { const NewsListView = () => {
// tab栏切换
const [tabIndex, setTabIndex] = useState('1');
// 新闻列表 // 新闻列表
const [newsList, setNewsList] = useState<NewsListType>([]); const [newsList, setNewsList] = useState<NewsListType>([]);
// 分页数据 // 分页数据
const [pagination, setPagination] = useState({ const [pagination, setPagination] = useState({
pageNo: 1, pageNo: 1,
pageSize: 18, pageSize: 5,
totalPage: 0,
totalCount: 0, totalCount: 0,
}); });
// 热点资讯列表 // 热点资讯列表
const getListNews = async () => { const getListNews = async (data?: { pageNo?: number; pageSize?: number }) => {
const res = await HomeAPI.getListNews({ const res = await HomeAPI.getListNews({
pageNo: pagination.pageNo, pageNo: pagination.pageNo,
pageSize: pagination.pageSize, pageSize: pagination.pageSize,
...data,
}); });
if (res && res.code === '200') { if (res && res.code === '200') {
const { list, pageNo, pageSize, totalCount } = res.result; const { list, pageNo, pageSize, totalPage, totalCount } = res.result;
setPagination({ setPagination({
pageNo, pageNo,
pageSize, pageSize,
totalPage,
totalCount, totalCount,
}); });
setNewsList(list); // setNewsList((prevList) => [...prevList, ...(list || [])]);
pagination.pageNo = pageNo;
pagination.totalPage = totalPage;
setNewsList(list || []);
} }
}; };
// tab栏切换监听
const handleTabChange: TabsProps['onChange'] = async (e) => {
setTabIndex(e);
pagination.pageNo = 1;
setNewsList([]);
if (e === '1') {
await getListNews({ pageNo: 1 });
}
};
// 添加 handleReachBottom 函数
const handlePageChange = async (pageNo: number, pageSize: number) => {
await getListNews({ pageNo, pageSize });
};
// 组件挂载 // 组件挂载
useEffect(() => { useEffect(() => {
getListNews().then(); getListNews().then();
...@@ -45,7 +80,28 @@ const NewsListView = () => { ...@@ -45,7 +80,28 @@ const NewsListView = () => {
{/* 面包屑 */} {/* 面包屑 */}
<BreadcrumbView /> <BreadcrumbView />
{/* 轮播图 */} {/* 轮播图 */}
<NewsSwiperView list={newsList} /> <NewsSwiperView />
{/* 文章类型 */}
<div className="news-tab">
<Tabs
defaultActiveKey={tabIndex}
items={items}
size={'large'}
onChange={handleTabChange}
/>
</div>
{/* 文章列表 */}
<div className="news-list">
<ProductListView pagination={pagination} onChange={handlePageChange}>
{newsList?.length ? (
newsList?.map((i, j) => <NewsListItem key={j} detail={i} />)
) : (
<div className="list-empty flex-center">
<Empty />
</div>
)}
</ProductListView>
</div>
</NewsListWrap> </NewsListWrap>
</LayoutView> </LayoutView>
); );
...@@ -59,4 +115,12 @@ const NewsListWrap = styled.div` ...@@ -59,4 +115,12 @@ const NewsListWrap = styled.div`
box-sizing: border-box; box-sizing: border-box;
padding: 2rem 0 0 0; padding: 2rem 0 0 0;
margin: 0 auto; margin: 0 auto;
.news-tab {
position: relative;
width: 100%;
display: flex;
justify-content: center;
align-items: center;
transform: translateY(-0.5rem);
}
`; `;
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论