pc端个性化日历实现

  1. 技术:vue => v-forslot-scop 插槽域
  2. 需求:需要实现日历上每一天动态显示不同的信息
  3. 思路:运用vue slot-scop 插槽域的知识点,将个性化的代码样式放到slot 再通过slot-scop 获取这个插槽中的所需数据

一、实现日历组件

  1. 思路:布局上就是一个7列,行数不确定的表格。只不过,日历的表格是宽和高相等,随着浏览器的大小变化,表格大大小也要变化,所以要用padding布局,难点在日期数组的生成上面。
  2. 1.布局的实现
  3. <div class="calendar">
  4. <div class="calendar-operation">
  5. <span class="calendar-title">{{title}}</span>
  6. <div class="calendar-YearMonth">
  7. <Icon type="ios-arrow-back" style="margin-right:30px;" @click="prev" />
  8. <div class="calendar-YearMonth-content">{{YearMonth}}</div>
  9. <Icon type="ios-arrow-forward" style="margin-left:30px;color:" @click="next" />
  10. </div>****
  11. </div>
  12. <div class="calendar-head">
  13. <div class="calendar-head-item">星期日</div>
  14. <div class="calendar-head-item">星期一</div>
  15. <div class="calendar-head-item">星期二</div>
  16. <div class="calendar-head-item">星期三</div>
  17. <div class="calendar-head-item">星期四</div>
  18. <div class="calendar-head-item">星期五</div>
  19. <div class="calendar-head-item">星期六</div>
  20. </div>
  21. <div class="calendar-content">
  22. <div v-for="(item,index) in dateArray" :key="index" class="calendar-row">
  23. <div v-for="(val,key) in item" :key="key" :class="{'calendar-cols':true,'calendar-enable':!val.enable}">
  24. <span class="calendar-cols-content">{{val.value}}</span>
  25. <div class="calendar-cols-opera" >
  26. <div style="height:100%;">
  27. <slot :oper = 'val.oper'></slot>
  28. </div>
  29. </div>
  30. </div>
  31. </div>
  32. </div>
  33. </div>
  34. <style scoped lang="less">
  35. .calendar{
  36. width:100%;
  37. border:1px solid #e8eaec;
  38. border-left: 0;
  39. border-radius: 8px;
  40. background: #fff;
  41. .calendar-operation {
  42. height: 60px;
  43. border-bottom: 1px solid #e8eaec;
  44. border-left:1px solid #e8eaec;
  45. .calendar-title{
  46. display:block;
  47. font-size:12px;
  48. color:#fb9153;
  49. float: left;
  50. height: 100%;
  51. line-height:60px;
  52. padding-left: 40px;
  53. }
  54. .calendar-YearMonth{
  55. display: flex;
  56. height: 100%;
  57. justify-content: center;
  58. align-items: center;
  59. font-size:17px;
  60. color: #fb9153;
  61. }
  62. }
  63. .calendar-head {
  64. display: flex;
  65. height:40px;
  66. border-bottom: 1px solid #e8eaec;
  67. border-left:1px solid #e8eaec;
  68. .calendar-head-item {
  69. flex: 1;
  70. height:100%;
  71. line-height:40px;
  72. font-size: 12px;
  73. text-align: center;
  74. border-left: 1px solid #e8eaec;
  75. }
  76. }
  77. .calendar-content {
  78. width: 100%;
  79. .calendar-row{
  80. width:100%;
  81. display: flex;
  82. .calendar-cols {
  83. position: relative;
  84. flex: 1;
  85. height: 0;
  86. padding-bottom: 14%;
  87. border-bottom: 1px solid #e8eaec;
  88. border-left: 1px solid #e8eaec;
  89. .calendar-cols-content{
  90. display:block;
  91. text-align: right;
  92. height:0;
  93. padding-bottom: 15%;
  94. box-sizing: border-box;
  95. padding: 0 10px;
  96. margin-bottom: 15%;
  97. }
  98. .calendar-cols-opera{
  99. width:100%;
  100. height: 0;
  101. padding-bottom: 84%;
  102. box-sizing: border-box;
  103. overflow-y: auto;
  104. }
  105. }
  106. }
  107. .calendar-enable{
  108. color: #e8eaec;
  109. }
  110. }
  111. }
  112. </style>
  113. 2.日历数组的实现
  114. 思路:获取当前月有多少天,当月第一天对应的星期。
  115. 实现:如何获取这个月的天数,通过下一个月的第一天 减去一天时间就是这个月的最后一天,进而能知道这个月的天数
  116. //获取当月最后一天
  117. function getLastDate(year,month) {
  118. let currentMonth = month - 1
  119. let nextMonth = currentMonth + 1
  120. if(nextMonth > 11 ) {
  121. nextMonth = 0
  122. year++
  123. }
  124. //let nextMonthFisrtDate = new Date(year,nextMonth,1).getDate()
  125. let lastDate = new Date(new Date(year,nextMonth,1).getTime() - 1000*60*60*24).getDate()
  126. return lastDate
  127. }
  128. //获取当月第一天对应的星期
  129. function getFirstDay(year,month) {
  130. let currentMonth = month - 1
  131. return new Date(year,currentMonth,1).getDay()
  132. }
  133. //获取最后一天的星期
  134. function getLastDay(year,month) {
  135. let currentMonth = month - 1
  136. return new Date(year,currentMonth,getLastDate(year,month)).getDay()
  137. }
  138. //获取当月 日期数据
  139. function getDateArray(yearMonth) {
  140. let year = parseInt(yearMonth.split('-')[0])
  141. let month = parseInt(yearMonth.split('-')[1])
  142. let dateArray = []
  143. let firstDay = getFirstDay(year,month,1)
  144. let lastDate = getLastDate(year,month)
  145. let lastDateDay = getLastDay(year,month)
  146. let prevLastDate = getLastDate(year,month - 1)
  147. //缓存每一行数据
  148. let newArr = []
  149. //获取第一行数据
  150. for(let i=1;i<=7;i++){
  151. if(i<=firstDay){
  152. newArr.push({
  153. date:'',
  154. value: prevLastDate - (firstDay-i),
  155. enable: false,
  156. oper:{}
  157. })
  158. }
  159. else{
  160. newArr.push({
  161. date:new Date(year,month-1,i-firstDay).getTime(),
  162. value:i-firstDay,
  163. enable: true,
  164. oper:{}
  165. })
  166. }
  167. }
  168. dateArray.push(newArr)
  169. newArr = [] //清空
  170. let count = 0
  171. for (let i=(7-firstDay+1);i<=lastDate;i++){
  172. if ( count < 7){
  173. newArr.push({
  174. date:new Date(year,month-1,i).getTime(),
  175. value:i,
  176. enable:true,
  177. oper:[]
  178. })
  179. }
  180. else{
  181. dateArray.push(newArr)
  182. newArr = []
  183. newArr.push({
  184. date:new Date(year,month-1,i).getTime(),
  185. value:i,
  186. enable:true,
  187. oper:[]
  188. })
  189. count = 0
  190. }
  191. if (i == lastDate && count == 6) {
  192. dateArray.push(newArr)
  193. }
  194. count++
  195. }
  196. //获取最后一行
  197. newArr = []
  198. if(lastDateDay<6){
  199. for(let i=0;i<=6;i++){
  200. if(i<=lastDateDay){
  201. newArr.push({
  202. date:new Date(year,month-1,lastDate-(lastDateDay-i)).getTime(),
  203. value:lastDate-(lastDateDay-i),
  204. enable:true,
  205. oper:[]
  206. })
  207. }
  208. else{
  209. newArr.push({
  210. date:'',
  211. value:i-lastDateDay,
  212. enable:false,
  213. oper:[]
  214. })
  215. }
  216. }
  217. dateArray.push(newArr)
  218. }
  219. return dateArray;
  220. }

二、个性化日历使用

  1. <Calendar :operData="operData" @change="calendarChange" :title="title">
  2. <template slot-scope="slotScope">
  3. <div v-for="(item,index) in slotScope.oper " :key="index" class="calendar-oper">
  4. <div class="calendar-oper-tag" :style="{background:tagType[item.type].color}">
  5. <span>{{item.visitTypeCode}}</span>
  6. </div>
  7. <div class="calendar-oper-time">{{item.time}}</div>
  8. <div class="calendar-oper-content">{{item.content}}</div>
  9. </div>
  10. </template>
  11. </Calendar>

# pc端个性化日历实现的更多相关文章

  1. 山西大同大学教务处教师端——可在PC端,手机端操作

    解决问题:大同大学教务处官网教师端口一进去就卡住了,点上面一行的菜单无响应 下载方法(学生端 / 教师端  / 验证脚本): 链接:https://pan.baidu.com/s/1MWrJXoPzE ...

  2. PC端、移动端的页面适配及兼容处理

    转自 一.关于移动端兼容性 目前针对跨终端的方案,主要分为两大阵营:一套资源Vs两套资源. 第一种是通过响应式或页面终端判断去实现一套资源适配所有终端: 第二种是通过终端判断分别调取两套资源以适配所有 ...

  3. 在thinkPHP3.2.3框架下实现手机和PC端浏览器的切换

    查看thinkphp版本号方法 打开文件“根目录\ThinkPHP\ThinkPHP.php”下的文件ThinkPHP.php,在22--23行可以看到版本信息THINK_VERSION,如下图: 说 ...

  4. 如何直接在 PC 端获取其它端设备的 UserAgent 信息呢?

    如何直接在 PC 端获取其它端设备的 UserAgent 信息呢 [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5909615.html 序 希望收 ...

  5. C#--图片上传(PC端和APP)保存及 跨域上传说明

    手动跨域操作文件 补录:跨域访问文件夹文件是一种常见的需求,下面主要介绍的的通过代码使用具有权限账号的人来达到跨域操作文件的能力. 现在补充一下普通的一些需求场景,今天就遇到了一种需要经常需要登录远程 ...

  6. 判断是pc端还是手机端,并跳转到相应页面

    <!-- 判断浏览器是否为手机端 -->  <script>     // class     ! function(navigator) {         var user ...

  7. 阻止pc端浏览器缩放js代码

    阻止pc端浏览器缩放js代码 众所周知:移动端页面禁止用户缩放界面只需加上<meta name="viewport" content="user-scalable= ...

  8. 关于pc端直播

    写这篇文章首先是想给自己一个总结.整理,还有就是给那些 没有特别明白直播是怎么回事的人一点 思路 最近公司想要做pc端直播,作为一个自认为很菜的前端实在是不知从何下手,所以只能用国人最爱的百度,搜索了 ...

  9. PHP项目实现手机端和PC端的页面切换

    目前访问页面的要切换成手机端和PC端,原理是通过对设备作出判断,显示不同的功能和页面. 如果手机端和PC端的功能结构不相同,一般会写两套系统,一套适用于PC端,一套适用于手机端. 如果功能相同,则只需 ...

随机推荐

  1. Ubuntu VNC 打开spyder无法输入(检测不到键盘配置)解决方法

    在ubuntu中安装好spyder后, 打开spyder发现无法输入. 在打开spyder的终端窗口,有如下提示: QXcbConnection: Failed to initialize XRand ...

  2. spring boot(15)-异常处理

    异常传递 如图:服务层和dao层的异常最终都会到达控制层,控制层的异常则会自动记入logback日志系统.所以我们应该在控制层来捕获系统异常 捕获控制层异常 import org.slf4j.Logg ...

  3. 关于 ExpressRoute 的虚拟网络网关

    虚拟网络网关用于在 Azure 虚拟网络和本地位置之间发送网络流量. 配置 ExpressRoute 连接时,必须创建并配置虚拟网络网关和虚拟网络网关连接. 创建虚拟网络网关时,需要指定几项设置. 其 ...

  4. Oracle EBS 键弹性域 段限定词取值

    中间是回车符 对应编码时 Chr(10) substr(replace(t.compiled_value_attributes, Chr(10), ''), 3, 1)

  5. RHEL7系统管理之内核管理

    1. Kdump工具 Kdump的工作机制是在内核崩溃时, 通过kexec 工具由BIOS启动一个备用内核, 由备用内核执行一系列任务,保存内存中崩溃内核的状态, 供后续故障分析用. 本文默认AMD或 ...

  6. Oracle 18c新特性一览

    1. 一般新特性 1.1. Shadow Lost Write Protection Shadow lost write protection检测到一个丢失的写,它会导致一个主要的数据损坏.可以在不需 ...

  7. [翻译] CHTCollectionViewWaterfallLayout

    CHTCollectionViewWaterfallLayout https://github.com/chiahsien/CHTCollectionViewWaterfallLayout CHTCo ...

  8. sudo实例--企业生产环境用户权限集中管理方案实例

    根据角色的不同,给不同的用户分配不同的角色1.创建初级工程师3个,网络工程师1个,中级工程师1个,经理1个      #  批量创建用户 for user in chuji{01..03} net01 ...

  9. Linode VPS主机套餐方案降低处理方法且不影响数据

    使用Linode VPS主机产品经历过512MB内存升级至1GB内存,再升级至2GB内存,以及目前推出1GB内存方案月付10美元.比如我们在使用Linode 2GB内存方案的时候占用资源不是太多,其实 ...

  10. 解决qpidd服务安装不上的问题

    前几天对一个文件夹命名,忘记了qpidd的路径在这个文件夹的下面,导致后来qpidd用不了. 并且有打开计算机-管理-服务时,看到Advanced MessageQueuing Protocol 未启 ...