【Vue2】一个数组按时间分割为【今年】和【往年】俩个数组

news/2024/7/10 1:29:05 标签: vue, javascript

一. 需求

后端返回一个数组,前端按时间维度将该数组的分割为【今年】和【往年】俩个数组
  1. 后端返回的数组格式如下
timeList:[
	{id:1,billTime:"2024-01-10",createTime:"2024-01-10 00:00:00",status:0},
	{id:2,billTime:"2022-05-25",createTime:"2022-05-25 00:00:00",status:1},
	{id:3,billTime:"2022-03-23",createTime:"2022-03-23 00:00:00",status:2},
	{id:4,billTime:"2022-02-11",createTime:"2022-02-11 00:00:00",status:0},
	{id:5,billTime:"2022-01-01",createTime:"2022-01-01 00:00:00",status:2},
	{id:6,billTime:"2021-12-01",createTime:"2021-12-01 00:00:00",status:2},
	{id:7,billTime:"2021-11-01",createTime:"2021-11-01 00:00:00",status:2},
]
  1. 需要的数组如下
// 往年
preYear:[
	{billTime:"2022-05",value:"2022-05"},
	{billTime:"2022-03",value:"2022-03"},
	{billTime:"2022-02",value:"2022-02"},
	{billTime:"2022-01",value:"2022-01"},
	{billTime:"2021-12",value:"2021-12"},
	{billTime:"2021-11",value:"2021-11"},
]
// 今年
newYear:[
	{billTime:"2024-01",value:"2024-01"},
]
  1. 效果如下
    全部账期【今年账期】(点击切换标签)、往年账期(下拉框)

在这里插入图片描述

二. 实现

<template>
	<div>
		<!-- 本年账期 -->
		<el-radio-group v-model="newTime" @change="handleChangeNewTime" size="mini">
			<el-radio-button v-for="(item,index) in newYear" :key="index" :label="item.billTime" :value="item.value">
				<template>
					<span>{{item.value}}</span>
				</template>
			</el-radio-button>
		</el-radio-group>
		<!-- 往年账期 -->
		<el-button size="mini" style="margin-left: 20px" split-button>往年账期</el-button>
		<el-select @change="billTimeSearch" v-model="preTime" size="mini" placeholder="请选择" clearable>
			<el-option v-for="(item,index) in preYear" :key="index" :label="item.billTime" :value="item.billTime">
			</el-option>
		</el-select>
	<div>
</template>

<script>
import { getBillTime,getList } from "@/api/xxx"
import { dateFormat } from "@/utils/index";

	export default{
		data(){
			return{
				query:{
					pageNum:1,
					pageSize:10,
					startTime:"" // 选中的账期
				},
				list:[],
				listLoading:false,
				newYear:[], // 本年账期列表
				preYear:[], // 往年账期列表
				preTime:"", // 选中的往年账期
				newTime:""	// 选中的今年账期
			}
		},
		mounted(){
			this.fetchData()
			this.getBillTime()
		},
		methods:{
			/**
			* 初始化列表数据
			*/
			fetchData(){
				this.listLoading = true
				getList(this.query).then(res=>{
					this.list = res.data.list
					this.listLoading = false
				})
			},

			/**
			* 获取列表,并按照时间分割为【往年】和【今年】账期
			*/
			getBillTime(){
				getBillTime().then(res=>{
					let currentYear = this.formatDateYear(new Date())
					res.data.list.forEach(item=>{
						item.billTime = this.formatDate(item.billTime)
						let obj = {billTime:item.billTime,value:item.billTime};
						if(item.billTime.indexOf(currentYear) == -1 || this.newYear.length == 12){
							this.preYear.push(obj)
							// 去重
							this.preYear = this.preYear.reduce((preVal,curVal) => {
                            	object[curVal.billTime] ? "" : (object[curVal.billTime] = preVal.push(curVal));
                            	return preVal;
                        	}, []);
						}else{
							this.newYear.push(obj);
                        	// 账单日重复问题
                        	let object = {};
                        	this.newYear = this.newYear.reduce((preVal, curVal) => {
                            	object[curVal.billTime] ? "" : (object[curVal.billTime] = preVal.push(curVal));
                            	return preVal;
                        	}, []);
						}
					});
					var result = this.newYear.some(item => {
                    	if (item.billTime == "") {
                        	return true;
                    	}
                	});
                	if (!result) {
                    	// 如果存在
                    	this.newYear.unshift({ billTime: "", value: "全部账单" });
               		}
				})
			},

			/**
         	* 切换今年账单日标签项
         	* @param {String} val 
         	*/
        	handleChangeNewTime(val) {
            	this.query.startTime = val;
            	this.preTime = ""
            	// this.$refs.orderListRef.clearSelection();
            	this.fetchData();
        	},

        	/**
         	* 往年账单筛选 此处仅需要传一个值年月即可,后端进行模糊查询
         	* @param {String} val 
         	*/
        	billTimeSearch(val) {
            	this.query.startTime = val;
            	this.newTime = ""
            	this.fetchData();
        	},

        	/**
         	* 账单日格式化
         	* @param {Date} date 
         	*/
        	formatDate(date) {
            	return dateFormat(new Date(date), "yyyy-MM");
        	},
        	formatDateYear(date) {
            	return dateFormat(new Date(date), "yyyy");
        	},
		}
	}
</script>

三. 时间转换

@/utils/index

//格式化时间
export function dateFormat(date, format) {
  format = format || "yyyy-MM-dd hh:mm:ss";
  if (date !== "Invalid Date") {
    let o = {
      "M+": date.getMonth() + 1, //month
      "d+": date.getDate(), //day
      "h+": date.getHours(), //hour
      "m+": date.getMinutes(), //minute
      "s+": date.getSeconds(), //second
      "q+": Math.floor((date.getMonth() + 3) / 3), //quarter
      S: date.getMilliseconds() //millisecond
    };
    if (/(y+)/.test(format))
      format = format.replace(
        RegExp.$1,
        (date.getFullYear() + "").substr(4 - RegExp.$1.length)
      );
    for (let k in o)
      if (new RegExp("(" + k + ")").test(format))
        format = format.replace(
          RegExp.$1,
          RegExp.$1.length === 1 ?
          o[k] :
          ("00" + o[k]).substr(("" + o[k]).length)
        );
    return format;
  }
  return "";
}

http://www.niftyadmin.cn/n/5316292.html

相关文章

vue for循环不建议使用index作为key的原因

先看下面一个例子&#xff1a; <template><div><button click"clickHandler">删除</button><template><div v-for"(item, index) in list" :key"index" >{{item.name}}</div></template></…

lvs+keepalived+nginx双主模式双主热备实现负载均衡

目录 一、原理 二、真实服务器nginx配置 三、lvs的keepalived配置 3.1 配置文件 3.2 开启keepalived服务 四、测试 4.1 测试访问VIP 4.2 模拟lvs01宕机 主机名IPnginx0111.0.1.31nginx0111.0.1.31lvs0111.0.1.33lvs0211.0.1.34VIP111.0.1.29VIP211.0.1.30 一、原理 lvskeepal…

pulsar的架构与特性记录

一、什么是云原生 云原生的概念是2013年Matt Stine提出的,到目前为止&#xff0c;云原生的概念发生了多次变更&#xff0c;目前最新对云原生定义为: Devps持续交付微服务容器 而符合云原生架构的应用程序是: 采用开源堆栈(K8SDocker)进行容器化&#xff0c;基于微服务架构提高灵…

【MySQL】MySQL版本8+ 的 with recursive 递归语法初次使用

力扣题 1、题目地址 1613. 找到遗失的ID 2、模拟表 表&#xff1a;Customers Column NameTypecustomer_idintcustomer_namevarchar customer_id 是该表主键.该表第一行包含了顾客的名字和 id. 3、要求 编写一个解决方案, 找到所有遗失的顾客 id。遗失的顾客 id 是指那些…

UE5 实现RPG游戏操作控制

在UE5以后&#xff0c;epic抛弃了之前的那一套操作输入系统&#xff0c;使用了一套新的增强输入作为替代&#xff0c;目的主要是解决经常切换操作时的问题&#xff08;操作人物上车以后&#xff0c;可以直接切换成操作汽车的一套输入&#xff09;接下来&#xff0c;将实现如何使…

ORACLE RAC DG文件路径错乱解决办法

最近接手了一个客户的RAC-RAC dg环境的维护,登录上去之后发现dg延迟了8天,由于主库的空间非常紧张,归档日志早就删除了,所以准备使用rman基于scn点的备份恢复的方案恢复dg同步 在备份完成之后,使用新的控制文件进行数据恢复的时候报错datafile 43 not found: 检查了一下发现当…

uniapp中实现H5录音和上传、实时语音识别(兼容App小程序)和波形可视化

文章目录 Recorder-UniCore插件特性集成到项目中调用录音上传录音ASR语音识别 在uniapp中使用Recorder-UniCore插件可以实现跨平台录音功能&#xff0c;uniapp自带的recorderManager接口不支持H5、录音格式和实时回调onFrameRecorded兼容性不好&#xff0c;用Recorder插件可避免…

docker微服务案例

文章目录 建立简单的springboot项目(boot3)boot2建立通过dockerfile发布微服务部署到docker容器编写Dockerfile打包成镜像运行镜像微服务 建立简单的springboot项目(boot3) 1.建立module 2. 改pom <?xml version"1.0" encoding"UTF-8"?> <…