2017-06-19 15 views
1

私が取り組んでいるVue Calendarがあります。 1日がクリックされると、その日の詳細を表示する選択された1週間の週の下に全角ボックスを開きたいと思います(Googleイメージのレイアウトを考える)私はVueでデータを渡す方法を知っていますが、今週の行の詳細(コンポーネント、ビュー?)あなたは、行の概念はありませんので((あなただけの自動ラップ)、あなたが本当に行を占めボックスを挿入することはできません私のCodePenVue詳細コンテンツを追加する方法動的に行

<div class="calendar"> 
     <div class="header z-depth-2"> 
      <a @click="lastMonth" class="waves-effect waves-light btn"><i class="material-icons left">chevron_left</i>Last Month</a> 
      <p>{{month}} {{year}}</p> 
      <a @click="nextMonth" class="waves-effect waves-light btn"><i class="material-icons right">chevron_right</i>Next Month</a> 
     </div> 
     <ul class="dates month"> 
        <li class="dow" v-for="dow in days">{{dow}}</li> 
      <li v-for="blank in firstDayOfMonth" class="day"></li> 
      <li v-for="date in daysInMonth" @click="openday(date)" 
       class="day" :class="{'today': date == initialDate && month == initialMonth && year == initialYear}"> 
       <span>{{date}}</span> 
      </li> 
     </ul> 
    </div> 

JS

new Vue({ 
    el: '.calendar', 
    data: { 
     today: moment(), 
    dateContext: moment(), 
    days: ['S', 'M', 'T', 'W', 'T', 'F', 'S'] 
    }, 
    methods:{ 
     nextMonth: function() { 
     var t = this; 
     t.dateContext = moment(t.dateContext).add(1, 'month'); 
    }, 
    lastMonth: function() { 
     var t = this; 
     t.dateContext = moment(t.dateContext).subtract(1, 'month'); 
    } 
    }, 
    computed: { 
     year: function() { 
     var t = this; 
     return t.dateContext.format('YYYY'); 
    }, 
    month: function() { 
     var t = this; 
     return t.dateContext.format('MMMM'); 
    }, 
     daysInMonth: function() { 
     var t = this; 
     return t.dateContext.daysInMonth(); 
    }, 
    currentDate: function() { 
     var t = this; 
     return t.dateContext.get('date'); 
    }, 
    firstDayOfMonth: function() { 
     var t = this; 
     var firstDay = moment(t.dateContext).subtract((t.currentDate - 1), 'days'); 
     return firstDay.weekday(); 
    }, 
    //Previous Code Above 
    initialDate: function() { 
     var t = this; 
     return t.today.get('date'); 
    }, 
    initialMonth: function() { 
     var t = this; 
     return t.today.format('MMMM'); 
    }, 
    initialYear: function() { 
     var t = this; 
     return t.today.format('YYYY'); 
    } 
} 
}) 

答えて

2

を参照してください。何私がここで行ったのは、absoluteのdivが挿入されていますので、全幅にすることができますが、下の行をオーバーレイします。

週の間に詳細ボックスを挿入することができます。

しかし、基本的な作業では、日付をクリックすると現在選択されている日付のデータ項目を設定し、その項目をクリアして詳細ボックスを閉じます(詳細ボックスのクリックでここで行います)。 HTMLはv-ifによって制御されます。

new Vue({ 
 
    el: '.calendar', 
 
    data: { 
 
    today: moment(), 
 
    dateContext: moment(), 
 
    days: ['S', 'M', 'T', 'W', 'T', 'F', 'S'], 
 
    selectedDate: null 
 
    }, 
 
    methods: { 
 
    nextMonth: function() { 
 
     var t = this; 
 
     t.dateContext = moment(t.dateContext).add(1, 'month'); 
 
    }, 
 
    lastMonth: function() { 
 
     var t = this; 
 
     t.dateContext = moment(t.dateContext).subtract(1, 'month'); 
 
    }, 
 
    openday(date) { 
 
     this.selectedDate = date; 
 
    }, 
 
    dismiss() { 
 
     this.selectedDate = null; 
 
    } 
 
    }, 
 
    computed: { 
 
    year: function() { 
 
     var t = this; 
 
     return t.dateContext.format('YYYY'); 
 
    }, 
 
    month: function() { 
 
     var t = this; 
 
     return t.dateContext.format('MMMM'); 
 
    }, 
 
    daysInMonth: function() { 
 
     var t = this; 
 
     return t.dateContext.daysInMonth(); 
 
    }, 
 
    currentDate: function() { 
 
     var t = this; 
 
     return t.dateContext.get('date'); 
 
    }, 
 
    firstDayOfMonth: function() { 
 
     var t = this; 
 
     var firstDay = moment(t.dateContext).subtract((t.currentDate - 1), 'days'); 
 
     return firstDay.weekday(); 
 
    }, 
 
    //Previous Code Above 
 
    initialDate: function() { 
 
     var t = this; 
 
     return t.today.get('date'); 
 
    }, 
 
    initialMonth: function() { 
 
     var t = this; 
 
     return t.today.format('MMMM'); 
 
    }, 
 
    initialYear: function() { 
 
     var t = this; 
 
     return t.today.format('YYYY'); 
 
    } 
 
    } 
 
})
*, 
 
*:before, 
 
*:after { 
 
    -moz-box-sizing: border-box; 
 
    -webkit-box-sizing: border-box; 
 
    box-sizing: border-box; 
 
} 
 

 
body { 
 
    font-size: 1.5em; 
 
    font-weight: 100; 
 
    color: rgba(255, 255, 255, 1); 
 
    background: #222222; 
 
} 
 

 
.calendar { 
 
    transform: translate3d(0, 0, 0); 
 
    width: 100vw; 
 
} 
 

 
.header { 
 
    display: flex; 
 
    padding: 0 1em; 
 
    justify-content: space-between; 
 
    align-items: center; 
 
    width: 100%; 
 
    background-color: #333; 
 
} 
 

 
.fade-enter { 
 
    /*overflow: hidden;*/ 
 
    opacity: 0; 
 
} 
 

 
.fade-enter-active { 
 
    animation: fadeIn 1s ease-out; 
 
    opacity: 1; 
 
} 
 

 
.month.in.next { 
 
    animation: moveFromTopFadeMonth .4s ease-out; 
 
    opacity: 1; 
 
} 
 

 
.month.out.next { 
 
    animation: moveToTopFadeMonth .4s ease-in; 
 
    opacity: 1; 
 
} 
 

 
.month.in.prev { 
 
    animation: moveFromBottomFadeMonth .4s ease-out; 
 
    opacity: 1; 
 
} 
 

 
.month.out.prev { 
 
    animation: moveToBottomFadeMonth .4s ease-in; 
 
    opacity: 1; 
 
} 
 

 
.dates { 
 
    display: flex; 
 
    flex-wrap: wrap; 
 
} 
 

 
.day { 
 
    width: 14%; 
 
    padding: 1em; 
 
    text-align: center; 
 
    cursor: pointer; 
 
} 
 

 
.dow { 
 
    width: 14%; 
 
    text-align: center; 
 
    padding: 1em; 
 
    color: teal; 
 
    font-weight: bold; 
 
} 
 

 
.detail-panel { 
 
    width: 100vw; 
 
    background-color: darkred; 
 
    color: white; 
 
    height: 10rem; 
 
    position: absolute; 
 
    left: 0; 
 
} 
 

 
.today { 
 
    color: teal; 
 
    font-weight: bold; 
 
} 
 

 
.day-name { 
 
    font-size: 1em; 
 
    text-transform: uppercase; 
 
    margin-bottom: 5px; 
 
    color: rgba(255, 255, 255, .5); 
 
    letter-spacing: .7px; 
 
} 
 

 
.day-number { 
 
    font-size: 24px; 
 
    letter-spacing: 1.5px; 
 
}
<script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.5.1/moment.min.js"></script> 
 
<script src="//cdnjs.cloudflare.com/ajax/libs/vue/2.1.10/vue.min.js"></script> 
 
<link href="//cdnjs.cloudflare.com/ajax/libs/materialize/0.98.2/css/materialize.min.css" rel="stylesheet" /> 
 
<div class="calendar"> 
 
    <div class="header z-depth-2"> 
 
    <a @click="lastMonth" class="waves-effect waves-light btn"><i class="material-icons left">chevron_left</i>Last Month</a> 
 
    <p>{{month}} {{year}}</p> 
 
    <a @click="nextMonth" class="waves-effect waves-light btn"><i class="material-icons right">chevron_right</i>Next Month</a> 
 
    </div> 
 
    <ul class="dates month"> 
 
    <li class="dow" v-for="dow in days">{{dow}}</li> 
 
    <li v-for="blank in firstDayOfMonth" class="day"></li> 
 
    <li v-for="date in daysInMonth" class="day" :class="{'today': date == initialDate && month == initialMonth && year == initialYear}"> 
 
     <span @click="openday(date)">{{date}}</span> 
 
     <div class="detail-panel" v-if="selectedDate === date" @click="dismiss">Hi there I see you selected {{date}}</div> 
 
    </li> 
 
    </ul> 
 
</div>

+0

私はあなたのアドバイスを取り、私はそれが最適な表示が可能になると思うようになりましたweek' 'のための機能を追加しています。ありがとう! – Auzy

+0

1週間を選択する推奨方法はありますか?プレーンなJSで私はおそらく最初のセレクタ 'week'を得るような何かをするだろう。それを行うためのより多くの方法がありますか? – Auzy

+1

あなたのデータは週単位で整理されるべきですので、 'v-if =" week.includes(selectedDate) "'のようなことができるはずです。 –

関連する問題