最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue3+vantUI3時間組件封裝過程支持選擇年以及年月日時分秒

 更新時間:2024年07月17日 10:29:56   作者:殺豬刀-墨林  
這篇文章主要介紹了Vue3+vantUI3時間組件封裝過程支持選擇年以及年月日時分秒,本文通過實例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧

效果圖:

代碼

<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(); // 沒有傳入時間則默認(rèn)當(dāng)前時刻
  }
  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 = {}; // 獲取前后十年數(shù)組
  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月數(shù)組
  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 = {}; // 創(chuàng)建當(dāng)月天數(shù)數(shù)組
  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 = {}; // 創(chuàng)建小時數(shù)組
  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 = {}; // 創(chuàng)建分鐘數(shù)組
  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 = {}; // 創(chuàng)建秒數(shù)數(shù)組
  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();
  });
  // 設(shè)置默認(rèn)選項當(dāng)前年
  if (props.valueFormat.includes('YYYY')) {
    columns.value.push(year);
  }
  if (props.valueFormat.includes('MM')) {
    columns.value.push(month); // 獲取當(dāng)月的天數(shù)
  }
  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為所有列備選項值的數(shù)組
  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);
  // 設(shè)置第三列的值
  picker.value.setColumnValue(2, newDays.values);
  // 設(shè)置第三列索引
  picker.value.setColumnIndex(2, values[2] - 1);
}
//  關(guān)閉彈框
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: '' // 當(dāng)前時間選擇器的時間
});
const form = reactive({
    ...,
})
// 選擇器默認(rèn)范圍(當(dāng)前時間前后2年)
const minDate = dayjs().subtract(2, 'year').$d;
const maxDate = dayjs().subtract(-1, 'year').$d;
// 確認(rèn)時間
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>

到此這篇關(guān)于Vue3+vantUI3時間組件封裝,支持選擇年以及年月日時分秒miao的文章就介紹到這了,更多相關(guān)Vue3 vantUI3時間組件封裝內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue的index.html中獲取環(huán)境變量和業(yè)務(wù)判斷圖文詳解

    vue的index.html中獲取環(huán)境變量和業(yè)務(wù)判斷圖文詳解

    這篇文章主要給大家介紹了關(guān)于vue的index.html中獲取環(huán)境變量和業(yè)務(wù)判斷的相關(guān)資料,對vue來說index.html是一個總的入口文件,vue是單頁面應(yīng)用,掛在id為app的div下然后動態(tài)渲染路由模板,需要的朋友可以參考下
    2023-09-09
  • 使用VUE實現(xiàn)在table中文字信息超過5個隱藏鼠標(biāo)移到時彈窗顯示全部

    使用VUE實現(xiàn)在table中文字信息超過5個隱藏鼠標(biāo)移到時彈窗顯示全部

    這篇文章主要介紹了使用VUE實現(xiàn)在table中文字信息超過5個隱藏,鼠標(biāo)移到時彈窗顯示全部,本文通過實例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • Vue+Echarts繪制餅圖的示例詳解

    Vue+Echarts繪制餅圖的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用Vue和Echarts實現(xiàn)繪制餅圖,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-03-03
  • Vue3 中的數(shù)據(jù)偵測的實現(xiàn)

    Vue3 中的數(shù)據(jù)偵測的實現(xiàn)

    這篇文章主要介紹了Vue3 中的數(shù)據(jù)偵測的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • element?實現(xiàn)導(dǎo)航欄收起展開功能及思路

    element?實現(xiàn)導(dǎo)航欄收起展開功能及思路

    這篇文章主要介紹了element?實現(xiàn)導(dǎo)航欄收起展開功能,實現(xiàn)思路先給 el-menu加上 :collapse="isCollapse" 屬性,這個屬性也是 element 上的一個參數(shù),意思為是否開啟折疊動畫,在 data 中定義 isCollapse ,用 true 和 false 控制展開與收起,需要的朋友可以參考下
    2023-01-01
  • Nuxt3+ElementPlus構(gòu)建打包部署全過程

    Nuxt3+ElementPlus構(gòu)建打包部署全過程

    網(wǎng)上大部分關(guān)于Nuxt打包部署教程可謂是可以用五花八門來形容,這對于第一次接觸的朋友簡直是無從下手,這篇文章主要給大家介紹了關(guān)于Nuxt3+ElementPlus構(gòu)建打包部署的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • vue中是怎樣監(jiān)聽數(shù)組變化的

    vue中是怎樣監(jiān)聽數(shù)組變化的

    這篇文章主要介紹了vue中是怎樣監(jiān)聽數(shù)組變化的,幫助大家更好的理解和學(xué)習(xí)vue,感興趣的朋友可以了解下
    2020-10-10
  • vue項目中的組件傳值方式

    vue項目中的組件傳值方式

    這篇文章主要介紹了vue項目中的組件傳值方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 淺析Vue.js中v-bind v-model的使用和區(qū)別

    淺析Vue.js中v-bind v-model的使用和區(qū)別

    v-model 指令在表單控件元素上創(chuàng)建雙向數(shù)據(jù)綁定,所謂雙向綁定。這篇文章主要介紹了Vue.js中v-bind v-model的使用和區(qū)別,需要的朋友可以參考下
    2018-12-12
  • vue+xlsx實現(xiàn)表格導(dǎo)出進(jìn)度提示功能

    vue+xlsx實現(xiàn)表格導(dǎo)出進(jìn)度提示功能

    這篇文章主要為大家詳細(xì)介紹了vue如何結(jié)合ant-design和xlsx 實現(xiàn)表格導(dǎo)出進(jìn)度提示功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2025-05-05

最新評論

五河县| 沅陵县| 普格县| 晋江市| 汝阳县| 安阳市| 河北区| 屏东市| 东阳市| 平远县| 华亭县| 浑源县| 边坝县| 英德市| 三亚市| 万载县| 大新县| 苍溪县| 筠连县| 友谊县| 邵武市| 阿坝| 静乐县| 清涧县| 镇沅| 澎湖县| 南乐县| 龙口市| 合作市| 噶尔县| 龙岩市| 昭通市| 视频| 基隆市| 云南省| 桦川县| 三台县| 黎川县| 林周县| 盖州市| 剑河县|