<template> <div class="bs-design-wrap" :class="`bs-time-count-down-${customTheme}`" > <span v-if="isPast" style="color: #ea0b30" >(已过期)</span> <div :class="[ 'time', { 'light-theme': customTheme === 'light', 'auto-theme': customTheme == 'auto', 'dark-theme': customTheme == 'dark' } ]" class="time-text-box" :style=" 'font-size:' + config.customize.fontSize + 'px;color:' + config.customize.color + ';font-weight:' + config.customize.fontWeight " > {{ dateDiff }} </div> </div> </template> <script> import paramsMixins from 'data-room-ui/js/mixins/paramsMixins' import { settingToTheme } from 'data-room-ui/js/utils/themeFormatting' import cloneDeep from "lodash/cloneDeep"; import {mapMutations, mapState} from "vuex"; export default { name: 'TimeCountDown', mixins: [paramsMixins], props: { config: { type: Object, default: () => {} } }, data () { return { timer: '', allTime: 0, date: '', time: new Date().getTime() } }, computed: { ...mapState({ customTheme: state => state.bigScreen.pageInfo.pageConfig.customTheme, activeCode: state => state.bigScreen.activeCode }), isPast: { get () { if (new Date(this.config.endTime).getTime() - this.time < 0) { return true } else { return false } } }, dateDiff: { // eslint-disable-next-line vue/return-in-computed-property get () { if (this.config.endTime) { return this.dateFormat( new Date(this.config.endTime).getTime() - this.time ) } }, set (val) { this.allTime = val } } }, watch: { 'config.endTime': { handler () { this.getTime() }, immediate: true } }, mounted () { this.changeStyle() }, // 销毁定时器 destroyed () { if (this.timer) { clearInterval(this.timer) // 关闭 } }, methods: { ...mapMutations({ changeChartConfig: 'bigScreen/changeChartConfig', changeActiveItemConfig: 'bigScreen/changeActiveItemConfig' }), changeStyle (config) { this.config.endTime = this.config.endTime ? new Date(this.config.endTime).getTime() : new Date().getTime() + 3 * 3600 * 1000 * 24 - 1000 this.getTime() config = { ...this.config, ...config } // 样式改变时更新主题配置 config.theme = settingToTheme(cloneDeep(config), this.customTheme) this.changeChartConfig(config) if (this.config.code === this.activeCode) { this.changeActiveItemConfig(config) } }, getTime () { if (this.timer) { clearInterval(this.timer) } this.timer = setInterval(() => { this.time = this.time + 1000 if (this.dateDiff <= 0) { clearInterval(this.timer) } }, 1000) }, // 格式化时间 dateFormat (dateDiff) { if (dateDiff < 0) { dateDiff = -dateDiff } const dayDiff = Math.floor(dateDiff / (24 * 3600 * 1000)) // 计算出相差天数 const leave1 = dateDiff % (24 * 3600 * 1000) // 计算天数后剩余的毫秒数 const hours = Math.floor(leave1 / (3600 * 1000)) // 计算出小时数 // 计算相差分钟数 const leave2 = leave1 % (3600 * 1000) // 计算小时数后剩余的毫秒数 const minutes = Math.floor(leave2 / (60 * 1000)) // 计算相差分钟数 // 计算相差秒数 const leave3 = leave2 % (60 * 1000) // 计算分钟数后剩余的毫秒数 const seconds = Math.round(leave3 / 1000) // const leave4=leave3%(60*1000) //计算分钟数后剩余的毫秒数 // const minseconds=Math.round(leave4/1000) const timeFn = dayDiff + ' 天 ' + hours + ' 小时 ' + minutes + ' 分钟 ' + seconds + ' 秒' return timeFn } } } </script> <style lang="scss" scoped> @import "../../BasicComponents/fonts/index.css"; .bs-design-wrap{ width: 100%; } .time { height: 100%; display: flex; align-items: center; justify-content: center; overflow: auto; } .light-theme { background-color: #ffffff; color: #000000; } .dark-theme { background-color: transparent; color: #ffffff; } .auto-theme { background-color: transparent; color: #000000; } .time-text-box{ padding: 20px; display: flex; align-items: center; justify-content: center; white-space:nowrap; box-sizing: border-box; overflow: hidden; } </style>