【Vue3+Vite+TS】11.0 組件八:時(shí)間選擇組件

必備UI組件

將用到的組件:
TimeSelect 時(shí)間選擇

DatePicker 日期選擇器

時(shí)間選擇

新建src\components\baseline\chooseTime\src\index.vue

<template>
    <div class="bs-wrapper">
        <div class="box">
            <!-- :max-time="endTime" -->
            <el-time-select
                v-bind="$attrs.startOptions"
                v-model="startTime"
                :placeholder="startPlaceholder"
                :start="startTimeStart"
                :step="startStep"
                :end="startTimeEnd"
            ></el-time-select>
        </div>
        <div class="box">
            <el-time-select
                v-bind="$attrs.endOptions"
                v-model="endTime"
                :min-time="startTime"
                :placeholder="endPlaceholder"
                :start="endTimeStart"
                :step="endStep"
                :end="endTimeEnd"
                :disabled="endTimeDisabled"
            ></el-time-select>
        </div>
    </div>
</template>
<script lang="ts" setup>
import { ref, watch } from 'vue'

const props = defineProps({
    //說明:開始時(shí)間提示
    startPlaceholder: {
        type: String,
        default: '請(qǐng)選擇開始時(shí)間',
    },
    //說明:開始時(shí)間的默認(rèn)開始選擇
    startTimeStart: {
        type: String,
        default: '00:00',
    },
    // 說明:開始時(shí)間時(shí)間間隔
    startStep: {
        type: String,
        default: '00:30',
    },
    //說明:開始時(shí)間的默認(rèn)結(jié)束選擇
    startTimeEnd: {
        type: String,
        default: '24:00',
    },

    //說明:結(jié)束時(shí)間提示
    endPlaceholder: {
        type: String,
        default: '請(qǐng)選擇結(jié)束時(shí)間',
    },
    //說明:結(jié)束時(shí)間的默認(rèn)開始選擇
    endTimeStart: {
        type: String,
        default: '00:00',
    },
    // 說明:結(jié)束時(shí)間時(shí)間間隔
    endStep: {
        type: String,
        default: '00:30',
    },
    //說明:結(jié)束時(shí)間的默認(rèn)結(jié)束選擇
    endTimeEnd: {
        type: String,
        default: '24:00',
    },
})

//子傳父
let emits = defineEmits(['startChange', 'endChange'])
// 開始時(shí)間
const startTime = ref<string>('')
// 結(jié)束時(shí)間
const endTime = ref<string>('')
// 結(jié)束時(shí)間是否顯示可編輯:默認(rèn)不可編輯
const endTimeDisabled = ref<boolean>(true)
//開始時(shí)間清空茴扁,聯(lián)動(dòng)把結(jié)束時(shí)間也清空
watch(
    () => startTime.value,
    val => {
        if (val === '') {
            endTime.value = ''
            endTimeDisabled.value = true
        } else {
            endTimeDisabled.value = false
            endTime.value = ''
            //給父組件分發(fā)事件
            emits('startChange', val)
        }
    }
)
//結(jié)束時(shí)間監(jiān)聽
watch(
    () => endTime.value,
    val => {
        if (val !== '') {
            emits('endChange', {
                startTime: startTime.value,
                endTime: val,
            })
        }
    }
)
</script>

<style lang="scss" scoped>
.bs-wrapper {
    display: flex;
}
.box {
    margin-right: 0.2rem;
}
</style>

新建src\components\baseline\chooseTime\index.ts

import { App } from 'vue'
import ChooseTime from './src/index.vue'

export { ChooseTime }

//組件可通過use的形式使用
export default {
  ChooseTime,
    install(app: App) {
        app.component('bs-choose-time', ChooseTime)
    },
}

修改src\components\baseline\container\index.ts

/*
 * @Author: bobokaka
 * @Date: 2021-12-20 01:41:54
 * @LastEditTime: 2022-01-01 23:07:26
 * @LastEditors: Please set LastEditors
 * @Description: 全局基礎(chǔ)組件全局注冊(cè)
 * @FilePath: \vue3-element-ui-baseline\src\components\baseline\index.ts
 */
import { App } from 'vue'
import ChooseArea from './chooseArea'
import ChooseIcon from './chooseIcon'
import Container from './container'
import Trend from './trend'
import Notification from './notification'
import List from './list'
import Menu from './menu'
import Progress from './progress'
import ChooseTime from './chooseTime'

const components = [
    ChooseArea,
    ChooseIcon,
    Container,
    Trend,
    Notification,
    List,
    Menu,
    Progress,
    ChooseTime,
]
export {
    ChooseArea,
    ChooseIcon,
    Container,
    Trend,
    Notification,
    List,
    Menu,
    Progress,
    ChooseTime,
}

//組件可通過use的形式使用
export default {
    install(app: App) {
        components.map(item => {
            app.use(item)
        })
    },
    ChooseArea,
    ChooseIcon,
    Container,
    Trend,
    Notification,
    List,
    Menu,
    Progress,
    ChooseTime,
}

路由新增新的路由:

 {
                path: '/chooseTime',
                component: () =>
                    import('../views/baseline/chooseTime/index.vue'),
            },

新增src\views\baseline\chooseTime\index.vue

<template>
    <div>
        <bs-choose-time
            @startChange="startChange"
            @endChange="endChange"
        ></bs-choose-time>
        <br />
        <bs-choose-time
            :startOptions="startOptions"
            :endOptions="endOptions"
        ></bs-choose-time>
    </div>
</template>
<script lang="ts" setup>
interface timeValue {
    startTime: string
    endTime: string
}
const startChange = (value: string) => {
    console.log('startChange', value)
}
const endChange = (value: timeValue) => {
    console.log('endChange', value)
}

const startOptions = { size: 'mini', clearable: false }

const endOptions = { size: 'mini', clearable: false }
</script>
<style lang="scss" scoped></style>

效果如下:


image.png

image.png

日期選擇

新建src\components\baseline\chooseDate\src\index.vue

<!--
 * @Author: bobokaka
 * @Date: 2021-12-23 00:07:25
 * @LastEditDate: 2022-01-02 12:17:03
 * @LastEditors: Please set LastEditors
 * @Description: 時(shí)間選擇器
 * @FilePath: \vue3-element-ui-baseline\src\components\baseline\trend\src\index.vue
-->
<template>
    <div class="bs-wrapper">
        <div class="box__start">
            <!-- :max-time="endDate" -->
            <el-date-picker
                v-model="stratDate"
                v-bind="$attrs.startOptions"
                type="date"
                :placeholder="startPlaceholder"
                :disabled-date="startDisabledDate"
            ></el-date-picker>
        </div>
        <div>
            <el-date-picker
                v-model="endDate"
                v-bind="$attrs.endOptions"
                type="date"
                :placeholder="endPlaceholder"
                :disabled="endDateDisabled"
                :disabled-date="endDisabledDate"
            ></el-date-picker>
        </div>
        <div></div>
    </div>
</template>
<script lang="ts" setup>
import { ref, watch } from 'vue'

const props = defineProps({
    //說明:開始日期提示
    startPlaceholder: {
        type: String,
        default: '請(qǐng)選擇開始日期',
    },
    //說明:結(jié)束日期提示
    endPlaceholder: {
        type: String,
        default: '請(qǐng)選擇結(jié)束日期',
    },
    //是否禁用選擇今天之前的日期
    disableBeforeToDay: {
        type: Boolean,
        default: false,
    },
    //是否禁用選擇今天之后的日期
    disableAfterToDay: {
        type: Boolean,
        default: false,
    },
    //可否選擇當(dāng)天
    selectToDay: {
        type: Boolean,
        default: true,
    },
})

//子傳父
let emits = defineEmits(['startChange', 'endChange'])
//開始日期
const stratDate = ref<Date | null>(null)

//結(jié)束日期
const endDate = ref<Date | null>(null)
// 結(jié)束日期是否顯示可編輯:默認(rèn)不可編輯
const endDateDisabled = ref<boolean>(true)

//一天的毫秒數(shù)
const oneDateNumber = 1000 * 60 * 60 * 24
//禁用開始日期的函數(shù)
let startDisabledDate = (time: Date) => {
    if (props.disableBeforeToDay && props.disableAfterToDay) {
        return (
            time.getTime() < Date.now() - oneDateNumber ||
            time.getTime() > Date.now() - oneDateNumber
        )
    } else if (props.disableBeforeToDay) {
        return time.getTime() < Date.now() - oneDateNumber
    } else if (props.disableAfterToDay) {
        return time.getTime() > Date.now() - oneDateNumber
    }
}
//禁用結(jié)束日期的函數(shù)
const endDisabledDate = (time: Date) => {
    //是否禁用選擇今天之前的日期\是否禁用選擇今天之后的日期
    //此時(shí)無意義桦卒,結(jié)束日期不能選任何值
    if (props.disableBeforeToDay && props.disableAfterToDay) {
        if (stratDate.value) {
            return (
                time.getTime() < Date.now() - oneDateNumber ||
                time.getTime() > Date.now() - oneDateNumber ||
                (props.selectToDay
                    ? time.getTime() <=
                      stratDate.value.getTime() - oneDateNumber
                    : time.getTime() <
                      stratDate.value.getTime() + oneDateNumber)
            )
        }
    } else if (props.disableBeforeToDay) {
        //假設(shè)開始時(shí)間是2022-04-1
        //禁用選擇今天之前的日期嫡霞,比如今天是2022-04-10
        //selectToDay 可否選擇當(dāng)天:true 可,可以選擇包括開始日期到當(dāng)天之前的日期侵状,范圍是2022-04-1至2022-04-10
        //selectToDay 可否選擇當(dāng)天:false 不可,可以選擇包括開始日期下一天到當(dāng)天之前的日期蝙砌,范圍是2022-04-2至2022-04-10
        if (stratDate.value) {
            return (
                time.getTime() < Date.now() - oneDateNumber ||
                (props.selectToDay
                    ? time.getTime() <=
                      stratDate.value.getTime() - oneDateNumber
                    : time.getTime() <
                      stratDate.value.getTime() + oneDateNumber)
            )
        }
    } else if (props.disableAfterToDay) {
        //假設(shè)開始時(shí)間是2022-04-15
        //禁用選擇今天之后的日期随夸,比如今天是2022-04-10
        //selectToDay 可否選擇當(dāng)天:true 可,可以選擇開始日期潭枣、當(dāng)天之后的日期比默,范圍是2022-04-15之后的日期
        //selectToDay 可否選擇當(dāng)天:false 不可,可以選擇開始日期盆犁、當(dāng)天之后的日期退敦,范圍是2022-04-16之后的日期
        if (stratDate.value) {
            return (
                time.getTime() > Date.now() - oneDateNumber ||
                (props.selectToDay
                    ? time.getTime() <=
                      stratDate.value.getTime() - oneDateNumber
                    : time.getTime() <
                      stratDate.value.getTime() + oneDateNumber)
            )
        }
    } else {
        //假設(shè)開始時(shí)間是2022-04-15
        //比如今天是2022-04-10
        //selectToDay 可否選擇當(dāng)天:true 可,可以選擇開始日期之后的日期蚣抗,范圍是2022-04-15之后的日期
        //selectToDay 可否選擇當(dāng)天:false 不可侈百,可以選擇開始日期之后的日期瓮下,范圍是2022-04-16之后的日期
        if (stratDate.value) {
            return props.selectToDay
                ? time.getTime() <= stratDate.value.getTime() - oneDateNumber
                : time.getTime() < stratDate.value.getTime() + oneDateNumber
        }
    }
}
//開始日期清空,聯(lián)動(dòng)把結(jié)束日期也清空
watch(
    () => stratDate.value,
    val => {
        endDate.value = null
        endDateDisabled.value = true
        if (val) {
            endDateDisabled.value = false
            //給父組件分發(fā)事件
            emits('startChange', val)
        }
    }
)
//結(jié)束日期監(jiān)聽
watch(
    () => endDate.value,
    val => {
        if (val !== null) {
            emits('endChange', {
                stratDate: stratDate.value,
                endDate: val,
            })
        }
    }
)
</script>

<style lang="scss" scoped>
.bs-wrapper {
    display: flex;
}
.box {
    &__start {
        margin-right: 0.2rem;
    }
}
</style>

新建src\components\baseline\chooseDate\index.ts

import { App } from 'vue'
import ChooseDate from './src/index.vue'

export { ChooseDate }

//組件可通過use的形式使用
export default {
    ChooseDate,
    install(app: App) {
        app.component('bs-choose-date', ChooseDate)
    },
}

修改src\components\baseline\index.ts

import { App } from 'vue'
import ChooseArea from './chooseArea'
import ChooseIcon from './chooseIcon'
import Container from './container'
import Trend from './trend'
import Notification from './notification'
import List from './list'
import Menu from './menu'
import Progress from './progress'
import ChooseTime from './chooseTime'
import ChooseDate from './chooseDate'

const components = [
    ChooseArea,
    ChooseIcon,
    Container,
    Trend,
    Notification,
    List,
    Menu,
    Progress,
    ChooseTime,
    ChooseDate,
]
export {
    ChooseArea,
    ChooseIcon,
    Container,
    Trend,
    Notification,
    List,
    Menu,
    Progress,
    ChooseTime,
    ChooseDate,
}

//組件可通過use的形式使用
export default {
    install(app: App) {
        components.map(item => {
            app.use(item)
        })
    },
    ChooseArea,
    ChooseIcon,
    Container,
    Trend,
    Notification,
    List,
    Menu,
    Progress,
    ChooseTime,
    ChooseDate,
}

修改src\views\baseline\chooseTime\index.vue

<template>
    <div>
        <div>
            <span style="display: inline-block; margin-bottom: 0.1rem">
                時(shí)間選擇:
            </span>
            <bs-choose-time
                @startChange="startChange"
                @endChange="endChange"
            ></bs-choose-time>
        </div>
        <div>
            <span style="display: inline-block; margin: 0.1rem 0">
                時(shí)間選擇(增加element其他屬性):
            </span>
            <bs-choose-time
                :startOptions="startOptions"
                :endOptions="endOptions"
            ></bs-choose-time>
        </div>
        <div>
            <span style="display: inline-block; margin: 0.1rem 0">
                日期選擇:
            </span>
            <bs-choose-date
                @startChange="startDateChange"
                @endChange="endDateChange"
            ></bs-choose-date>
        </div>
        <div>
            <span style="display: inline-block; margin: 0.1rem 0">
                日期選擇 (過去時(shí)間):
            </span>
            <bs-choose-date
                :disableBeforeToDay="false"
                :disableAfterToDay="true"
                :selectToDay="true"
                @startChange="startDateChange"
                @endChange="endDateChange"
            ></bs-choose-date>
        </div>
        <div>
            <span style="display: inline-block; margin: 0.1rem 0">
                日期選擇(未來時(shí)間):
            </span>
            <bs-choose-date
                :disableBeforeToDay="true"
                :disableAfterToDay="false"
                :selectToDay="true"
                @startChange="startDateChange"
                @endChange="endDateChange"
            ></bs-choose-date>
        </div>
        <div>
            <span style="display: inline-block; margin: 0.1rem 0">
                日期選擇(過去時(shí)間,不能當(dāng)天到當(dāng)天):
            </span>
            <bs-choose-date
                :disableBeforeToDay="false"
                :disableAfterToDay="true"
                :selectToDay="false"
                @startChange="startDateChange"
                @endChange="endDateChange"
            ></bs-choose-date>
        </div>
        <div>
            <span style="display: inline-block; margin: 0.1rem 0">
                日期選擇(自定義屬性):
            </span>
            <bs-choose-date
                :startOptions="startOptions"
                :endOptions="endOptions"
                @startChange="startDateChange"
                @endChange="endDateChange"
            ></bs-choose-date>
        </div>
    </div>
</template>
<script lang="ts" setup>
interface timeValue {
    startTime: string
    endTime: string
}
interface dateValue {
    stratDate: Date
    endDate: Date
}
const startChange = (value: string) => {
    console.log('startChange', value)
}
const endChange = (value: timeValue) => {
    console.log('endChange', value)
}
const startDateChange = (value: Date) => {
    console.log('startChange', value)
}
const endDateChange = (value: dateValue) => {
    console.log('endChange', value)
}
const startOptions = { size: 'mini', clearable: false }

const endOptions = { size: 'mini', clearable: false }
</script>
<style lang="scss" scoped></style>

效果如下:


image.png

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末钝域,一起剝皮案震驚了整個(gè)濱河市讽坏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌例证,老刑警劉巖路呜,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異织咧,居然都是意外死亡胀葱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門笙蒙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抵屿,“玉大人,你說我怎么就攤上這事捅位≡穑” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵艇搀,是天一觀的道長(zhǎng)尿扯。 經(jīng)常有香客問我,道長(zhǎng)焰雕,這世上最難降的妖魔是什么衷笋? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮矩屁,結(jié)果婚禮上右莱,老公的妹妹穿的比我還像新娘。我一直安慰自己档插,他們只是感情好慢蜓,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著郭膛,像睡著了一般晨抡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上则剃,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天耘柱,我揣著相機(jī)與錄音,去河邊找鬼棍现。 笑死调煎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的己肮。 我是一名探鬼主播士袄,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼悲关,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了娄柳?” 一聲冷哼從身側(cè)響起寓辱,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赤拒,沒想到半個(gè)月后秫筏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡挎挖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年这敬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蕉朵。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡崔涂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出墓造,到底是詐尸還是另有隱情,我是刑警寧澤锚烦,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布觅闽,位于F島的核電站,受9級(jí)特大地震影響涮俄,放射性物質(zhì)發(fā)生泄漏蛉拙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一彻亲、第九天 我趴在偏房一處隱蔽的房頂上張望孕锄。 院中可真熱鬧,春花似錦苞尝、人聲如沸畸肆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)轴脐。三九已至,卻和暖如春抡砂,著一層夾襖步出監(jiān)牢的瞬間大咱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工注益, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留碴巾,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓丑搔,卻偏偏與公主長(zhǎng)得像厦瓢,于是被迫代替她去往敵國(guó)和親提揍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容