element ui el-calendar日历组件完整代码

el-calendar日历组件完整代码

    • [1. 说在前面](#1. 说在前面)
    • [2. 日历整体代码](#2. 日历整体代码)
    • [3. 编辑与新增](#3. 编辑与新增)

1. 说在前面

  • 最近一直忙于上班,没咋看博客,发现很多小伙伴都要日历组件的代码,于是今天抽空给大家整理一下,为爱发电!
  • 日历组件的原文在这里,建议先看这个哈:日历组件使用总结
  • 需求说明和注意事项都在上文了,这篇文章纯代码。
  • 由于此页面很复杂,为了让大家减轻看代码的负担,去掉了很多没用的逻辑。
  • data()里面的数据和css就没一个个搞了,大家看着来。
  • 一年多前写的,还是Vue2的语法。

2. 日历整体代码

javascript 复制代码
    <el-dialog
      title="新增日计划"
      :visible.sync="dialogVisible"
      width="80%"
      :close-on-click-modal="false"
      :close-on-press-escape="false"
      :before-close="handleClose"
    >
      <div>
        <el-form :inline="true" :model="formInline" class="demo-form-inline">
          <el-form-item label>
            <el-form-item label="月份:">
              <el-date-picker
                v-model="formInline.month"
                type="month"
                placement="bottom-start"
                value-format="yyyy-MM"
                format="yyyy-MM"
                placeholder="选择月"
                clearable
                @change="monthChange"
              ></el-date-picker>
            </el-form-item>
          </el-form-item>
          <el-form-item label>
            <el-select
              v-model="formInline.projectId"
              clearable
              placeholder="选择项目"
              @change="projectChangeFn"
            >
              <el-option
                v-for="(item, index) in projectArr"
                :key="index"
                :label="item.proRemake"
                :value="item.id"
              ></el-option>
            </el-select>
          </el-form-item>
          <el-form-item>
            <el-button type="primary" @click="editDetail()">查询</el-button>
          </el-form-item>
        </el-form>
        <el-calendar v-model="value">
          <!-- 这里使用的是 2.5 slot 语法,对于新项目请使用 2.6 slot 语法-->
          <template slot="dateCell" slot-scope="{ date, data }">
            <div class="main-cd" @click="addPlan(data)">
              <div class="calendar-day">
                {{ data.day.split("-").slice(2).join("-") }}
              </div>
              <div
                v-for="(item, index) in calendarData"
                :key="index"
                class="is-selected"
                @click.stop="addPlan(item)"
              >
                <span v-if="item.day == data.day && item.timeDetailsList">
                  <el-tooltip placement="top">
                    <div slot="content">
                      <div
                        v-for="items in item.timeDetailsList"
                        :key="items.day"
                      >
                        {{ items.channelName }} :
                        {{ items.wechatNumber }}个微信号, 计划投放{{
                          items.planNumber
                        }}, 实际加人
                        {{ items.realityNumber }}
                      </div>
                    </div>
                    <div v-for="items in item.timeDetailsList" :key="items.day">
                      {{ items.channelName }} :
                      {{ items.wechatNumber }}个微信号, 计划投放{{
                        items.planNumber
                      }}, 实际加人
                      {{ items.realityNumber }}
                    </div>
                  </el-tooltip>
                </span>
              </div>
            </div>
          </template>
        </el-calendar>
      </div>
      <span slot="footer" class="dialog-footer">
        <el-button @click="dialogVisible = false">取 消</el-button>
        <el-button type="primary" @click="dialogVisible = false"
          >确 定</el-button
        >
      </span>
    </el-dialog>
  • 实现的效果是这样的:
  • 对应的控制方法在这里:
javascript 复制代码
// 关闭弹窗
 handleClose() {
   this.dialogVisible = false;
 },
// 月份改变,下面的数据刷新
 monthChange(val) {
    // 这里的数据就是当前月份
    this.value = val;
    // 去请求不同月份的数据 刷新日历组件
    this.editDetail();
  },
 // 接口请求
 editDetail(){
	// 请求接口,目的就是刷新日历数据 => calendarData 
	this.calendarData = res.data;
 },

3. 编辑与新增

  • 接下来是新增与编辑的逻辑,其实就是打开两个不同的弹窗:
  • 当然,逻辑做了删减,因为大家肯定是不需要的。
javascript 复制代码
	<!-- 新增 -->
    <el-dialog
      :title="diaTitle"
      width="70%"
      :visible.sync="dialogFormVisible"
      :close-on-click-modal="false"
      :close-on-press-escape="false"
    >
      <div class="parent-con">
        <div class="left">
          <div class="tips">设置微信号</div>
        </div>
      </div>
      <div slot="footer" class="dialog-footer form-footer">
        <el-button @click="dialogFormVisible = false">取 消</el-button>
        <el-button type="primary" @click="confirmFn">保 存</el-button>
        <el-button type="primary" @click="confirmFn('next')" v-if="isAdd"
          >保存并创建下个计划</el-button
        >
      </div>
    </el-dialog>

    <!-- 编辑弹窗 -->
    <el-dialog
      title="编辑日计划"
      :visible.sync="dialogVisibleEdit"
      width="60%"
      :close-on-click-modal="false"
      :close-on-press-escape="false"
      :before-close="handleCloseEdit"
    >
      <div class="edit-time">时间:{{ editTime }}</div>
      <span slot="footer" class="dialog-footer">
        <el-button @click="dialogVisibleEdit = false">取 消</el-button>
        <el-button type="primary" @click="confirmEditFn">确 定</el-button>
      </span>
    </el-dialog>
  • 打开编辑与新增,是共用一个方法
javascript 复制代码
addPlan(item) {
	// 此方法是用来清空数据的,防止数据重复
	this.clearDataForm();
	// 编辑才有这个参数
    if (item && item.projectId) {
    	this.diaTitle = "编辑日计划";
    	this.dialogVisibleEdit= true; // 打开编辑
    	// 调用接口 做数据回显
    }else {
    	// 此处做新增逻辑
    	this.diaTitle = "新增日计划";
    	this.dialogFormVisible = true;  // 打开新增
    }
}
  • 其他逻辑实现:
javascript 复制代码
 // 监听日历的当前值
  watch: {
    value(val, oldVal) {
      this.nowTime = this.newDate(val);
      let tempIndex = this.getIndex();
      // 匹配某一项数据
      if (tempIndex > -1) {
        this.inputVal = this.calendarData[tempIndex].things;
      } else {
        this.inputVal = "";
      }
    },
  },
  // 做对应的处理,这是在 methods里面的 时间转换
  newDate(time) {
      let date = new Date(time);
      let y = date.getFullYear();
      let m = date.getMonth() + 1;
      m = m < 10 ? "0" + m : m;
      let d = date.getDate();
      d = d < 10 ? "0" + d : d;
      return y + "-" + m + "-" + d;
   },
   //  用于匹配与当前日期相符的数据 
   getIndex() {
      let tempIndex = this.calendarData.findIndex(
        (item) => item.date == this.nowTime
      );
      return tempIndex;
    },
     // 初始化时间 => 在 mounted 里调用的
    initData() {
      this.nowTime = this.newDate(this.value);
    },
  • css部分,没做删减了,大家要的肯定在里面,需要找一下:
javascript 复制代码
<style lang="scss" scoped>
.add-bidding {
  .calendar-day {
    color: #202535;
    font-size: 14px;
  }
  .is-selected {
    color: #f8a535;
    font-size: 12px;
    overflow: hidden;
    text-overflow: ellipsis;
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 2;
  }
  #calendar
    .el-button-group
    > .el-button:not(:first-child):not(:last-child):after {
    content: "当月";
  }
  .inputVal {
    width: 300px;
  }
  .main-cd {
    width: 100%;
    height: 100%;
    padding: 10px;
    overflow: hidden;
  }
  ::v-deep .el-calendar-day {
    padding: 0;
  }
  ::v-deep .el-calendar-table:not(.is-range) td.next {
    display: none;
  }

  ::v-deep .el-calendar-table:not(.is-range) td.prev {
    visibility: hidden;
  }
  ::v-deep .el-calendar__button-group {
    display: none;
  }

  .now-time {
    font-size: 18px;
    height: 40px;
    line-height: 40px;
    span {
      color: #409eff;
    }
  }
  .form-footer {
    text-align: center;
  }
  .edit-time {
    margin-bottom: 20px;
    font-size: 16px;
  }
  .check-staff-box {
    margin-top: 10px;
    display: flex;
    flex-wrap: wrap;
    .csb-child {
      margin-right: 20px;
    }
  }
  .parent-con {
    width: 100%;
    .tips {
      width: 100%;
      border-left: 4px solid #525357;
      text-indent: 10px;
      margin-bottom: 20px;
      font-size: 16px;
      font-weight: bold;
    }
  }
  .remarke {
    color: #999999;
  }
  .rule-num {
    margin-top: 10px;
  }
}
</style>

1. 希望本文能对大家有所帮助,如有错误,敬请指出

2. 原创不易,还请各位客官动动发财的小手支持一波(关注、评论、点赞、收藏)
3. 拜谢各位!后续将继续奉献优质好文
4. 如果存在疑问,可以私信我(主页有Q)

相关推荐
一个处女座的程序猿O(∩_∩)O42 分钟前
完成第一个 Vue3.2 项目后,这是我的技术总结
前端·vue.js
GIS开发特训营2 小时前
Vue零基础教程|从前端框架到GIS开发系列课程(七)响应式系统介绍
前端·vue.js·前端框架·gis开发·webgis·三维gis
Cachel wood3 小时前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
一个处女座的程序猿O(∩_∩)O6 小时前
小型 Vue 项目,该不该用 Pinia 、Vuex呢?
前端·javascript·vue.js
燃先生._.12 小时前
Day-03 Vue(生命周期、生命周期钩子八个函数、工程化开发和脚手架、组件化开发、根组件、局部注册和全局注册的步骤)
前端·javascript·vue.js
2401_8576009515 小时前
SSM 与 Vue 共筑电脑测评系统:精准洞察电脑世界
前端·javascript·vue.js
2401_8576009515 小时前
数字时代的医疗挂号变革:SSM+Vue 系统设计与实现之道
前端·javascript·vue.js
GDAL15 小时前
vue入门教程:组件透传 Attributes
前端·javascript·vue.js
轻口味15 小时前
Vue.js 核心概念:模板、指令、数据绑定
vue.js
2402_8575834915 小时前
基于 SSM 框架的 Vue 电脑测评系统:照亮电脑品质之路
前端·javascript·vue.js