可拖动的时间轴(vue3+ts使用element-plus的Slider滑块封装)

4 篇文章 1 订阅
2 篇文章 0 订阅
该博客介绍了如何利用Vue3、TypeScript和Element-Plus库创建一个滑动选择器,展示开始日期与结束日期之间相差的天数。通过封装计算日期差和数组转对象的函数,实现了从后端获取开始和结束时间,前端动态计算并显示日期差的功能。同时,文章还展示了相关组件的样式调整。
摘要由CSDN通过智能技术生成

效果图如下

时间线

本文用了vue3+ ts+ element-plus。

HTML代码如下

<template>
  <div class="slider-demo-block">
    <el-slider
      v-model="value2"
      :step="1"
      @change="changeSlider"
      :show-tooltip="false"
      :marks="marks"
      :max="getDaysArr.length - 1"
    />
  </div>
</template>

封装组件,后端传递开始时间和结束时间,前端算出中间相差多少天

<script lang="ts">
import { computed, defineComponent, reactive, ref } from 'vue'
//封装了计算开始时间和结束时间的方法
import * as calculate from './calculatetime'
import type { CSSProperties } from 'vue'
interface Mark {
  style: CSSProperties
  label: string
}
type Marks = Record<string, Mark | string>
export default defineComponent({
  props: {
    startTime: {
      type: String,
      default: '2020-2-12',
    },
    endTime: {
      type: String,
      default: '2020-3-1',
    },
  },
  setup(props) {
    const value2 = ref(0)
    const getDaysArr = calculate.getDays(props.startTime, props.endTime)
    //得到开始时间与结束时间相差的天数了
    const getDaysObj = calculate.arrToObj(getDaysArr)
    console.log(getDaysObj, 'getDaysObj')
    const marks = reactive<Marks>(getDaysObj as Marks)
    const changeSlider = (val) => {
    //这里拿到滑动到哪一天
      console.log(getDaysArr[val])
      return getDaysArr[val]
    }
    return {
      getDaysArr,
      value2,
      marks,
      changeSlider,
    }
  },
})
</script>

封装计算开始时间与结束时间之间的天数,以及数组转对象的方法

/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
// 获取间隔天数
export function getDays(day1, day2) {
  // 获取入参字符串形式日期的Date型日期
  let st = day1.getDate()
  const et = day2.getDate()

  const retArr = []

  // 获取开始日期的年,月,日
  let yyyy = st.getFullYear(),
    mm = st.getMonth(),
    dd = st.getDate()

  // 循环
  while (st.getTime() != et.getTime()) {
    retArr.push(st.getYMD())

    if (st.getTime() > et.getTime()) return;
    st = new Date(yyyy, mm, ++dd); // 避免开始日期添加两次
  }

  // 将结束日期的天放进数组
  retArr.push(et.getYMD())

  return retArr // 或可换为return ret;
  // alert(retArr); // 或可换为return ret;
}

// 给Date对象添加getYMD方法,获取字符串形式的年月日
Date.prototype.getYMD = function () {
  // 将结果放在数组中,使用数组的join方法返回连接起来的字符串,并给不足两位的天和月十位上补零
  return [this.getFullYear(), fz(this.getMonth() + 1), fz(this.getDate())].join(
    '/'
  )
}

// 给String对象添加getDate方法,使字符串形式的日期返回为Date型的日期
String.prototype.getDate = function () {
  const strArr = this.split('-')
  return new Date(strArr[0], strArr[1] - 1, strArr[2])
}

// 给月和天,不足两位的前面补0
function fz(num) {
  if (num < 10) {
    num = '0' + num
  }
  return num
}

// 递归转化为对象
export function arrToObj(arr) {
  const obj = {}
  const defaultObj = {}
  for (let i = 0; i < arr.length; i++) {
    obj[i] = arr[i]
    if (Object.prototype.toString.call(arr[i]) == '[object Array]') {
      const deepArray = this.arrToObj(arr[i])
      continue
    } else {
      defaultObj[i] = arr[i]
    }
  }
  return defaultObj
}

顺便修改了样式

.slider-demo-block {
  display: flex;
  align-items: center;
}
.slider-demo-block .el-slider {
  width: 100%;
  margin-top: 0;
  margin-left: 12px;
}
.slider-demo-block .demonstration {
  font-size: 14px;
  color: var(--el-text-color-secondary);
  line-height: 44px;
  flex: 1;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  margin-bottom: 0;
}
.slider-demo-block .demonstration + .el-slider {
  flex: 0 0 70%;
}
.el-slider__bar {
  background-color: #00000000 !important;
}
.el-slider__runway {
  background-color: #2162a5 !important;
}
Vue 3和TypeScriptTS)结合使用Element Plus来进行角色菜单分配,是一种很好的选择。下面是一个关于如何实现角色菜单分配的简单示例。 首先,我们需要安装Vue 3、TypeScriptElement Plus。可以使用npm命令进行安装。 ```bash npm install vue@next npm install typescript npm install element-plus ``` 然后,在Vue 3项目的入口文件中,可以引入Element Plus的模块,以及一些额外的样式文件。 ```javascript import { createApp } from 'vue' import ElementPlus from 'element-plus' import 'element-plus/lib/theme-chalk/index.css' import App from './App.vue' const app = createApp(App) app.use(ElementPlus) app.mount('#app') ``` 在组件中,我们可以使用Element Plus的Menu组件来展示菜单,并通过V-if指令来根据角色进行菜单项的展示与隐藏。 ```vue <template> <div> <el-menu> <el-menu-item v-if="hasAccess('dashboard')">仪表盘</el-menu-item> <el-menu-item v-if="hasAccess('users')">用户管理</el-menu-item> <el-menu-item v-if="hasAccess('roles')">角色管理</el-menu-item> </el-menu> </div> </template> <script> import { defineComponent } from 'vue' export default defineComponent({ data() { return { userRoles: ['dashboard', 'users', 'roles'] } }, methods: { hasAccess(role) { return this.userRoles.includes(role) } } }) </script> <style> /* 根据需要自定义样式 */ </style> ``` 在该示例中,假设用户角色以数组的形式存储在`userRoles`属性中。通过定义一个`hasAccess`方法,我们可以判断用户是否拥有某个角色,然后根据判断结果,在菜单项上使用V-if指令来展示或隐藏对应的菜单项。 当用户拥有某个角色时,该菜单项将会在界面上显示出来,反之,则不会显示。需要注意的是,需根据实际需求对示例中的角色判断逻辑进行调整。 这只是一个简单的示例,实际的角色菜单分配功能可能涉及到更复杂的逻辑和接口调用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cyanempty

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值