vue集成tui.calendar日历组件

news/2024/12/12 6:30:43/

vue集成tui.calendar日历组件

  • 前言
  • 一、简介、效果图
  • 二、vue简单集成(集成js版本,没有使用官方的vue2版本)
    • 1.引包
    • 2.简单示例
  • 三、自定义功能
    • 1.需求分析、效果展示
    • 2.实现思路

前言

vue2的集成在git上官方已经给出了demo这里就不贴代码了。本次主要是vue3集成
最近有个功能需要一个日历视图显示出什么时间段上什么课、点击可以查看详情、点击日历空白出可以创建课程或者日程。并且可以拖动。找了挺多组件,最后跟团队商量一下决定使用tui.calendar

下面是我找的日历视图组件:

名称地址
VCalendarhttps://vcalendar.io/
tui.calendarhttps://ui.toast.com/tui-calendar
elementhttps://element-plus.org/zh-CN/component/calendar.html
fullcalendarhttps://fullcalendar.io/demos

一、简介、效果图

The Calendar supports monthly, weekly, daily views and more, and you can create or edit your event with a simple dragging motion.

名称地址
官网https://ui.toast.com/tui-calendar
源码地址https://github.com/nhn/tui.calendar

在这里插入图片描述
在这里插入图片描述

tui.calendar有3中集成方式:js、vue2、react
https://github.com/nhn/tui.calendar/tree/main/apps

二、vue简单集成(集成js版本,没有使用官方的vue2版本)

这里使用的是引用js的方式进行集成

1.引包

#tui.calendar包
npm install --save @toast-ui/calendar
#因为calendar中默认使用了时间组件这里引入一下
npm install tui-date-picker
npm install tui-time-picker
#demo中用到uuid生成id
npm install uuid

2.简单示例

直接上代码:

<template><el-date-pickerv-model="selectDate"type="date"placeholder="Pick a day"@change="handleSelectDate"/><el-button icon="ArrowLeft" circle  @click="handleLeftBtn"/><el-button icon="ArrowRight" circle @click="handleRightBtn"/><div id="calendar" style="height: 100%"></div>
</template>
<script>
import Calendar from '@toast-ui/calendar';
import '@toast-ui/calendar/dist/toastui-calendar.min.css';
import 'tui-date-picker/dist/tui-date-picker.min.css';
import 'tui-time-picker/dist/tui-time-picker.min.css';
import { v4 as uuidv4 } from 'uuid'
export default {data() {return {useCreatePopup: true,useDetailPopup: true,calendar: undefined,selectDate:''}},methods: {init() {this.calendar = new Calendar('#calendar', {defaultView: 'week',useFormPopup: this.useCreatePopup,useDetailPopup: this.useDetailPopup,usageStatistics: false,// timezone:{//   zones:[//     {//       timezoneName:'Australia/Sydney',//     }//   ]// },template: {milestone: function (model) {return '<span class="calendar-font-icon ic-milestone-b"></span> <span style="background-color: ' + model.bgColor + '">' + model.title + '</span>';},popupIsAllday() {return 'All day';},popupStateFree() {return 'Free';},popupEdit() {return 'Edit';},popupDelete() {return 'Delete';},popupDetailTitle({title}) {return title;},popupDetailLocation({location}) {return location;},},week:{taskView:false}});this.calendar.createEvents([{id: uuidv4(),title: 'Weekly Meeting',start: new Date(Date.now()),end: new Date(Date.now()+30*60*1000),},]);// 创建this.calendar.on("beforeCreateEvent", (e) => {console.log("创建",e)this.calendar.createEvents([{id: uuidv4() ,calendarId: 'cal1',title: e.title,start: e.start.d.d,end: e.end.d.d,isAllday: e.isAllday,location: e.location,state: e.state,color: '#fff',backgroundColor: '#3c056d',dragBackgroundColor: '#3c056d',customStyle: {fontStyle: 'italic',fontSize: '15px',},}, // EventObject])})//修改this.calendar.on('beforeUpdateEvent', (e) => {console.log("修改",e)const targetEvent = e.event;const changes = {...e.changes};this.calendar.updateEvent(targetEvent.id, targetEvent.calendarId, changes);});//删除this.calendar.on('beforeDeleteEvent', (e) => {console.log("删除",e)this.calendar.deleteEvent(e.id, e.calendarId);});},handleLeftBtn(){this.calendar.prev()},handleRightBtn(){this.calendar.next()},handleSelectDate(){this.calendar.setDate(this.selectDate)}},mounted() {this.init()}
}
</script>
<style scoped></style>

参数详解:

参数默认值描述
defaultView‘week’默认视图类型,可选为month、week、day
useFormPopupfalse是否开启创建修改弹窗
useDetailPopupfalse是否开启详情弹窗
usageStatisticstrue是否允许google收集信息
isReadOnlyfalse日历是否为只读的
timezone{ zones: [] }日历使用的时区选项

更多参数参考文档https://github.com/nhn/tui.calendar/tree/main/docs/en/apis

三、自定义功能

1.需求分析、效果展示

根据需求点击event展示信息如下
1.需要实现点击左侧侧边栏选项calendar动态加载
2.点击event自定义弹窗显示信息
在这里插入图片描述

2.实现思路

具体代码因公司原因就不贴了。这里讲一下思路:

1.侧边栏实现
给多选框添加change事件,用一个数组接受已经勾选了的选项id,然后去请求后端calendar事件接0口。
接受到新的events后先清空当前日程表上的事件calendar.clear()。
然后调用calendar.createEvents()去重新添加到日历中
事件文档:https://github.com/nhn/tui.calendar/blob/main/docs/en/apis/calendar.md

2.弹出框实现
这里我有考虑自定义。但是看了两天文档并没有看到组件可以自定义弹框(或者我笨没有发现)
所以我打算通过监听事件自己添加一个
我这里使用的饿了么组件el-popover

首先我们需要获取到点击事件的坐标,通过监听calendar.on(‘clickEvent’, (e) => {})获取坐标包括event详情。有了坐标信息那么popover弹出在这个坐标上就可以了
el-popover使用demo

 <el-popoverplacement="top-start"title="标题"width="200"trigger="hover"content="这是一段内容,这是一段内容,这是一段内容,这是一段内容。"><el-button slot="reference">hover 激活</el-button></el-popover>

我这里通过样式z-index:-1;position: absolute;left:(xxx)px;right:(xxx)px设置这个按钮的位置并且使用z-index显示在日历视图之下。然后触发这个按钮显示出弹框。这里就基本上实现了。

如果想做创建窗口监听

calendar.on('selectDateTime', (e) => {console.log("selectDateTime",e)
});

然后跟上边同理获取到点击时间块的信息进行处理


http://www.ppmy.cn/news/37052.html

相关文章

无线耳机哪个品牌好?四大国内蓝牙耳机品牌排行

现今&#xff0c;蓝牙耳机越来越成为人们外出必备的数码产品之一。随着蓝牙耳机品牌的增多&#xff0c;多种多样的蓝牙耳机出现在大众视野&#xff0c;而国产蓝牙耳机凭借更高的性价比而受到不少用户的欢迎。接下来&#xff0c;我来给大家推荐四款国产的蓝牙耳机&#xff0c;一…

springboot设备管理系统(租赁,报修,借还,出入库)iava

开发环境为Eclipse/idea&#xff0c; 4.数据库连接src\main\resources\config.properties中修改 5.maven-3.3.9. 6.前端技术:bootsrap,layui,html5css,jquery等都有涉猎本文以JSP为开发技术&#xff0c;实现了一个设备管理系统。设备管理系统的主要使用者分为管理员&#xff1b…

马云回国,首谈ChatGPT

马云今天回国了&#xff0c;这是一个备受关注的消息。 作为中国最具代表性的企业家之一&#xff0c;马云在过去的二十多年里&#xff0c;带领阿里巴巴从一个小小的创业公司&#xff0c;发展成为全球最大的电商平台之一&#xff0c;同时也推动了中国互联网行业的发展。 他的回…

刷题30-对称的二叉树

对称的二叉树 思路&#xff1a;用递归&#xff0c;首先明白递归中止的条件是什么 搬用别人的看法&#xff1a; 做递归思考三步&#xff1a; 1.递归的函数要干什么&#xff1f; 函数的作用是判断传入的两个树是否镜像。 输入&#xff1a;TreeNode left, TreeNode right 输出…

蓝桥杯倒计时 | 倒计时8天

作者&#x1f575;️‍♂️&#xff1a;让机器理解语言か 专栏&#x1f387;&#xff1a;蓝桥杯倒计时冲刺 描述&#x1f3a8;&#xff1a;蓝桥杯冲刺阶段&#xff0c;一定要沉住气&#xff0c;一步一个脚印&#xff0c;胜利就在前方&#xff01; 寄语&#x1f493;&#xff1a…

HTML 脚本

文章目录HTML 脚本HTML \<script> 标签HTML \<noscript> 标签JavaScript 体验JavaScript 实例代码HTML 脚本标签HTML 脚本 JavaScript 使 HTML 页面具有更强的动态和交互性。 HTML <script> 标签 <script> 标签用于定义客户端脚本&#xff0c;比如 J…

redis 面试题

&#x1f355; redis 面试题常规问题什么是 Redis&#xff1f;为什么要使用 Redis&#xff1f;Redis 一般有哪些使用场景&#xff1f;Redis 为什么快&#xff1f;数据类型和数据结构Redis有哪些数据类型&#xff1f;常用操作和应用Bitmaps (位图) | 二进制计数与过滤计数器记录…

Prometheus监控实战系列二十四: Alertmanager集群

上篇文章介绍了Prometheus Server自身的高可用方案&#xff0c;但除了Prometheus Server外&#xff0c;Alertmanager也是整个告警体系里面重要的组件。所有的告警都需要通过它来进行发送&#xff0c;当Alertmanager出现问题时&#xff0c;告警信息将无法送达用户。 本文我们将…