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

news2024/11/15 13:03:59

一、实现效果

二、代码

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;
        }
    }

}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2180644.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kafka学习笔记(三)Kafka分区和副本机制、自定义分区、消费者指定分区

文章目录 前言7 分区和副本机制7.1 生产者分区写入策略7.1.1 轮询分区策略7.1.2 随机分区策略7.1.3 按key分区分配策略7.1.4 自定义分区策略7.1.4.1 实现Partitioner接口7.1.4.2 实现分区逻辑7.1.4.3 配置使用自定义分区器7.1.4.4 分区测试 7.2 消费者分区分配策略7.2.1 RangeA…

【MySQL】常见的SQL优化方式(二)

目录 1、limit 优化 &#xff08;1&#xff09;延迟关联&#xff08;索引覆盖子查询&#xff09; &#xff08;2&#xff09; 已知位置查询 2、group by 优化 &#xff08;1&#xff09;使用索引 &#xff08;2&#xff09;避免排序 &#xff08;3&#xff09;分析查询 …

LeetCode[中等] 739. 每日温度

给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 思路 栈 暴力法为遍历列…

毕业论文不会写?教你如何利用AI来帮我完成初稿

AI是个工具&#xff0c;它能帮你提高效率&#xff0c;但可不能完全替代你的工作。所以&#xff0c;你要做的是学会如何利用AI来辅助你的毕业论文写作。 writehelp智能写作辅导&#xff1a;可节约1000小时写作时间帮助快速完成初稿的撰写。 传送门&#xff1a;http://www.write…

Qt Linguist手册-翻译员

翻译人员 Qt Linguist 是为 Qt 应用程序添加翻译的工具。一旦安装了 Qt&#xff0c;就可以像开发主机上的其他应用程序一样启动 Qt Linguist。 Qt Linguist 主窗口包含一个菜单栏和以下视图&#xff1a; 上下文 (F6) 用于从上下文列表中选择要翻译的字符串。字符串 (F7) 用于…

软考中级网络工程师下午题近五年笔记

刷题地址&#xff1a;软考达人—专业的软考刷题题库&#xff0c;软考历年真题&#xff0c;软考模拟考试&#xff0c;软考考前押题。柴丁科技 (ruankaodaren.com) 上面这个网站有的图不清晰&#xff0c;也可以看这个网站策未来网校——在线刷题、智能刷题 (ceweilai.cn) 2019…

[leetcode] 71. 简化路径

文章目录 题目描述解题方法栈java代码复杂度分析 题目描述 给你一个字符串 path &#xff0c;表示指向某一文件或目录的 Unix 风格 绝对路径 &#xff08;以 / 开头&#xff09;&#xff0c;请你将其转化为 更加简洁的规范路径。 在 Unix 风格的文件系统中规则如下&#xff1…

springboot+大数据+基于协同过滤算法的校园食堂订餐系统【内含源码+文档+部署教程】

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ &#x1f345;由于篇幅限制&#xff0c;想要获取完整文章或者源码&#xff0c;或者代做&am…

25:stm32的低功耗模式

低功耗模式 1、PWR电源控制2、低功耗模式 1、PWR电源控制 PWR&#xff08;Power Control&#xff09;电源控制。PWR负责管理STM32内部的电源供电部分&#xff0c;可以实现可编程电压监测器和低功耗模式的功能&#xff0c;这里我们只学习低功耗模式的功能&#xff0c;低功耗模式…

【AI】AIOT简介

随着技术的快速发展&#xff0c;人工智能AI和物联网IoT已经成为当今最热门的技术领域。AIOT是人工智能和物联网的结合&#xff0c;使物联网设备更加智能化&#xff0c;能够进行自主决策和学习的技术。 通过物联网产生、收集来自不同维度的、海量的数据存储于云端、边缘端&#…

Netty源码-业务流程之写数据

Netty基本介绍&#xff0c;参考 Netty与网络编程 1、源码分析&#xff0c;EchoServerHandler之Write流程 1.1 write流程入口 通常我们通过ChannelRead收到消息后&#xff0c;需要给一个响应&#xff0c;通过ctx.write()将响应返回客户端。 在自定义handler的channelRead方法…

极限电流型氧传感器的工作原理以及有哪些应用场景?

极限电流型氧传感器的工作原理&#xff1a; 极限电流型氧传感器的工作原理基于稳定ZrO2固体电解质的氧泵作用。在已稳定化ZrO2两侧被覆铂电极&#xff0c;阴极侧用有气体扩散孔的罩接合&#xff0c;形成阴极空腔。在一定的温度下&#xff0c;当ZrO2电极两侧加一定电压时&#…

使用AOP处理参数

说明&#xff1a;在一些时候&#xff0c;我们需要在接口介绍到参数前处理参数&#xff0c;像参数校验、参数转换等&#xff0c;本文介绍如何使用AOP来实现此需求。 场景 需求&#xff1a;有一批开放给第三方调用的接口&#xff0c;之前传递的都是用户表的ID&#xff0c;现在需…

vscode 内网不联网如何导入vscode插件

如果有小伙伴百度到这篇文章&#xff0c;那一定是遇到了在内网开发不能联网的问题&#xff0c;那就往下看看吧。 安装一个新的Visual Studio Code&#xff0c;需要必要的一些插件&#xff0c;但是不能联网&#xff0c;于是自带的扩展程序安装便不能用了。 1、在一台能访问外网…

Kali Linux入门教程(非常详细)从零基础入门到精通,看完这一篇就够了。

作为一名从事渗透测试的人员&#xff0c;不懂Kali Linux的话&#xff0c;就out了。它预装了数百种享誉盛名的渗透工具&#xff0c;使你可以更轻松地测试、破解以及进行与数字取证相关的任何其他工作。 今天给大家分享一套Kali Linux资料合集&#xff0c;包括12份Kali Linux渗透…

数据结构-栈(理解版)

一、栈的定义 相信大家对于栈或多或少有一些了解&#xff0c;可能大多数人会告诉你栈是一种先进后出的数据结构。这其实说了跟没说一样(❁◡❁)&#xff01;当然&#xff08;last in&#xff0c;first out&#xff09;是栈最有特色的性质。 这里可以给大家一些比较好理解的例…

车辆重识别(改进的去噪扩散概率模型)论文阅读2024/9/29

所谓改进的去噪扩散概率模型主要改进在哪些方面&#xff1a; ①对数似然值的改进 通过对噪声的那个方差和T进行调参&#xff0c;来实现改进。 ②学习 这个参数也就是后验概率的方差。通过数据分析&#xff0c;发现在T非常大的情况下对样本质量几乎没有影响&#xff0c;也就是说…

Python库matplotlib之四

Python库matplotlib之四 小部件(widget)RadioButtons构造器APIs应用实列 Slider构造器APIs应用实列 小部件(widget) 小部件(widget)可与任何GUI后端一起工作。所有这些小部件都要求预定义一个Axes实例&#xff0c;并将其作为第一个参数传递。 Matplotlib不会试图布局这些小部件…

基于Springboot+Vue的c语言学习辅导网站的设计与实现 (含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统中…

美洽客户服务AI Agent 1.0,全渠道多场景赋能业务增长

“到 2025 年&#xff0c;由 AI 驱动的客户服务交互将增长 400%。” ——Gartner “70% 的企业报告称&#xff0c;在实施 AI 驱动的客户服务平台后&#xff0c;客户满意度分值提升。” ——麦肯锡 在美洽 AI 中心负责人看来&#xff0c;未来几年&#xff0c;AI 之于企业将由辅助…