Vue日历

Vue生成日历,根据返回值将日期标红

HTML:

<h1>CSS 日历</h1>

<div id="calendar">

<div class="month">

<ul>

<!-- <li class="arrow" @click="pickPre(currentYear,currentMonth)">?</li> -->

<li class="year-month" @click="pickYear(currentYear,currentMonth)">

<span class="choose-year">{{ currentYear +‘/‘+currentMonth}}</span>

<!-- <span class="choose-month">{{ currentMonth }}</span> -->

</li>

<!-- <li class="arrow" @click="pickNext(currentYear,currentMonth)">?</li> -->

</ul>

</div>

<ul class="weekdays">

<li>一</li>

<li>二</li>

<li>三</li>

<li>四</li>

<li>五</li>

<li style="color:red">六</li>

<li style="color:red">日</li>

</ul>

<ul class="days">

<li @click="pick(day)" v-for="day in days">

<!--今天-->

<span v-if="day.getMonth()+1 != currentMonth" class="other-month">{{ day.getDate() }}</span>

<span v-else>

<!--今天-->

<span :class="{active:j(day.getFullYear(),day.getMonth()+1,day.getDate())}">{{ day.getDate() }}</span>

<!-- <span v-if="day.getFullYear() == new Date().getFullYear() && day.getMonth() == new Date().getMonth() && day.getDate() == new Date().getDate()" class="active">{{ day.getDate() }}</span> -->

<!-- <span v-else>{{ day.getDate() }}</span> -->

</span>

</li>

</ul>

</div>

css:

<style type="text/css">

* {

box-sizing: border-box;

}

ul {

list-style-type: none;

}

body {

font-family: Verdana, sans-serif;

background: #E8F0F3;

}

#calendar {

width: 560px;

height: 400px;

margin: 0 auto;

border: 2px solid #000;

background: #fafafa;

}

.month {

width: 100%;

height: 60px;

}

.year-month {

height: 60px;

text-align: center;

line-height: 60px;

font-size: 26px;

}

.weekdays {

margin: 0;

padding: 6px 20px;

background-color: #f2f2f2;

display: flex;

color: #333;

justify-content: space-around;

}

.weekdays li {

display: inline-block;

width: 40px;

height: 40px;

text-align: center;

line-height: 40px;

font-size: 18px;

font-weight: bold;

}

.days {

padding: 15px 20px;

background: #FFFFFF;

margin: 0;

display: flex;

flex-wrap: wrap;

justify-content: space-around;

}

.days li {

list-style-type: none;

display: inline-block;

width: 14.2%;

text-align: center;

padding: 4px 0;

font-size: 16px;

color: #000;

}

.days li .active {

border-radius: 50%;

background: red;

color: #fff;

}

.days li span {

display: inline-block;

width: 40px;

height: 40px;

line-height: 40px;

font-weight: bold;

}

.days li .other-month {

color: gainsboro;

}

.days li:hover {

background: #e1e1e1;

}

</style>

javascript:

<script type="text/javascript">

new Vue({

el: ‘#calendar‘,

data: {

currentDay: 1,

currentMonth: 1,

currentYear: 1970,

currentWeek: 1,

days: [],

addDay: [],

},

created: function() {

this.initData(null);

var $this = this;

//请求数据

$.ajax({

url: "这里填接口名称",

type: "POST",

data: {

name: ‘‘,

params: ‘‘

},

dataType: "json",

async: false,

success: function(data) {

console.log(data);

$this.addDay = data;

},

error: function(xhr) {

console.log(xhr);

}

});

},

methods: {

j: function(y, m, d) {

//将传入的参数转换成字符串,作比较

var Y = y.toString();

var M = m < 10 ? ‘0‘ + m : m.toString();

var D = d < 10 ? ‘0‘ + d : d.toString();

//判断日历日期跟数据返回日期做对比

for (var i = 0; i < this.addDay.length; i++) {

if (toData(this.addDay[i][‘日历日期‘]) == (Y + M + D)) {

return true

}

}

function toData(date) { //将时间戳转化成标准的日期格式

if (date == null) {

return "";

}

var ndate = new Date(date);

var Y = ndate.getFullYear();

var M = (ndate.getMonth() + 1 < 10 ? ‘0‘ + (ndate.getMonth() + 1) : ndate.getMonth() + 1);

var D = (ndate.getDate() < 10 ? ‘0‘ + (ndate.getDate()) : ndate.getDate());

ndate = Y + M + D;

return ndate;

}

},

initData: function(cur) {

var date;

if (cur) {

date = new Date(cur);

} else {

date = new Date();

}

this.currentDay = date.getDate();

this.currentYear = date.getFullYear();

this.currentMonth = date.getMonth() + 1;

this.currentWeek = date.getDay(); // 1...6,0

if (this.currentWeek == 0) {

this.currentWeek = 7;

}

var str = this.formatDate(this.currentYear, this.currentMonth, this.currentDay);

// console.log("today:" + str + "," + this.currentWeek);

this.days.length = 0;

// 今天是周日,放在第一行第7个位置,前面6个

for (var i = this.currentWeek - 1; i >= 0; i--) {

var d = new Date(str);

d.setDate(d.getDate() - i);

// console.log("y:" + d.getDate());

this.days.push(d);

}

for (var i = 1; i <= 35 - this.currentWeek; i++) {

var d = new Date(str);

d.setDate(d.getDate() + i);

this.days.push(d);

}

},

pick: function(date) {

alert(this.formatDate(date.getFullYear(), date.getMonth() + 1, date.getDate()));

},

pickPre: function(year, month) {

// setDate(0); 上月最后一天

// setDate(-1); 上月倒数第二天

// setDate(dx) 参数dx为 上月最后一天的前后dx天

var d = new Date(this.formatDate(year, month, 1));

d.setDate(0);

this.initData(this.formatDate(d.getFullYear(), d.getMonth() + 1, 1));

},

pickNext: function(year, month) {

var d = new Date(this.formatDate(year, month, 1));

d.setDate(35);

this.initData(this.formatDate(d.getFullYear(), d.getMonth() + 1, 1));

},

pickYear: function(year, month) {

alert(year + "," + month);

},

// 返回 类似 2016-01-02 格式的字符串

formatDate: function(year, month, day) {

var y = year;

var m = month;

if (m < 10) m = "0" + m;

var d = day;

if (d < 10) d = "0" + d;

return y + "-" + m + "-" + d

},

}

});

</script>

时间: 2024-09-30 18:58:00

Vue日历的相关文章

Vue日历控件

<html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>测试</title> <!-- 引入样式 --> <link rel="stylesheet" href="https://unpkg

vue初学实践之路——vue简单日历组件

---恢复内容开始--- 最近做的项目有一个需求,需要有一个日历组件供预定功能使用,之前的代码过于繁琐复杂,所以我采用vue重写了这个组件. npm.vue等等安装. 只是一个简单的日历组件,所以并不需要用到node服务器,只需要一个Html文件即可. 项目基本目录 首先在引入 vue.js <script src="https://unpkg.com/vue/dist/vue.js"></script> 贴上最主要的html和js代码 <div id=&

Vue 组件(component)之 精美的日历

公司的要求,需要开发一个精美的日历组件(IOS , 安卓, PC 的IE9+都能运行),写完后想把它分享出来,希望大家批评(). 先来个截图 代码已经分享到 https://github.com/zhangKunUserGit/vue-component    根据需求先说一下怎么用吧 (上面是:HTML, 下面是JS ) <date-picker v-if="showDatePicker" :date="date" :min-date="minDa

Vue自定义日历组件

今天给大家介绍Vue的日历组件,可自定义样式.日历类型及支持扩展,可自定义事件回调.Props数据传输. 线上demo效果 示例 Template: <Calendar :sundayStart="true" :calendarType="1" :markDate="markDate" :markDateClass="markDateClass" :agoDayPrevent="agoDayPrevent&qu

Vue.js与WdatePicker日历控件冲突问题的解决方案

问题:同时使用Vue.js与WdatePicker时,双向绑定的日期字段获取不到界面输入的值,而且别的字段的值改变后,日期控件的内容会被清空 原因:WdatePicker不是Vue的插件,不能响应Vue的绑定.修改别的字段值后,因为日期字段的值为空,所以也会把日期控件内容清空 解决方案:日期控件的绑定blur事件,事件中为日期字段赋值.如: $_recordEditVM_checkDateBlur:function(){ if($.trim($('#checkDate').val()).leng

semantic、vue 使用分页组件和日历插件

最近正在试试semantic-ui,结合了vue,这里忍不住吐槽semantic和vue的友好度简直不忍直视,不过既然用了,这里就分享几个用到的插件了 1.分页组件(基于vue) var pageComponent = Vue.extend({ template: `<div class="ui floated pagination menu"> <a class="icon item" :class="{\'disabled\':cur

vue - 小日历项目制作中的问题与解决思路

效果图: 项目难点: 1. 每个月的日期数是不定的,拢共需要几个格子? 按照教程的做法需要42个.所以遍历数字42,得到42个div做格子. 2. 格子的排版怎么做? 顶部的星期布局使用的flex水平方向两边对齐并单项flex为1占满空间. 下边格子用了grid布局(具体见源码css) 3. 本月一号是星期几怎么计算? 可以利用Date对象提供的公式计算: new Date(目标年份,目标月份 - 1,1).getDay(); 4. 本月最大天数是几怎么计算? 可以利用口诀计算:... 也可以利

vue之手把手教你写日历组件

---恢复内容开始--- 1.日历组件 1.分析功能:日历基本功能,点击事件改变日期,样式的改变 1.结构分析:html 1.分为上下两个部分 2.上面分为左按钮,中间内容展示,右按钮 下面分为周几展示和日期展示 3.基本结构页面html书写 <template>    <div class="calender2">        <div class="date-header">            <div class

基于vue的自定义日历组件

如果本文帮助到你,本人不胜荣幸,如果浪费了你的时间,本人深感抱歉.希望用最简单的大白话来帮助那些像我一样的人.如果有什么错误,请一定指出,以免误导大家.也误导我. 项目github地址 线上demo地址 使用步骤: 1.安装包 cnpm i 2.运行dev npm run dev 项目目录: 自定义农历节日: yinli_festival.json { "01-06":"阴历节1", "01-10":"阴历节2", "