用moment.js构造带操作区的VUE个性化日历
作者:admin 日期:2021-12-01
这次项目需要用到这样一个稍有点特别的日历,每一天有一个“操作区”(根据数据有不同的操作),因为这个形态有点特殊,所以无法直接使用vant的日历组件。之前这个日历列表是由后端同事提供的。后来我自己对moment.js的操作比较熟练了,自己构造了一个,主要代码如下。
Javascript代码
- initCale(){
- const NOW = moment('2021-05-16')
- let _first = _.cloneDeep(NOW).startOf('month') //月头
- let _last = _.cloneDeep(NOW).endOf('month') //月尾
- // 计算本月数据
- let days = NOW.daysInMonth() //本月天数
- let list = [] //最终日期列表,存入这个数组
- for (let ii = 0; ii < days; ii++) {
- let dd = _.cloneDeep(_first).add(ii, 'days') //从月头开始往后推算整月
- list.push(
- {
- date:dd.format('YYYY-MM-DD'),
- sd:dd.format('DD'),
- day:dd.day(), //星期几
- used:true,
- today:dd.format('YYYY-MM-DD')==NOW.format('YYYY-MM-DD') //今天
- }
- )
- }
- // 补月头(上个月剩下的几天)
- let lenHead = _first.day()-1 //本月第一天是星期几?从而推算月头天数
- for (let ii = 1; ii <= lenHead; ii++) {
- let dddd = _.cloneDeep(_first).add(-ii, 'days')
- list.unshift(
- {
- date:dddd.format('YYYY-MM-DD'),
- sd:dddd.format('DD'),
- day:dddd.day(),
- used:false
- }
- )
- }
- // 补月尾
- let lenTail = 7 - _last.day() //月尾天数
- for (let ii = 1; ii <= lenTail; ii++) {
- let dddd = _.cloneDeep(_last).add(ii, 'days')
- list.push(
- {
- date:dddd.format('YYYY-MM-DD'),
- sd:dddd.format('DD'),
- day:dddd.day(),
- used:false
- }
- )
- }
- this.caleList = list //caleList是VUE中用于渲染出日历的变量
- },
- 主要HTML:
- <ul class="caleList">
- <li class="top">一</li>
- <li class="top">二</li>
- <li class="top">三</li>
- <li class="top">四</li>
- <li class="top">五</li>
- <li class="top">六</li>
- <li class="top">日</li>
- <li v-for="item in caleList" :key="item.date"
- :class="[{'used':item.used},{'today':item.today}]"
- >
- <div class="date">{{item.sd}}</div>
- <div class="opt" v-if="item.used">操作</div>
- </li>
- </ul>
- 主要CSS(LESS):
- .caleList{
- display: flex; flex-wrap: wrap;
- li{
- flex:1 0 100%/7;
- border: 1px #fff solid;
- background-color: #aaa;
- color: #777;
- &.top{
- background-color: #fff; color: #900;
- border: none;
- height: 40px; display: flex; align-items: center; justify-content: center;
- }
- &.used{
- background-color: #eee;
- color: #333;
- }
- &.today{
- background-color: rgb(163, 10, 31); color: #fff;
- }
- .date{
- font-size: 24px;
- display: flex; align-items: center; justify-content: center;height: 35px;
- }
- .opt{
- font-size: 12px;
- padding: 0px 15px 10px; text-align: center;
- color: rgb(112, 11, 11);
- line-height: 120%;
- }
- }
- }
因为逻辑比较简单,此处并没有抽象成组件,有需要再说。
特别感谢知友的这篇文章:
疑问已解决:vue.js在采用ajax方式读入数据后,无法激活slide插件的滑动行为已经解决
作者:admin 日期:2016-01-22在vue.js的git上面提交的issue:
我在mui+vue.js构建一个slide-pic组件,图片数据用ajax方式获取,vm数据能获取到,dom也发生了相应的改变。但数据读入后,无法激活slide组件的滑动行为。
以下是我做的一些探索:
直接使用vue初始化数据(非ajax)可以激活滑动行为。
使用jquery的append方式,把数据结合到dom后,也可以激活。
我将mui的slide-pic组件换成另一个滑动图插件TouchSlide1.1后,同样的现象,用vm方式无法激活。
请问这是什么原因?到底是vue还是mui/TouchSlide 插件机制的问题。
XML/HTML代码
- 以下是无法激活滑动的主要代码:
- <div id="slider" class="mui-slider" >
- <div class="mui-slider-group">
- <div class="mui-slider-item" v-for="el in list"><img :src="el.picUrl"> </div>
- </div>
- </div>
- <script>
- var vm = new Vue({
- el: '#slider',
- data: {list: [] }
- });
- // 读取图片slide
- mui.ajax({ url: "shopData/slidePic.json", dataType: "json",
- success: function(data){
- vm.list = data.list;
- mui("#slider").slider({
- interval: 3000
- });
- }
- });
- </script>
- ----------------------------------------------
- 以下是可以成功激活的代码:
- mui.ajax({ url: "shopData/slidePic.json", dataType: "json",
- success: function(data){
- for (var i = 0; i < data.list.length; i++) {
- $(".mui-slider-group").append(
- '<div class="mui-slider-item" ><img src="'+ data.list[i].picUrl + '"> </div>'
- );
- }
- mui("#slider").slider({
- interval: 3000
- });
- }
- });
此问题由VUE及MUI的技术版主解答了,较常见,用nextTick就解决了。
代码如下:
XML/HTML代码
- vm_slide.$nextTick(function () {
- // DOM 现在更新了
- mui("#slider").slider({
- interval: 3000
- });
- })