Vue3+vantUI3时间组件封装过程支持选择年以及年月日时分秒

 更新时间:2024年07月17日 10:29:56   作者:杀猪刀-墨林  
这篇文章主要介绍了Vue3+vantUI3时间组件封装过程支持选择年以及年月日时分秒,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧

效果图:

代码

<script setup name="PopupAllPicker">
const emit = defineEmits(['update:modelValue', 'confirm']);
const attrs = useAttrs();
const props = defineProps({
  modelValue: {
    type: Boolean,
    default: false
  },
  values: {
    type: String,
    default: ''
  },
  title: {
    type: String,
    default: '请选择时间'
  },
  valueFormat: {
    type: String,
    default: 'YYYY-MM-DD HH:mm:ss'
  }
});
// 是否显示弹出层
const columns = ref([]);
const Mdays = ref('');
const Dindex = ref(null);
const picker = ref(null);
//  获取某年某月多少天
function getCountDays(year, month) {
  const day = new Date(year, month, 0);
  return day.getDate();
}
// 获取年月日时分秒列信息
function getColumns() {
  const strTime = props.values;
  let vModuleDate;
  if (props.values !== '') {
    vModuleDate = new Date(strTime.replace(/-/g, '/'));
  } else {
    vModuleDate = new Date(); // 没有传入时间则默认当前时刻
  }
  const Y = vModuleDate.getFullYear();
  const M = vModuleDate.getMonth();
  const D = vModuleDate.getDate();
  const h = vModuleDate.getHours();
  const m = vModuleDate.getMinutes();
  const s = vModuleDate.getSeconds();
  const year = {}; // 获取前后十年数组
  year.values = [];
  const CurrentDay = new Date().getFullYear();
  for (let i = CurrentDay - 4; i < CurrentDay + 1; i += 1) {
    year.values.push(i);
  }
  year.defaultIndex = year.values.indexOf(Y);
  const month = {};
  // 获取12月数组
  month.defaultIndex = M;
  month.values = Object.keys([...Array(13)]).map((item) => {
    if (+item + 1 <= 10) {
      return `0${item}`;
    }
    if (+item + 1 === 11) {
      return `${item}`;
    }
    return (+item + 0).toString();
  });
  month.values.splice(0, 1);
  const days = getCountDays(Y, Mdays.value === '' ? M + 1 : Mdays.value);
  const day = {}; // 创建当月天数数组
  day.defaultIndex = Dindex.value === null ? D - 1 : Dindex.value;
  day.values = Object.keys([...Array(days + 1)]).map((item) => {
    if (+item + 1 <= 10) {
      return `0${item}`;
    }
    if (+item + 1 === 11) {
      return `${item}`;
    }
    return (+item + 0).toString();
  });
  day.values.splice(0, 1);
  const hour = {}; // 创建小时数组
  hour.defaultIndex = h;
  hour.values = Object.keys([...Array(24)]).map((item) => {
    if (+item + 1 <= 10) {
      return `0${item}`;
    }
    if (+item + 1 === 11) {
      return `${item}`;
    }
    return (+item + 0).toString();
  });
  const mi = {}; // 创建分钟数组
  mi.defaultIndex = m;
  mi.values = Object.keys([...Array(60)]).map((item) => {
    if (+item + 1 <= 10) {
      return `0${item}`;
    }
    if (+item + 1 === 11) {
      return `${item}`;
    }
    return (+item + 0).toString();
  });
  const ss = {}; // 创建秒数数组
  ss.defaultIndex = s;
  ss.values = Object.keys([...Array(60)]).map((item) => {
    if (+item + 1 <= 10) {
      return `0${item}`;
    }
    if (+item + 1 === 11) {
      return `${item}`;
    }
    return (+item + 0).toString();
  });
  // 设置默认选项当前年
  if (props.valueFormat.includes('YYYY')) {
    columns.value.push(year);
  }
  if (props.valueFormat.includes('MM')) {
    columns.value.push(month); // 获取当月的天数
  }
  if (props.valueFormat.includes('DD')) {
    columns.value.push(day);
  }
  if (props.valueFormat.includes('HH')) {
    columns.value.push(hour);
  }
  if (props.valueFormat.includes('mm')) {
    columns.value.push(mi);
  }
  if (props.valueFormat.includes('ss')) {
    columns.value.push(ss);
  }
}
function onChange(values) {
  // a为所有列备选项值的数组
  const days = getCountDays(values[0], values[1]);
  const newDays = {};
  newDays.values = Object.keys([...Array(days + 1)]).map((item) => {
    if (+item + 1 <= 10) {
      return `0${item}`;
    }
    if (+item + 1 === 11) {
      return `${item}`;
    }
    return (+item + 0).toString();
  });
  newDays.values.splice(0, 1);
  // 设置第三列的值
  picker.value.setColumnValue(2, newDays.values);
  // 设置第三列索引
  picker.value.setColumnIndex(2, values[2] - 1);
}
//  关闭弹框
function onCancel() {
  Mdays.value = '';
  Dindex.value = null;
  emit('update:modelValue', false);
}
// 时间选择器确定
function onConfirm(val) {
  let endVal = '';
  for (let i = 0; i < columns.value.length; i += 1) {
    endVal += val[i];
    if (i === 2) {
      endVal += ' ';
    } else if (i >= 3 && i <= 5) {
      endVal += ':';
    } else if (i < columns.value.length - 1) {
      endVal += '-';
    }
  }
  // 判断最后一个字符是否是分隔符
  if (endVal.endsWith('-') || endVal.endsWith(':')) {
    endVal = endVal.slice(0, -1); // 删除最后一个字符
  }
  emit('update:modelValue', false);
  emit('confirm', endVal);
}
watch(
  () => props.modelValue,
  (val) => {
    if (!val) emit('update:modelValue');
    columns.value = [];
    getColumns();
  }
);
watch(
  () => props.values,
  (val) => {
    if (val === '') {
      Mdays.value = '';
      Dindex.value = null;
    }
  }
);
</script>
<template>
  <!-- 弹出层 -->
  <van-popup :show="modelValue" round position="bottom" teleport="body" class="!rounded-t-[6px]" @close="onCancel">
    <!-- 时间选择 -->
    <van-picker
      v-bind="attrs"
      ref="picker"
      show-toolbar
      :title="title"
      :columns="columns"
      @change="onChange"
      @cancel="onCancel"
      @confirm="onConfirm"
    />
  </van-popup>
</template>
<style lang="less" scoped></style>

使用

<script setup>
import dayjs from 'dayjs';
import PopupAllPicker from '../components/PopupAllPicker.vue';
const data = reactive({
  popupCode: '',
  dateType: 'date',
  dateFormatter: 'YYYY-MM-DD',
  datePicker: false,
  pickerDate: '' // 当前时间选择器的时间
});
const form = reactive({
    ...,
})
// 选择器默认范围(当前时间前后2年)
const minDate = dayjs().subtract(2, 'year').$d;
const maxDate = dayjs().subtract(-1, 'year').$d;
// 确认时间
function onConfirmPicker(val) {
  form[data.popupCode] = val;
}
</script>
<template>
  ...
  <!-- 时间选择器 -->
  <PopupAllPicker
    v-model="data.datePicker"
    ref="popup"
    :values="data.pickerDate"
    :min-date="minDate"
    :max-date="maxDate"
    :valueFormat="data.dateFormatter"
    @confirm="onConfirmPicker"
  />
</template>

到此这篇关于Vue3+vantUI3时间组件封装,支持选择年以及年月日时分秒miao的文章就介绍到这了,更多相关Vue3 vantUI3时间组件封装内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue的index.html中获取环境变量和业务判断图文详解

    vue的index.html中获取环境变量和业务判断图文详解

    这篇文章主要给大家介绍了关于vue的index.html中获取环境变量和业务判断的相关资料,对vue来说index.html是一个总的入口文件,vue是单页面应用,挂在id为app的div下然后动态渲染路由模板,需要的朋友可以参考下
    2023-09-09
  • 使用VUE实现在table中文字信息超过5个隐藏鼠标移到时弹窗显示全部

    使用VUE实现在table中文字信息超过5个隐藏鼠标移到时弹窗显示全部

    这篇文章主要介绍了使用VUE实现在table中文字信息超过5个隐藏,鼠标移到时弹窗显示全部,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • Vue+Echarts绘制饼图的示例详解

    Vue+Echarts绘制饼图的示例详解

    这篇文章主要为大家详细介绍了如何利用Vue和Echarts实现绘制饼图,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-03-03
  • Vue3 中的数据侦测的实现

    Vue3 中的数据侦测的实现

    这篇文章主要介绍了Vue3 中的数据侦测的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • element 实现导航栏收起展开功能及思路

    element 实现导航栏收起展开功能及思路

    这篇文章主要介绍了element 实现导航栏收起展开功能,实现思路先给 el-menu加上 :collapse="isCollapse" 属性,这个属性也是 element 上的一个参数,意思为是否开启折叠动画,在 data 中定义 isCollapse ,用 true 和 false 控制展开与收起,需要的朋友可以参考下
    2023-01-01
  • Nuxt3+ElementPlus构建打包部署全过程

    Nuxt3+ElementPlus构建打包部署全过程

    网上大部分关于Nuxt打包部署教程可谓是可以用五花八门来形容,这对于第一次接触的朋友简直是无从下手,这篇文章主要给大家介绍了关于Nuxt3+ElementPlus构建打包部署的相关资料,需要的朋友可以参考下
    2023-01-01
  • vue中是怎样监听数组变化的

    vue中是怎样监听数组变化的

    这篇文章主要介绍了vue中是怎样监听数组变化的,帮助大家更好的理解和学习vue,感兴趣的朋友可以了解下
    2020-10-10
  • vue项目中的组件传值方式

    vue项目中的组件传值方式

    这篇文章主要介绍了vue项目中的组件传值方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • 浅析Vue.js中v-bind v-model的使用和区别

    浅析Vue.js中v-bind v-model的使用和区别

    v-model 指令在表单控件元素上创建双向数据绑定,所谓双向绑定。这篇文章主要介绍了Vue.js中v-bind v-model的使用和区别,需要的朋友可以参考下
    2018-12-12
  • vue+xlsx实现表格导出进度提示功能

    vue+xlsx实现表格导出进度提示功能

    这篇文章主要为大家详细介绍了vue如何结合ant-design和xlsx 实现表格导出进度提示功能,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2025-05-05

最新评论