react+antdMobie实现消息通知页面样式

一、实现效果

二、代码

复制代码
import React, { useEffect, useState } from 'react';
import style from './style/index.less';
import { CapsuleTabs, Ellipsis, Empty, SearchBar, Tag } from 'antd-mobile';
//消息通知页面
export default function Notification(props) {
    const [options, setOptions] = useState([
        {
            label: '最近',
            value: 'zj',
            checked: true,
        },
        {
            label: '评审通知',
            value: 'pstz',
            checked: false,
        },
        {
            label: '政策制度',
            value: 'zczd',
            checked: false,
        },
        {
            label: '知识库',
            value: 'zsk',
            checked: false,
        },
        {
            label: '常见问题',
            value: 'cjwt',
            checked: false,
        },
    ]);

    const [list, setList] = useState([
        {
            title: '通知公告名称1111',
            ywlx: 'pstz',
            content: '公告简介:公告简介公告简介公告简介公告简介公告简介公告简介公告简介公告简介公告简介公告简介介公告简介公告简介公告简介公告简介',
        },
        {
            title: '通知公告名称1111',
            ywlx: 'zczd',
            content: '公告简介:公告简介公告简介公告简介公告简介公告简介公告简介公告简介公告简介公告简介公告简介介公告简介公告简介公告简介公告简介',
        },
        {
            title: '通知公告名称1111',
            ywlx: 'zsk',
            content: '公告简介:公告简介公告简介公告简介公告简介公告简介公告简介公告简介公告简介公告简介公告简介介公告简介公告简介公告简介公告简介',
        },
        {
            title: '通知公告名称1111',
            ywlx: 'cjwt',
            content: '公告简介:公告简介公告简介公告简介公告简介公告简介公告简介公告简介公告简介公告简介公告简介介公告简介公告简介公告简介公告简介',
        },
        {
            title: '通知公告名称1111',
            ywlx: 'pstz',
            content: '公告简介:公告简介公告简介公告简介公告简介公告简介公告简介公告简介公告简介公告简介公告简介介公告简介公告简介公告简介公告简介简介公告简介公告简简介公告简介公告简简介公告简介公告简',
        },
    ]);
    const [checkedList, setCheckedList] = useState([]);

    useEffect(() => {
        setCheckedList(list);
    }, [props]);

    //切换条件
    const toggle = (item, index) => {
        const element = document.getElementById('option');
        if (element) {
            element.scroll({
                top: 0,
                left: 50 * Number(index), // 计算目标位置
                behavior: 'smooth',
            });
        }
        const newoptions = options.map((res) => {
            return {
                ...res,
                checked: res == item,
            };
        });
        setOptions(newoptions);
        toggleList(item);
    };
    const toggleList = (item) => {
        if (item.value == 'zj') {
            setCheckedList(list);
        } else {
            const newList = list.filter((res) => {
                return res.ywlx == item.value;
            });
            setCheckedList(newList);
        }
    };

    return (
        <>
            <div className={style.container}>
                <div className={style.top}>
                    <SearchBar
                        placeholder="输入事项名称或者关键字"
                        className={style.search}
                        style={{
                            '--background': 'rgba(255, 255, 255, 0.35)',
                            '--height': '32px',
                            '--placeholder-color': 'rgba(255, 255, 255, 0.65)',
                        }}
                    />
                </div>
                <div className={style.option} id="option">
                    {options.map((item, index) => {
                        return (
                            <div
                                key={index}
                                className={`${item.checked ? style.checked : style.block}`}
                                onClick={() => {
                                    toggle(item, index);
                                }}
                            >
                                {item.label}
                            </div>
                        );
                    })}
                </div>
                <div className={style.content}>
                    {checkedList.map((item, index) => {
                        return (
                            <div key={index} className={style.card}>
                                <div style={{ display: 'flex', alignItems: 'center', borderBottom: '1px solid #979797' }}>
                                    {item.ywlx == 'pstz' && <Tag color="#2db7f5">评审通知</Tag>}
                                    {item.ywlx == 'zczd' && <Tag color="#1ac4c4">政策制度</Tag>}
                                    {item.ywlx == 'zsk' && <Tag color="#87d068">知识库</Tag>}
                                    {item.ywlx == 'cjwt' && <Tag color="#cf1322">常见问题</Tag>}

                                    <span className={style.title}>{item.title}</span>
                                </div>

                                <div className={style.desc}>
                                    <Ellipsis direction="end" content={item.content} rows={2} />
                                </div>
                            </div>
                        );
                    })}
                    {checkedList.length == 0 && <Empty style={{ padding: '64px 0' }} imageStyle={{ width: 128 }} description="暂无数据" />}
                </div>
            </div>
        </>
    );
}

三、css样式

复制代码
::-webkit-scrollbar {
    width: 0px;
}

.container {
    height: 100vh;
    width: 100%;
    overflow-y: auto;
    overflow-x: hidden;
    position: fixed;
    font-size: 14px;

    .top {
        background-color: #BF120D;
        height: 90px;
        display: flex;
        align-items: center;

        .search {
            width: 95%;
            margin: auto;
            padding-top: 20px;
        }
    }

    .option {
        display: flex;
        align-items: center;
        overflow-x: auto;
        min-height: 70px;

        .block {
            color: #979797;
            font-weight: 400;
            border-radius: 6px;
            border: 1px solid #979797;
            margin: 0px 10px;
            padding: 5px 10px;
            min-width: 100px;
            text-align: center;
        }

        .checked {
            color: #fff;
            background-color: #BF120D;
            font-weight: 400;
            border-radius: 6px;
            border: 1px solid #BF120D;
            margin: 0px 10px;
            padding: 5px 10px;
            min-width: 100px;
            text-align: center;
            position: relative;
        }

        .checked::after {
            content: '';
            position: absolute;
            left: 50%;
            bottom: -10px;
            /* 小箭头的位置调整 */
            width: 0;
            height: 0;
            border-left: 10px solid transparent;
            border-right: 10px solid transparent;
            border-top: 10px solid #BF120D;
            /* 小箭头的颜色 */
            transform: translateX(-50%);
        }
    }

    .content {
        position: relative;
        margin-bottom: 10%;

        .card {
            padding: 10px;
            border-radius: 8px;
            margin: 10px auto;
            width: 96%;
            background-color: #fff;
            display: flex;
            align-items: center;

            .title {
                font-weight: 600;
                display: flex;
                align-items: center;
                line-height: 0.3rem;
                font-size: 0.18rem;
            }

            .sj {
                text-align: end;
                color: #999;
            }
        }
    }

    // 消息明细
    .detail_content {
        padding: 10px;
        background-color: #fff;

        .title {
            font-size: 0.16rem;
            font-weight: 700;
            line-height: 0.4rem;
            text-align: center;
        }

        .qt {
            display: flex;
            align-items: center;
            justify-content: space-between;
            color: #999;
            line-height: 0.4rem;
        }
    }

}
相关推荐
百万蹄蹄向前冲1 小时前
Trae分析Phaser.js游戏《洋葱头捡星星》
前端·游戏开发·trae
朝阳5812 小时前
在浏览器端使用 xml2js 遇到的报错及解决方法
前端
GIS之路2 小时前
GeoTools 读取影像元数据
前端
ssshooter3 小时前
VSCode 自带的 TS 版本可能跟项目TS 版本不一样
前端·面试·typescript
Jerry3 小时前
Jetpack Compose 中的状态
前端
dae bal4 小时前
关于RSA和AES加密
前端·vue.js
柳杉4 小时前
使用three.js搭建3d隧道监测-2
前端·javascript·数据可视化
lynn8570_blog4 小时前
低端设备加载webp ANR
前端·算法
LKAI.5 小时前
传统方式部署(RuoYi-Cloud)微服务
java·linux·前端·后端·微服务·node.js·ruoyi
刺客-Andy5 小时前
React 第七十节 Router中matchRoutes的使用详解及注意事项
前端·javascript·react.js