vue 寫一個日歷組件

之前自己寫了一個vue的日歷demo,那時直接引入cdn的vue.js完成的染服,功能簡單别洪,樣式簡單,代碼還寫得亂起八糟柳刮,所有現(xiàn)在用vue-cli搭建一個vue項目來重新開發(fā)一次挖垛,vue--cli搭建vue開發(fā)環(huán)境可參考http://www.reibang.com/p/3d44f8269b47

1,新建日歷組件

引入reset.css秉颗,在assets里新建styles文件夾痢毒,將reset.css文件放在styles目錄下。

在main.js文件里添加:import './assets/styles/reset.css'


0

記得刪除app.vue里的logo


1

然后新建calender.vue蚕甥。在router文件夾下的index.js改寫路由

import Vue from 'vue'

import Router from 'vue-router'

import calender from '@/components/calender'

Vue.use(Router)

export default new Router({

? routes: [

? ? {

? ? ? path: '/',

? ? ? name: 'calender',

? ? ? component: calender

? ? }

? ]

})


calender.vue

<template>

? <div class="calender">

? <h5>開始開發(fā)</h5>

? </div>

</template>

<script>

export default {

? name: 'calender',

? data () {

? ? return {


? ? }

? }

}

</script>

<style scoped>

</style>

然后在:http://localhost:8081哪替,下就可以看到項目效果

2,實現(xiàn)日歷組件的樣式

仿照其他日歷組件的樣式:

2


我自己寫的樣式附代碼


3


<template>

? <div class="calender">

? ? <div class="top">

? ? ? <div class="top_date">

? ? ? ? 2019年7月

? ? ? </div>

? ? ? <div class="btn_wrap">

? ? ? ? <ul>

? ? ? ? ? <li>

? ? ? ? ? ? 下個月

? ? ? ? ? </li>

? ? ? ? ? <li>

? ? ? ? ? ? 今天

? ? ? ? ? </li>

? ? ? ? ? <li>

? ? ? ? ? ? 上個月

? ? ? ? ? </li>

? ? ? ? </ul>

? ? ? </div>

? ? </div>

? ? <div class="date_wrap">

? ? ? <ul class="week">

? ? ? ? ? <li>

? ? ? ? ? ? 一

? ? ? ? ? </li>

? ? ? ? ? <li>

? ? ? ? ? ? 二

? ? ? ? ? </li>

? ? ? ? ? ? <li>

? ? ? ? ? ? 三

? ? ? ? ? </li>

? ? ? ? ? <li>

? ? ? ? ? ? 四

? ? ? ? ? </li>

? ? ? ? ? <li>

? ? ? ? ? ? 五

? ? ? ? ? </li>

? ? ? ? ? <li>

? ? ? ? ? ? 六

? ? ? ? ? </li>

? ? ? ? ? <li>

? ? ? ? ? ? 日

? ? ? ? ? </li>

? ? ? </ul>

? ? ? <ul class="day">

? ? ? ? <li v-for="item in 42" :key=item>

? ? ? ? ? {{item}}

? ? ? ? </li>

? ? ? </ul>

? ? </div>

? </div>

</template>

<script>

export default {

? name: 'calender',

? data () {

? ? return {


? ? }

? }

}

</script>

<style scoped>

.calender{

? width: 600px;

? position: relative;

? margin: 0 auto;

? margin-top: 50px;

? border: 1px solid #ddd;

? padding: 20px;

}

.top{

? width: 100%;

? position: relative;

? display: flex;

? border-bottom: 1px solid #ddd;

? padding-bottom: 20px;

}

.top_date{

? width: 100px;

? text-align: left;

? line-height: 42px;

}

.btn_wrap{

? flex: 1;

? text-align: right

}

.btn_wrap ul{

? display: flex;

? flex-direction: row-reverse

}

.btn_wrap ul li{

? padding: 10px 20px;

? border: 1px solid #ddd;

? font-size: 14px;

? line-height: 20px;

? cursor: pointer

}

.btn_wrap ul li:first-child{

? border-left: none;

}

.btn_wrap ul li:last-child{

? border-right: none;

}

.date_wrap{

? position: relative;

}

.week{

? display: flex;

? flex-direction: row;

? padding: 20px;

? font-size: 16px;

}

.week li{

? width: 14.28%;

}

.day{

? display: flex;

? flex-direction: row;

? padding: 20px;

? font-size: 16px;

? flex-wrap: wrap;

}

.day li{

? width: 14.28%;

? padding: 20px;

? box-sizing: border-box;

? border: 1px solid #ddd

}

.day li:nth-child(n+8){

? border-top:none;

}

.day li:nth-child(n+1){

? border-right: none;

}

.day li:nth-child(7n){

? border-right: 1px solid #ddd

}

</style>




3菇怀,邏輯和功能實現(xiàn)

得到當(dāng)前date凭舶,獲取年份,月份爱沟,日期帅霜,周幾,控制選擇日期呼伸,代碼說明看注釋

<template>

? <div class="calender">

? ? <div class="top">

? ? ? <div class="top_date">

? ? ? ? {{year}}年{{month}}月

? ? ? </div>

? ? ? <div class="btn_wrap">

? ? ? ? <ul>

? ? ? ? ? <li @click="handleShowNextMonth">

? ? ? ? ? ? 下個月

? ? ? ? ? </li>

? ? ? ? ? <li @click="handleShowToday">

? ? ? ? ? ? 今天

? ? ? ? ? </li>

? ? ? ? ? <li @click="handleShowLastMonth">

? ? ? ? ? ? 上個月

? ? ? ? ? </li>

? ? ? ? </ul>

? ? ? </div>

? ? </div>

? ? <div class="date_wrap">

? ? ? <ul class="week">

? ? ? ? ? <li>

? ? ? ? ? ? 日

? ? ? ? ? </li>

? ? ? ? ? <li>

? ? ? ? ? ? 一

? ? ? ? ? </li>

? ? ? ? ? <li>

? ? ? ? ? ? 二

? ? ? ? ? </li>

? ? ? ? ? ? <li>

? ? ? ? ? ? 三

? ? ? ? ? </li>

? ? ? ? ? <li>

? ? ? ? ? ? 四

? ? ? ? ? </li>

? ? ? ? ? <li>

? ? ? ? ? ? 五

? ? ? ? ? </li>

? ? ? ? ? <li>

? ? ? ? ? ? 六

? ? ? ? ? </li>

? ? ? </ul>

? ? ? <ul class="day">

? ? ? ? <li v-for="(item,index) in days" :key=index>

? ? ? ? ? {{item}}

? ? ? ? </li>

? ? ? </ul>

? ? </div>

? </div>

</template>

<script>

export default {

? name: 'calender',

? data () {

? ? return {

? ? year:'',

? ? month:'',

? ? days:[]

? ? }

? },

? methods:{

? ? //得到當(dāng)前年這個月分有多少天

? ? getDays(Y,M){

? ? ? let day = new Date(Y, M, 0).getDate()

? ? ? return day;

? ? },

? ? //得到當(dāng)前年身冀,這個月的一號是周幾

? ? getWeek(Y,M){

? ? ? ? let now = new Date()

? ? ? ? now.setFullYear(this.year)

? ? ? ? now.setMonth(this.month-1)

? ? ? ? now.setDate(1);

? ? ? ? let week = now.getDay();

? ? ? ? return week;

? ? },

? ? pushDays(){

? ? ? ? ? ? //將這個月多少天加入數(shù)組days

? ? ? ? ? ? for(let i = 1; i<=this.getDays(this.year,this.month);i++){

? ? ? ? ? ? ? this.days.push(i)

? ? ? ? ? ? }

? ? ? ? ? ? //將下個月要顯示的天數(shù)加入days

? ? ? ? ? ? for(let i = 1;i<=42-this.getDays(this.year,this.month)-this.getWeek(this.year,this.month);i++){

? ? ? ? ? ? ? this.days.push(i)

? ? ? ? ? ? }

? ? ? ? ? ? //將上個月要顯示的天數(shù)加入days

? ? ? ? ? ? for(let i=0;i<this.getWeek(this.year,this.month);i++){

? ? ? ? ? ? ? var lastMonthDays=this.getDays(this.year,this.month-1)

? ? ? ? ? ? ? ? this.days.unshift(lastMonthDays-i)

? ? ? ? ? ? }s

? ? ? ? ? ? console.log(this.days)

? ? ? ? ? ? console.log(this.getWeek(this.year,this.month))

? ? },

? ? getDate(){

? ? ? ? ? ? let now = new Date();

? ? ? ? ? ? this.year = now.getFullYear();

? ? ? ? ? ? this.month = now.getMonth()+1;

? ? ? ? ? ? this.pushDays();


? ? },

? ? changeDate(){

? ? },

? ? handleShowNextMonth(){

? ? ? this.days=[];

? ? ? if(this.month<12){

? ? ? ? this.month=this.month+1;

? ? ? ? this.pushDays();

? ? ? }else{

? ? ? ? this.month= this.month=1;

? ? ? ? this.year=this.year+1;

? ? ? ? this.pushDays();

? ? ? }


? ? },

? ? handleShowToday(){

? ? ? this.days=[];

? ? ? let now = new Date();

? ? ? this.year=now.getFullYear();

? ? ? this.month=now.getMonth()+1;

? ? ? this.pushDays();

? ? },

? ? handleShowLastMonth(){

? ? ? this.days=[];

? ? ? if(this.month>1){

? ? ? ? this.month=this.month-1;

? ? ? this.pushDays();

? ? ? }else if( this.year>1970){

? ? ? ? this.month=12;

? ? ? ? this.year=this.year-1;

? ? ? ? this.pushDays();

? ? ? }else{

? ? ? ? alert("不能查找更遠(yuǎn)的日期")

? ? ? }


? ? }

? },

? mounted(){

? ? this.getDate();

? }

}

</script>

<style scoped>

.calender{

? width: 600px;

? position: relative;

? margin: 0 auto;

? margin-top: 50px;

? border: 1px solid #ddd;

? padding: 20px;

}

.top{

? width: 100%;

? position: relative;

? display: flex;

? border-bottom: 1px solid #ddd;

? padding-bottom: 20px;

}

.top_date{

? width: 100px;

? text-align: left;

? line-height: 42px;

}

.btn_wrap{

? flex: 1;

? text-align: right

}

.btn_wrap ul{

? display: flex;

? flex-direction: row-reverse

}

.btn_wrap ul li{

? padding: 10px 20px;

? border: 1px solid #ddd;

? font-size: 14px;

? line-height: 20px;

? cursor: pointer

}

.btn_wrap ul li:first-child{

? border-left: none;

}

.btn_wrap ul li:last-child{

? border-right: none;

}

.date_wrap{

? position: relative;

}

.week{

? display: flex;

? flex-direction: row;

? padding: 20px;

? font-size: 16px;

}

.week li{

? width: 14.28%;

}

.day{

? display: flex;

? flex-direction: row;

? padding: 20px;

? font-size: 16px;

? flex-wrap: wrap;

}

.day li{

? width: 14.28%;

? padding: 20px;

? box-sizing: border-box;

? border: 1px solid #ddd

}

.day li:nth-child(n+8){

? border-top:none;

}

.day li:nth-child(n+1){

? border-right: none;

}

.day li:nth-child(7n){

? border-right: 1px solid #ddd

}

</style>

4,至此,一個日歷組件基本完成搂根,最后給當(dāng)前日期加一個特殊樣式

通過? :class="{now:nowLi==year.toString()+month.toString()+item}" 來判斷是否是當(dāng)前日期

nowLi是在methods方法中加以下方法實現(xiàn)蝶怔,在mounted方法中就要使用該法方法。

//控制當(dāng)前日期顯示特殊樣式

? ? handleShowDateStyle(){

? ? ? let now = new Date()

? ? ? this.nowLi=now.getFullYear().toString()+(now.getMonth()+1).toString()+now.getDate().toString()

? ? ? console.log(this.nowLi)

? ? },

然后給now加css:

.now{

? background: #f2f8fe;

? color:#1989fa;

}

最后的日歷組件完成了:



3

附上項目地址:https://gitee.com/cheng1225/calender

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末兄墅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子澳叉,更是在濱河造成了極大的恐慌隙咸,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件成洗,死亡現(xiàn)場離奇詭異五督,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)瓶殃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門充包,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人遥椿,你說我怎么就攤上這事基矮。” “怎么了冠场?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵家浇,是天一觀的道長。 經(jīng)常有香客問我碴裙,道長钢悲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任舔株,我火速辦了婚禮莺琳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘载慈。我一直安慰自己惭等,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布办铡。 她就那樣靜靜地躺著咕缎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪料扰。 梳的紋絲不亂的頭發(fā)上凭豪,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機(jī)與錄音晒杈,去河邊找鬼嫂伞。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的帖努。 我是一名探鬼主播撰豺,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拼余!你這毒婦竟也來了污桦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤匙监,失蹤者是張志新(化名)和其女友劉穎凡橱,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體亭姥,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡稼钩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了达罗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坝撑。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖粮揉,靈堂內(nèi)的尸體忽然破棺而出巡李,到底是詐尸還是另有隱情,我是刑警寧澤扶认,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布击儡,位于F島的核電站,受9級特大地震影響蝠引,放射性物質(zhì)發(fā)生泄漏阳谍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一螃概、第九天 我趴在偏房一處隱蔽的房頂上張望矫夯。 院中可真熱鬧,春花似錦吊洼、人聲如沸训貌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽递沪。三九已至,卻和暖如春综液,著一層夾襖步出監(jiān)牢的瞬間款慨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工谬莹, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留檩奠,地道東北人桩了。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像埠戳,于是被迫代替她去往敵國和親井誉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345