欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

vue3實(shí)現(xiàn)封裝時(shí)間計(jì)算-日期倒計(jì)時(shí)組件-還有XX天&第XX天

 更新時(shí)間:2024年03月18日 10:33:16   作者:viceen  
這篇文章主要介紹了vue3實(shí)現(xiàn)封裝時(shí)間計(jì)算-日期倒計(jì)時(shí)組件-還有XX天&第XX天,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

vue3封裝時(shí)間計(jì)算-日期倒計(jì)時(shí)組件——還有XX天 & 第XX天 & 年月日時(shí)分秒星期幾方法的封裝 & setup語法糖完整用法之reactive, ref, onMounted,computed

效果

1-還有幾天

2-第幾天

需求

依照服務(wù)端返回的日期與當(dāng)前日期進(jìn)行對(duì)比

  • 1、返回日期大于當(dāng)前日期為 “還有XX天”
  • 2、返回日期小于當(dāng)前日期為 “第XX天”

代碼

1、倒計(jì)時(shí)組件封裝

1.1、時(shí)間原則計(jì)算組件

src/components/header/countDown.vue

<script lang="ts" setup>
import { ref } from 'vue'
const days = ref(3)
const condition = ref('還有/第')
const text = ref(`距2021-2022年迎峰度冬安全生產(chǎn)值班${condition.value}${days.value}天`)
</script>

<template>
  <div class="days">
    <!--1.0、封裝 -->
    {{ text }}
  </div>
</template>

<style scoped>
  .days {
    color: #FFFFFF;
    font-size: 20px;
    position: relative;
    left: 20px;
    top: 50px;
    width: 600px;
  }
</style>

1.2、時(shí)間展示組件

效果-大屏右上角展示時(shí)間

src/components/header/date.vue

<template>
  <div>{{ date }}</div>
</template>

<script lang="ts" setup>
import formatter from '@/utils/formatterData'
import { ref, onMounted } from 'vue'
const date = ref('')
onMounted(() => {
  setInterval(() => {
    getDate()
  }, 1000)
})

const getDate = function () {
  date.value = formatter(new Date())
}
</script>

<style scoped lang="scss">

</style>

1.3、時(shí)間公共方法封裝-中文格式

XXXX年XX月XX日XX時(shí)XX分XX秒 星期X

src/utils/formatterData.ts

const complement = function (value:any) {
  return value < 10 ? `0${value}` : value
}

export default (date:any) => {
  const time = new Date(date)
  const year = time.getFullYear()
  const month = complement(time.getMonth() + 1)
  const day = complement(time.getDate())
  const hour = complement(time.getHours())
  const minute = complement(time.getMinutes())
  const second = complement(time.getSeconds())
  const week = '星期' + '日一二三四五六'.charAt(time.getDay())
  return `${year}年-${month}-月${day}日 ${week} ${hour}:${minute}:${second}`
}

1.4、時(shí)間公共方法封裝-數(shù)字格式

XXXX年XX月XX日XX時(shí)XX分XX秒 【數(shù)字格式】

src/utils/date.ts

/*
 * @Author: CL
 * @Date: 2021-10-21 14:09:07
 * @LastEditTime: 2021-10-21 16:28:55
 * 工具方法
 */

export const formatTime = (data: Date | string, flag: boolean) => {
  const date = new Date(data)
  const y = date.getFullYear()
  let m: number | string = date.getMonth() + 1
  m = m < 10 ? ('0' + m) : m
  let d : number | string = date.getDate()
  d = d < 10 ? ('0' + d) : d
  let h : number | string = date.getHours()
  h = h < 10 ? ('0' + h) : h
  let minute : number | string = date.getMinutes()
  minute = minute < 10 ? ('0' + minute) : minute
  let second: number | string = date.getSeconds()
  second = second < 10 ? ('0' + second) : second
  if (flag) {
    return y + '-' + m + '-' + d
  }
  return y + '-' + m + '-' + d + ' ' + h + ':' + minute + ':' + second
}

2、頁面引用

效果-倒計(jì)時(shí)完整版

index.vue

<script setup lang="ts">
import { reactive, ref, computed, onMounted } from 'vue'
import { getPowerProgress, getMatchByDate } from '@/api/olympicWinter/left/Match_Schedule.ts'
// 2.0、引用
import countDown from '@/components/header/countDown.vue'
import date from '@/components/header/date.vue'
import { formatTime } from '@/utils/utils'

// 生成 0-n的數(shù)字
const indexMethod = (index: any) => {
  return index + 1
}

// interface propType {
//  type: string
// }
// const props = defineProps<propType>()
const props = { type: '01' }

// 時(shí)間列表數(shù)據(jù)
const listData = reactive([
  {
    time: '02',
    today: '周三',
    date: '2022-02-02'
  },
  {
    time: '03',
    today: '周四',
    date: '2022-02-03'
  }
])

const lists = reactive([
  {
    id: '',
    lineName: '',
    toStation: ''
  }
])

// 滑動(dòng)的元素
const scrollcontent = ref()
const totleactive = ref(0)

// interface  描述一個(gè)對(duì)象或者函數(shù)
interface matchInfo {
  competitionDate: string
  competitionEvent: string
}
const matchList = ref<Array<matchInfo>>([])
/**
 * 根據(jù)日期得到結(jié)果
 */
const getMatch = async (date: string) => {
  const res = await getMatchByDate(date)
  matchList.value = res
}

/**
 * 點(diǎn)擊某個(gè)日期觸發(fā)
 */
const totleMethod = (data: any, index: number) => {
  totleactive.value = index
  getMatch(data.date)
}

/**
 * 獲取接口數(shù)據(jù)
 */
const getProgress = async () => {
  const time = new Date()
  const nowTime = formatTime(time, true)
  const res = await getPowerProgress(nowTime)
  console.log(res, 'kkkk')
  const temp = listData.filter((item: any) => {
    return item.date === nowTime
  })
  if (temp.length <= 0) {
    // 不在期限里, 就取數(shù)組的第一個(gè)
    getMatch(listData[0].date)
  } else {
    getMatch(nowTime)
  }
}

onMounted(() => {
  getProgress()
})

const textType = computed(() => {
  let text = ''
  if (props.type === '01') {
    text = '線路名稱'
  } else if (props.type === '02') {
    text = '變電站名稱'
  } else if (props.type === '03') {
    text = '用戶名稱'
  }
  return text
})
</script>


<template>
  <div class="main-container">
    <div class="head-container">
      <div class="head-content">
        <!--3.0、使用 -->
        <countDown />
        <div class="left" />
        <div class="main">
          <div class="left" />
          <div class="right">
            <date />
          </div>
        </div>
      </div>
      <div class="count">
        <!-- 3.1、ref和interface 定義變量的用法 -->
        <div
          v-for="(item, index) in matchList"
          :key="index"
        >
          <span>{{ item.competitionDate }}</span>
          <span>{{ item.competitionEvent }}</span>
        </div>
        <!-- 3.2、reactive 定義變量的用法 -->
        <div
          class="scroll"
          ref="scrollcontent"
        >
          <div
            :class="[totleactive === index ? 'totleactive' : 'totlebox']"
            v-for="(item,index) in listData"
            :key="index"
            @click="totleMethod(item, index)"
          >
            <p>{{ item.time }}</p>
            <p>{{ item.today }}</p>
          </div>
        </div>
        <!-- 3.3、onMounted 定義變量的用法 -->
        <div>
          <span>{{ textType }}</span>
        </div>
        <div>
          <el-table :data="lists">
            <el-table-column
              prop="lineName"
              label="序號(hào)"
              type="index"
              align="center"
              width="80"
              :index="indexMethod"
            />
            <el-table-column
              prop="toStation"
              align="center"
              :label="textType"
            />
          </el-table>
        </div>
      </div>
    </div>
  </div>
</template>
<style scoped lang="scss">
.main-container {
  width: 7660px;
  height: 1070px;
  display: grid;
  padding: 0 10px 10px;
  grid-gap: 0 10px;
  grid-template-columns: repeat(4, 1fr);
  grid-template-rows: 120px auto;
  background-image: url(@/assets/yfdd-bs/bg.png);
  background-size: cover;
  color: #fff;
  font-size: 23px;
  grid-template-areas:
    "a a a a"
    "b c c d";
  .head-container {
    height: 120px;
    background-image: url(@/assets/yfdd-bs/title.png);
    background-repeat: no-repeat;
    background-size: contain;
    background-position: center;
    grid-area: a;
    display: flex;
  }
  .head-content {
    width: 100%;
    display: flex;
    background-repeat: no-repeat;
    background-size: contain;
    background-position: center;
    cursor: pointer;
    .left {
      width: 50%;
      display: flex;
      justify-content: center;
      align-items: center;
      margin-left: -200px;
    }
    .main {
      width: 53%;
      display: flex;
      justify-content: end;
    }
    .left {
      width: 50%;
    }
    .right {
      display: flex;
      justify-content: right;
      line-height: 145px;
      font-size: 40px;
    }
  }

  //時(shí)間樣式
  .scroll {
    width: 2000px;
    display: flex;
    transition: all 2s;
    // transform: all 1s;
    // margin-left: -600px;
    // justify-content: space-around;
    .totlebox {
      // width: 53px;
      // height: 53px;
      cursor: pointer;
      display: flex;
      flex-direction: column;
      justify-content: center;
      align-items: center;
      margin: 0 29px;
      padding: 4px;
      margin-top: 5px;
      p {
        font-size: 24px;
        font-family: PingFangSC;
        font-weight: bold;
        color: #ffffff;
      }
      p:nth-child(2) {
        font-size: 16px;
      }
    }
    .totleactive {
      width: 53px;
      height: 53px;
      display: flex;
      flex-direction: column;
      justify-content: center;
      background: #1269c2;
      border-radius: 50%;
      align-items: center;
      margin: 0 29px;
      padding: 4px;
      margin-top: 5px;
      p {
        font-size: 24px;
        font-family: PingFangSC;
        font-weight: bold;
        color: #ffffff;
      }
      p:nth-child(2) {
        font-size: 16px;
      }
    }
  }
}
</style>

接口

src/api/olympicWinter/left/Match_Schedule.ts

/**
 * 根據(jù)日期獲取接口數(shù)據(jù)
 * date: 日期
 */
export const getPowerProgress = (date: string) => {
  return request({
    method: 'GET',
    url: '/bdDailyInfo/queryBDProgress',
    params: {
      competitionDate: date
    }
  })
}

/**
 * 根據(jù)時(shí)間日期獲取比賽數(shù)據(jù)
 * date: 日期
 */
export const getMatchByDate = (date: string) => {
  return request({
    method: 'POST',
    url: '/competitionInfo/selectAll',
    data: {
      competitionDate: date
    }
  })
}

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 快速解決vue-cli不能初始化webpack模板的問題

    快速解決vue-cli不能初始化webpack模板的問題

    下面小編就為大家分享一篇快速解決vue-cli不能初始化webpack模板的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • VUE+Canvas實(shí)現(xiàn)簡單五子棋游戲的全過程

    VUE+Canvas實(shí)現(xiàn)簡單五子棋游戲的全過程

    這篇文章主要給大家介紹了關(guān)于VUE+Canvas實(shí)現(xiàn)簡單五子棋游戲的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 詳解vue-cil和webpack中本地靜態(tài)圖片的路徑問題解決方案

    詳解vue-cil和webpack中本地靜態(tài)圖片的路徑問題解決方案

    這篇文章主要介紹了詳解vue-cil和webpack中本地靜態(tài)圖片的路徑問題解決方案,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-09-09
  • 關(guān)于element中el-cascader的使用方式

    關(guān)于element中el-cascader的使用方式

    這篇文章主要介紹了關(guān)于element中el-cascader的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 利用Vue與D3.js創(chuàng)建交互式數(shù)據(jù)可視化

    利用Vue與D3.js創(chuàng)建交互式數(shù)據(jù)可視化

    在現(xiàn)代Web開發(fā)中,數(shù)據(jù)可視化是一個(gè)引人矚目的熱點(diǎn)領(lǐng)域,從簡單的圖表到復(fù)雜的交互式儀表盤,數(shù)據(jù)可視化能夠幫助用戶更好地理解數(shù)據(jù),而Vue與D3.js的結(jié)合則為我們提供了構(gòu)建這些可視化效果的強(qiáng)大工具,本文將向您展示如何利用Vue與D3.js創(chuàng)建一個(gè)基本的交互式數(shù)據(jù)可視化項(xiàng)目
    2025-02-02
  • Vue.js實(shí)現(xiàn)動(dòng)畫與過渡效果的示例代碼

    Vue.js實(shí)現(xiàn)動(dòng)畫與過渡效果的示例代碼

    在現(xiàn)代前端開發(fā)中,用戶體驗(yàn)至關(guān)重要,一個(gè)精美的動(dòng)畫過渡不僅能提升界面的美觀性,還能讓用戶在使用時(shí)感受到流暢的交互體驗(yàn),在本文中,我們將深入探討如何在 Vue.js 中實(shí)現(xiàn)動(dòng)畫與過渡效果,并提供示例代碼,需要的朋友可以參考下
    2024-10-10
  • vue傳值方式的十二種方法總結(jié)

    vue傳值方式的十二種方法總結(jié)

    這篇文章主要介紹了vue傳值方式的十二種方法總結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 如何把vuejs打包出來的文件整合到springboot里

    如何把vuejs打包出來的文件整合到springboot里

    這篇文章主要介紹了如何把vuejs打包出來的文件整合到springboot里,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-07-07
  • Vue如何實(shí)現(xiàn)文件預(yù)覽和下載功能的前端上傳組件

    Vue如何實(shí)現(xiàn)文件預(yù)覽和下載功能的前端上傳組件

    在Vue.js項(xiàng)目中,使用ElementUI的el-upload組件可以輕松實(shí)現(xiàn)文件上傳功能,通過配置組件參數(shù)和實(shí)現(xiàn)相應(yīng)的方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-09-09
  • vue中子組件向父組件傳遞數(shù)據(jù)的實(shí)例代碼(實(shí)現(xiàn)加減功能)

    vue中子組件向父組件傳遞數(shù)據(jù)的實(shí)例代碼(實(shí)現(xiàn)加減功能)

    這篇文章主要介紹了vue中子組件向父組件傳遞數(shù)據(jù)的實(shí)例代碼(實(shí)現(xiàn)加減功能) ,需要的朋友可以參考下
    2018-04-04

最新評(píng)論