vue集成tui.calendar日历组件

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-picker
      v-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-popover
    placement="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)
});

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/5298.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

重发布实验

基础配置&#xff1a; [r1]int l0 [r1-LoopBack0]ip add 1.1.1.1 24 [r1-LoopBack0]int g0/0/0 [r1-GigabitEthernet0/0/0]ip ad 192.168.12.1 24 [r1-GigabitEthernet0/0/0]int g0/0/1 [r1-GigabitEthernet0/0/1]ip add 192.168.123.1 24 [r1]ospf 1 router-id 1.1.1.1 [r1-o…

自学大数据第12天~Hbase

先留个问题~ERROR: KeeperErrorCode ConnectionLoss for /hbase/master 稍后解决 找到了问题的根因: 查看报错日志 事关tmp文件夹的配置,所以去找一下hbase配置文件中关于这个文件夹的配置项 我的策略是将这个配置项注销掉 然后启动hbase ,之后hmaster就成功启动了; 接着s…

熟练Redis之无处不在的锁

为了保证并发访问的正确性&#xff0c;Redis提供了两种方法,分别是加锁和原子操作 Redis加锁两个问题:一个是&#xff0c;如果加锁操作多&#xff0c;会降低系统的并发访问性能;第二个是&#xff0c;Redis客户端要加锁时&#xff0c;需要用到分布式锁&#xff0c;而分布式锁实…

Coremail奇安信发布2022中国企业邮箱安全性研究:应对ChatGPT带来的安全挑战

日前&#xff0c;广东盈世科技计算机有限公司与奇安信集团联合编写发布《2022中国企业邮箱安全性研究报告》。 报告数据显示&#xff1a;2022年&#xff0c;全国企业邮箱用户共收到各类钓鱼邮件约425.9亿封&#xff0c;相比2021年收到各类钓鱼邮件的342.2亿封增加了24.5%。 一…

华为OD机试用java实现 -【RSA 加密算法】

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:RSA 加密算法 题目 RSA 加密…

【愚人节专场】Java实现定时发送小情话

首先&#xff0c;感谢大佬的帮助~附上大佬的博客以示尊敬https://blog.csdn.net/qq_38591577/article/details/128164308?spm1001.2014.3001.5502 功能实现&#xff1a; 在名为愚人节&#xff0c;实为告白/情人节的日子里&#xff0c;怎么样才能引起TA的关注呢&#xff1f;不…

49天精通Java,第21天,Java内部类,看看文心一言、ChatGPT怎么说

目录文心一言谈Java内部类ChatGPT谈Java内部类下面来聊聊哪吒的见解。一、为什么需要内部类&#xff1f;二、内部类分为四种三、成员内部类1、什么是成员内部类2、代码实例3、成员内部类进阶代码实例4、控制台显示5、外部类访问内部类四、局部内部类五、匿名内部类1、匿名内部类…

Dragonfly 最新正式版本 v2.0.9 已经发布!

作者&#xff1a;戚文博-蚂蚁集团 Dragonfly 最新正式版本 v2.0.9 已经发布&#xff01;感谢 Dragonfly 的贡献者们&#xff0c;同时也感谢默默支持 Dragonfly 项目的各个公有云团队。欢迎访问 d7y.io [ 1] 网站来了解详情&#xff0c;下面具体介绍 v2.0.9 版本带来了那些更新。…

【Redis】十大数据类型(下篇)

文章目录redis位图(bitmap) --- 底子还是string基本命令图示setbit key offset value setbit 键 偏移位 只能零或者1getbit key offset 查看获取字符串长度 strlen统计key中包含1的个数 bitcount keybitop 统计两个比特key是否都为1技术落地&#xff1a;打卡签到&#xff0c;频…

【C语言蓝桥杯每日一题】——等差数列

【C语言蓝桥杯每日一题】——等差数列&#x1f60e;前言&#x1f64c;等差数列&#x1f64c;解题思路分析&#xff1a;&#x1f60d;解题源代码分享&#xff1a;&#x1f60d;总结撒花&#x1f49e;&#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢的座右铭&…

让ChatGPT帮我写shell脚本, 结局很感人

七问ChatGPT, 剑指shell脚本编写 step1: 初问step2: 再问step3: 三问step4: 四问step5: 五问step6: 问个derstep7: 解决问题step8: 小问一下关于ChatGPT思考昨天浏览一篇关于脚本的技术文章的时候, 偶然看见一篇文章中写道关于mysql备份的脚本. 但是这个脚本时基于本地的MySQL服…

Idea+maven+spring-cloud项目搭建系列--13 整合MyBatis-Plus多数据源dynamic-datasource

前言&#xff1a;对于同一个系统&#xff0c;不同的租户需要自己独立分隔的数据库&#xff08;每个数据库的表结构可以是相同的&#xff09;&#xff0c;同时也要支持跨数据源的查询&#xff1b;并且支持分布式事务&#xff0c;如果这里不使用分库分表插件&#xff0c;需要怎样…

使用dd复制将乌班图系统(Ubuntu22.04)完整迁移到新硬盘并扩容

我的折磨历程 开始的时候用乌班图的时候&#xff0c;不懂事&#xff0c;根目录太小了&#xff0c;后来就满了&#xff0c;就就感觉完全没法用&#xff0c;看着现在硬盘贼便宜&#xff0c;去狗东买了个新的硬盘。感觉挂载硬盘并不能解决我的问题&#xff0c;最后选择了保留系统数…

ython和PyTorch实现ChatGPT批量AI智能写作

怎么实现用chatgpt批量写作 ChatGPT是一种针对文本生成的自然语言处理工具&#xff0c;它可以用于生成大量的文本内容。但是&#xff0c;由于ChatGPT需要的计算资源较大&#xff0c;处理时间较长&#xff0c;因此在批量写作时需要考虑花费的时间和资源。 以下是一些步骤&…

又一个免费GPT-4工具 Cursor,程序员写代码将被颠覆

每天都被openai震撼到&#xff0c; 他们家被广为人知的产品是chatgpt&#xff0c;就是那个聊天工具。现在已经开始有越来越多的产品集成openai&#xff0c;比如微软的office&#xff0c;bing。现在又一个工具出现&#xff0c;一个叫Cursor的编辑器已经集成了openai的GPT-4&…

Spring系列(六) --- SpringBoot 与 Servlet 的比较及 Spring 读取配置文件的方式

SpringSpringBoot VS ServletSpring 读取配置文件的方式yml 和 properties 的区别SpringBoot VS Servlet Spring 读取配置文件的方式 1 Value 注解获取单个配置项 如在 yml 中定义一个 qq 音乐的 token; 然后输出, 如下: 2 针对对象的读取: ConfigurationProperties 在 yml 中…

YOLOv5添加辅助训练头

1. 介绍 思路 添加 Aux head 的主要原因是让网络中间层学到更多信息,有更丰富的梯度信息帮助训练。这里要注意,好的梯度信息能够让相同参数量的网络学的更好。 作者原文为: By letting the shallower auxiliary head directly learn the information that lead head has l…

【C#基础】泛型的概念?有什么例子?在游戏中有什么可以使用的地方?

概念 让chatGpt来为我们讲解。 在C#中&#xff0c;泛型是一种允许开发人员编写可重用代码&#xff0c;可以处理多种数据类型的特性。 使用泛型&#xff0c;可以创建类、方法、接口和委托这种不属于任何特定数据的类型&#xff0c;但可以处理满足某些约束条件的任何数据类型。…

手机银行评测系列:北京银行“京彩生活”7.0从用户视角出发,实现沉浸式体验重塑

易观&#xff1a;2023年3月28日&#xff0c;北京银行发布“京彩生活”APP 7.0版本&#xff0c;从旅程再造、特色金融、场景生态、平台联动、协同经营、体验管理和安全守护七大方面全面升级&#xff0c;从用户视角出发&#xff0c;重塑用户旅程&#xff0c;简化操作流程&#xf…

PDF Extra(安卓)

首先&#xff0c;软件是一个一体化的扫描仪和编辑器&#xff0c;工具主要包含有编辑&#xff0c;创建&#xff0c;转换&#xff0c;阅读和查看&#xff0c;其它等等多个功能类型。 编辑里面包含有编辑文本和图像&#xff0c;填写并签署&#xff0c;组织页面&#xff0c;压缩&am…