一次后台管理时间筛选开发经历

2023-11-10

这个需求是一个独立出来的,没有他的接口。在页面的左上角,有一个antd的时间选择框,有起止时间。在页面的右边,是一个查询按钮,点击查询按钮之后,页面就筛选出符合标准的数据

其实除了日期筛选,之前还有一个类型筛选,再加上本页面的数据是通过接口调的,而其中的请求参数是状态,0,1,2,3.所以正好可以获取到类型筛选的值,直接去放参数里,从而筛选页面的渲染数据。

但是这个时间选择框的话,只是去对数据中的一条,也就是时间进行筛选,不是调接口。所以我就先想了一个大概流程。
 

// 先声明一个变量,默认值为空,当时间选择之后,把起止时间戳放进变量里(参数1,开始时间,参数2,结束时间),查询按钮,点击的时候
//判断此变量是否为空,为空就直接调用页面渲染方法,否的话把渲染之后的参数循环,筛选。留下复合标准的数据,再调用dataSource方法,其参数就是之前留下来的值。最后每次修改时间时,更改dataSource。实现动态变化。其优先级高于类型筛选。

这里面后来总结的一个很关键的点,就是dayjs里面有个插件是可以进行日期比较的,这个在后面为我实现筛选逻辑判断提供了帮助。
 

先从第一步开始,声明一个变量,哦对,其实是两个变量

const [searchDateStart, setSearchDateStart] = useState<any>(2022 - 1 - 1) //展示選中時間内的數據(開始)
const [searchDateEnd, setSearchDateEnd] = useState<any>(2122 - 1 - 1) //展示選中時間内的數據(結束)

对了,我还给他们设置了默认值。这样就算一开始的时候他们能正常显示所有数据。先来看日期选择框内的功能


		<Form.Item
            name="range"
            label="发布时间"
            style={{
              marginTop: '24px'
            }}>
            <DatePicker.RangePicker
              format="YYYY-MM-DD "
              onChange={value => {
                dateOnChange(value)
              }}
            />
          </Form.Item>

也就是这个,onChange事件是在当前内容发生变化的时候的回调。我顺手把选出来的value值传了进去,format是年月日这种。也就是说只显示到(不过他的数据自己还是带时分秒的需要自己处理)

dateOnChange(value)现在去找这个函数

//日期選擇
  const dateOnChange = async time => {
    console.log('time', time)
    if (time === null) {
      setSearchDateStart(2022 - 1 - 1)
      setSearchDateEnd(2122 - 1 - 1)
      const { data } = await getNotice(state)
      setDataSource(data)
    } else {
      // 設置選擇的開始時期
      setSearchDateStart(dayjs(time[0]._d).format('YYYY-MM-DD'))
      // 設置選擇的結束時期
      setSearchDateEnd(dayjs(time[1]._d).format('YYYY-MM-DD'))
    }
  }

time就是value的形参

log了一下time,打印出来了的是两个参数

time (2) [Moment, Moment]

在一番观察之后,form中输入的时间是长这样的


Moment
_d: Wed Jun 29 2022 10:10:05 GMT+0800 (中国标准时间) {}
_isAMomentObject: true
_isUTC: false
_isValid: true
_locale: Locale {_calendar: {…}, _longDateFormat: {…}, _invalidDate: 'Invalid date', _dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, ordinal: ƒ, …}
_pf: {empty: false, unusedTokens: Array(0), unusedInput: Array(0), overflow: -2, charsLeftOver: 0, …}
[[Prototype]]: Object

为什么还有个if判断呢,因为当点击清除按钮之后,表单时间值为null这个时候只需要把所有数据展示出来就行

time : null

反正现在可以先不看他

看看else里面的

 else {
      // 設置選擇的開始時期
      setSearchDateStart(dayjs(time[0]._d).format('YYYY-MM-DD'))
      // 設置選擇的結束時期
      setSearchDateEnd(dayjs(time[1]._d).format('YYYY-MM-DD'))
    }

起始时间和结束时间都有了。格式为'YYYY-MM-DD',

现在我来介绍一下查询按钮

<Button type="primary" onClick={() => getNoticeData()}>
  查询
</Button>

getNoticeData()这个方法本来做的事情,就是去更新table数据调取数据接口
 

现在getNoticeData()更改为这样

  // form數據更新
  const getNoticeData = useCallback(async () => {
    const { data } = await getNotice(state)
    setDataSource(data)
    if (!(searchDateStart === 2022 - 1 - 1 && searchDateEnd === 2122 - 1 - 1)) {
      dataChange(data)
    }
  }, [state, searchDateStart, searchDateEnd, form])

依赖项加上了起始时间结束时间,只要他们两个有一个更新,那这个函数就重新加载而当时间选择框数值更改的时候,又调用上面的设置起止时间的函数。就可以基本实现同步了
 

看下里面的逻辑

const { data } = await getNotice(state)
setDataSource(data)

这两句是原本的内容,实现的功能就是设置了table数据,数据的来源是后台调来的
 

if (!(searchDateStart === 2022 - 1 - 1 && searchDateEnd === 2122 - 1 - 1)) {
      dataChange(data)
    }

这一句才是我为了这次的任务更改的。

判断了起止值,是否不是原来的值。只要不是了,那必然是用户更改了。那就调用dataChange函数
 

关键的筛选部分来了

 // 日期筛选
  const dataChange = dataChange => {
    console.log('dataChange', dataChange)
    dataChange.data.map((item, index) => {
      if (dayjs(dayjs(item.publish_time * 1000).format('YYYY-MM-DD')).isBetween(searchDateStart, searchDateEnd, 'day', '[]')) {
        console.log('第' + index + '列符合条件' + '此条内容为' + item)
        console.log(item)
        timeArray.push(item)
      }
    })
    console.log(timeArray)
    setDataSource({ msg: '', code: 0, data: timeArray })
    console.log(dataSource)
    setTimeArray([])
  }


参数就是刚刚那个data值,这边换个名字叫dataChange

这个的作用就是筛选和push进新数组,那个数组的内容就是要保留的内容
打印了一下。

dataChange {msg: '', code: 0, data: Array(5)}code: 0data: (5) [{…}, {…}, {…}, {…}, {…}]msg: ""[[Prototype]]: Object

当时仔细观察了一番,其实就是基础的页面数据。data里面就是我们需要修改的数组

每一个data里面都张这样的

0: {id: 77, publish_time: 1656518400, publish_data: 'hhh', state: 0}

比如第0条就是长这样

可以看见,这里的publish_time是个十位数的时间戳。关于对比时候的细节我弄了很久,试过。全转换成时间戳,结果发现有问题,时间选择器的数据是那种中国标准时间那东西,转成时间戳之后就发现数位为13,但是怎么去加上减去时间都不对。最后放弃了这个方法,在询问了大哥之后,得知了dayjs可以选择区间
 

于是就和dayjs的插件一起使用。我这边用的插件是between

先引入进来

import isBetween from '../../../node_modules/dayjs/plugin/isBetween'

这个要在dayjs里面好好找路径

  dayjs.extend(isBetween)

这样就可以使用了。

最后是把两个时间数都变成日期格式,
而这个刚才就弄好了

	// 設置選擇的開始時期
      setSearchDateStart(dayjs(time[0]._d).format('YYYY-MM-DD'))
      // 設置選擇的結束時期
      setSearchDateEnd(dayjs(time[1]._d).format('YYYY-MM-DD'))

在回头看看主要的判断逻辑

 dataChange.data.map((item, index) => {
      if (dayjs(dayjs(item.publish_time * 1000).format('YYYY-MM-DD')).isBetween(searchDateStart, searchDateEnd, 'day', '[]')) {
        console.log('第' + index + '列符合条件' + '此条内容为' + item)
        console.log(item)
        timeArray.push(item)
      }
    })

isBetween就是dayjs的一个插件api,最后的参数决定了包含与否'[]'就是包含,倒数第二个参数决定了比到哪个日期节点,这边是“day”也就是日了
 

timeArray是一个自己创建的常量,这里存储的是一个数组,所有的符合条件的数组
 


下面在循环结束之后把值赋给新的dataSource在渲染结束之后,再重置TimeArray。以让下次选择时间的时候不至于直接继续新增数组
 

   console.log(timeArray)
    setDataSource({ msg: '', code: 0, data: timeArray })
    console.log(dataSource)
    setTimeArray([])

好啦,setDataSource之后就大功告成了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一次后台管理时间筛选开发经历 的相关文章

  • MongoDB安装部署

    一 mongodb安装部署 关闭防火墙和selinux root mongodb iptables F root mongodb setenforce 0 root mongodb systemctl stop firewalld 2 指定
  • hdu 3879 最大密集子图(点和边均带权)(模板)

    最大权闭合图 可以用最大密集子图来解速度更快复杂度低 题解 胡伯涛 最小割模型在信息学竞赛中的应用 点和边均带权的最大密集子图 s i 权为U 点权绝对值和 边的所有权值 i t 权为U 点的值 点的度 u v 权值为w 意思是选了v后可以
  • Mybatis-plus使用手册

    Mybatis plus 1 定义 MyBatis Plus 是一个 Mybatis 增强版工具 在 MyBatis 上扩充了其他功能没有改变其基本功能 为了简化开发提交效率而存在 2 使用 SpringBoot 集成 MyBatis Pl
  • 相关性分析

    这里的相关性分析主要是线性相关性分析 当然其他的形状的相关性分析可以通过变换转换为线性相关性分析 但是 线性相关性分析始终是相关性分析的基础 线性相关分析的构建主要分为以下几种 直接绘制散点图 通过把点标出来主观上看是否是线性相关 绘制散点

随机推荐

  • 《动手学深度学习》第二十三天---稠密连接网络(DenseNet)

    一 DenseNet DenseNet作为另一种拥有较深层数的卷积神经网络 具有如下优点 1 相比ResNet拥有更少的参数数量 2 旁路加强了特征 feature 的重用 3 网络更易于训练 并具有一定的正则效果 4 缓解了gradien
  • Android Studio按钮背景色

    Android Studio按钮背景色改变 修改style xml theme xml 在Android Studio里写前端界面 修改Button的背景样式一直是系统默认的主题色就像这样 不管怎么改颜色都会是系统的默认主题色 这里我们需要
  • LC并联谐振电路的原理

    LC并联谐振电路的原理 2011 11 26 04 54 353744594 来自 手机知道 分类 电脑 网络 浏览6573次 LC并联谐振电路的原理 我怎么不能理解这个原理 能不能用生活中的例子来说明 谢谢 提问者采纳 2011 11 2
  • Springboot使用maven打包指定mainClass

    http jvm123 com 2019 12 springboot repackage html
  • 六、Linux系统编程:读写锁

    5 读写锁 读写锁 ReentrantReadWriteLock 就是读线程和读线程之间不互斥 读读不互斥 读写互斥 写写互斥 一个资源可以被多个读线程访问 也可以被一个写线程访问 但不能同时存在读写线程 读写互斥 读读共享 5 1 锁操作
  • Meetup预告

    2月份 我们匠心打磨的区块链跨链协作平台WeCross正式开源 技术白皮书同期发布 很多小伙伴认真品读研究之后 给我们提供了非常多及时和有益的反馈 我们深表感谢 关于WeCross的设计哲学 我们思考了四个方向 Synergetic 跨链业
  • Ceph入门到精通-存储集群ceph df 用量统计算法说明

    3 2 5 Ceph 如何计算数据使用量 used 值反映了使用的实际原始存储量 xxx GB xxx GB 代表可用的存储 其中较小的数字 和总存储容量 总容量反映了在复制 克隆或快照前存储数据的大小 因此 实际存储的数据量通常会超过名义
  • Android基础学习(十七)—— Retrofit

    Retrofit本身并没有提供网络访问的能力 但是它底层封装了OkHttp 也是由Square公司贡献的一个处理网络请求的开源项目 A type safe HTTP client for Android and Java https git
  • parent.layer.closeAll();关闭弹出层

    可参考文档 https wenku baidu com view e05a3fe15bf5f61fb7360b4c2e3f5727a5e92486 html 关闭所有页面 parent layer closeAll 先得到当前ifame层的
  • 数据库的备份与恢复

    目录 1 数据库的备份与恢复是什么 2 数据库的备份与恢复的三种常见方法 2 1 使用第三方工具 我用的是navicat 导入 导出 2 2 使用mysqldump命令备份和恢复 导入 导出 2 3 LOAD DATA INFILE 导入
  • ArcGIS制作全球地图并生成纬度统计分布线

    转载 ArcGIS制作全球地图并生成纬度统计分布线https mp weixin qq com s LTA9I2lZ1nwA1xdHlD9vjg
  • MYSQL数据导入导出&视图&索引&执行计划

    目录 一 数据导入 导出 二 视图运用 三 索引 四 执行计划 一 数据导入 导出 创建log数据表 CREATE TABLE t log id varchar 32 NOT NULL COMMENT 唯一标识 ip varchar 15
  • C++STL库之sort函数

    sort函数 sort函数介绍 背景 功能 语法 便捷函数 sort函数应用 普通排序 结构体排序 sort函数介绍 背景 sort函数用于C 中 对给定区间所有元素进行排序 默认为升序 也可进行降序排序 sort函数进行排序的时间复杂度为
  • 【Meta-AI】Sam-分割一切 测试

    什么是 SAM 近日 Meta AI在官网发布了基础模型 Segment Anything Model SAM 并开源 其本质是用GPT的方式 基于Transform 模型架构 让计算机具备理解了图像里面的一个个 对象 的通用能力 SAM模
  • 【数学建模笔记 13】数学建模的差分方程模型

    13 差分方程模型 定义 设函数 x k x k x k x k
  • Go语言从入门到规范-6.9、Go处理yml和ini文件

    Go语言从入门到规范 6 9 Go处理yml和ini文件 文章目录 Go语言从入门到规范 6 9 Go处理yml和ini文件 1 前言 2 ini概念 2 1 概述 2 2 格式 2 3 示例 3 Go语言处理ini文件 1 前言 一般ym
  • 聊聊缓存相关知识

    文章目录 缓存原理 缓存穿透 缓存击穿 缓存雪崩 穿透 击穿 雪崩对比 缓存预热 缓存更新 缓存降级 缓存原理 缓存穿透 缓存穿透 指用户查询数据 在数据库没有 自然在缓存中也不会有 这样就导致用户查询的时候 在缓存中找不到 每次都要去数据
  • 用arcgis for javascript 开发一个简单的二维地图(入门案例)

    效果如图 一 引入arcgis 2 加载模块 使用第二个标记从 API 加载特定模块 使用以下代码片段中的语法加载以下模块 esri Map 加载特定于创建地图的代码 esri views MapView 加载允许以 2D 方式查看地图的代
  • 时间旅行java_[ 一起学React系列 -- 6 ] 秘术之时间旅行-1

    标题看起来挺新颖的 笔者都觉得很高大上是不是哈哈 抛转 时间旅行在生活中是一个非常吸引人的概念 虽然现在无法实现但说不定未来的某天就实现了 然后就穿梭会过去杀掉小时候的自己然后就开始懵逼自己是谁类似的狗血剧情 那么问题来了 我们能活到那个时
  • 一次后台管理时间筛选开发经历

    这个需求是一个独立出来的 没有他的接口 在页面的左上角 有一个antd的时间选择框 有起止时间 在页面的右边 是一个查询按钮 点击查询按钮之后 页面就筛选出符合标准的数据 其实除了日期筛选 之前还有一个类型筛选 再加上本页面的数据是通过接口