<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
需求場景: 業務方希望有表格可以體現員工的考勤資訊,要具體到上午下午,統計司機上下班打卡所產生的資料。產品提出想做成三級表頭根據頁面查詢條件的年月去動態生成表格的表頭。三級分別是月份日期,對應的星期,以及每天的上午以及下午。
效果如下:
通過對avue-crud元件的option的設定如下:
{ label: `${$this.month}月${$this.dateList[0].ri}日`, // 月份 headerAlign: 'center', children: [ { label: `星期${$this.dateList[0].xq}`, headerAlign: 'center', children: [ { label: '上午', prop: 'oneAmAttendance', headerAlign: 'center', props: { label: 'name', value: 'code' }, type: 'select', dicData: $this.attendanceTypeList, formatter: (row, value, label, column) => { try { let satData = '' $this.attendanceTypeList.find((item) => { if (item.code === row.oneAmAttendance) { satData = item.name } }) return satData } catch (e) { console.log(e) } } }, { label: '下午', prop: 'onePmAttendance', headerAlign: 'center', props: { label: 'name', value: 'code' }, type: 'select', dicData: $this.attendanceTypeList, formatter: (row, value, label, column) => { try { let satData = '' $this.attendanceTypeList.find((item) => { if (item.code === row.onePmAttendance) { satData = item.name } }) return satData } catch (e) { console.log(e) } } } ] } ] },
在data中宣告需要的變數以及獲取每個月天數以及對應星期的方法
data(){ return { dateList: [], // 日期list month: 0, // 選中的月份 dayNum: 0 // 選中月的天數 } } created(){ this.montInfo(GetYearLastMonth()) // 當前月的天數 const arr = GetYearLastMonth().split('-') this.month = parseInt(arr[1]) this.dayNum = this.dayNumFn(parseInt(arr[0]), parseInt(arr[1])) } methods(){ // 月日以及對應的星期 montInfo(res) { /** * 獲取一個月多少天,並獲取月初星期幾 */ const daxier = ['一', '二', '三', '四', '五', '六', '日']; const date = res ? new Date(res) : new Date() const y = date.getFullYear() const m = date.getMonth() + 1 var date2 = new Date(y, m, 0) var rq = date2.getDate() // 日 本月最後一天 var xq = date2.getDay(); // 星期 本月第一天星期幾 new Date(0).getDay() var rq2 = rq % 7 if (rq2 === 0) { xq = rq2 + 1 } else { if (rq2 > xq) xq += 7 xq = xq - rq2 } var data = []; for (var i = 1; i <= rq; i++) { data.push({ 'ri': i, 'xq': daxier[xq] }) xq = (++xq === 7) ? 0 : xq } this.dateList = data }, // 獲取選中月的天數 dayNumFn(year, month) { return new Date(year, month, 0).getDate() }, }
根據查詢條件去切換表頭
{ label: '年月', search: true, hide: true, searchPlaceholder: '請選擇年月', searchClearable: false, prop: 'yearMonth', type: 'month', // 日期元件格式化 format: 'yyyy-MM', // 展示值 // 單元格格式化 valueFormat: 'yyyy-MM', // value searchDefault: GetYearLastMonth(), pickerOptions: { disabledDate: (time) => { return time.getTime() > new Date(GetYearLastMonth()).getTime() } }, // 查詢條件月份切換的同事重新渲染表頭 change(value) { // 當前月的天數 $this.montInfo(value.value) const arr = value.value.split('-') $this.month = parseInt(arr[1]) $this.dayNum = $this.dayNumFn(parseInt(arr[0]), parseInt(arr[1])) } },
因為不同的月份日期有不同,比如2月只有28天而1月有31天。所以大於28的日期需要單獨處理一下
{ label: $this.dayNum > 28 ? `${$this.month}月${$this.dateList[28].ri}日` : '', headerAlign: 'center', hide: $this.dayNum < 28, children: [ { label: $this.dayNum > 28 ? `星期${$this.dateList[28].xq}` : '', headerAlign: 'center', children: [ { label: '上午', prop: 'twentyNineAmAttendance', headerAlign: 'center', props: { label: 'name', value: 'code' }, type: 'select', dicData: $this.attendanceTypeList, formatter: (row, value, label, column) => { try { let satData = '' $this.attendanceTypeList.find((item) => { if (item.code === row.twentyNineAmAttendance) { satData = item.name } }) return satData } catch (e) { console.log(e) } } }, { label: '下午', prop: 'twentyNinePmAttendance', headerAlign: 'center', props: { label: 'name', value: 'code' }, type: 'select', dicData: $this.attendanceTypeList, formatter: (row, value, label, column) => { try { let satData = '' $this.attendanceTypeList.find((item) => { if (item.code === row.twentyNinePmAttendance) { satData = item.name } }) return satData } catch (e) { console.log(e) } } } ] } ] }, { label: $this.dayNum > 28 ? `${$this.month}月${$this.dateList[29].ri}日` : '', headerAlign: 'center', hide: $this.dayNum < 30, children: [ { label: $this.dayNum > 28 ? `星期${$this.dateList[29].xq}` : '', headerAlign: 'center', children: [ { label: '上午', prop: 'thirtyAmAttendance', headerAlign: 'center', props: { label: 'name', value: 'code' }, type: 'select', dicData: $this.attendanceTypeList, formatter: (row, value, label, column) => { try { let satData = '' $this.attendanceTypeList.find((item) => { if (item.code === row.thirtyAmAttendance) { satData = item.name } }) return satData } catch (e) { console.log(e) } } }, { label: '下午', prop: 'thirtyPmAttendance', headerAlign: 'center', props: { label: 'name', value: 'code' }, type: 'select', dicData: $this.attendanceTypeList, formatter: (row, value, label, column) => { try { let satData = '' $this.attendanceTypeList.find((item) => { if (item.code === row.thirtyPmAttendance) { satData = item.name } }) return satData } catch (e) { console.log(e) } } } ] } ] }, { label: $this.dayNum === 31 ? `${$this.month}月${$this.dateList[30].ri}日` : '', headerAlign: 'center', hide: $this.dayNum !== 31, children: [ { label: $this.dayNum === 31 ? `星期${$this.dateList[30].xq}` : '', headerAlign: 'center', children: [ { label: '上午', prop: 'thirtyOneAmAttendance', headerAlign: 'center', props: { label: 'name', value: 'code' }, type: 'select', dicData: $this.attendanceTypeList, formatter: (row, value, label, column) => { try { let satData = '' $this.attendanceTypeList.find((item) => { if (item.code === row.thirtyOneAmAttendance) { satData = item.name } }) return satData } catch (e) { console.log(e) } } }, { label: '下午', prop: 'thirtyOnePmAttendance', headerAlign: 'center', props: { label: 'name', value: 'code' }, type: 'select', dicData: $this.attendanceTypeList, formatter: (row, value, label, column) => { try { let satData = '' $this.attendanceTypeList.find((item) => { if (item.code === row.thirtyOnePmAttendance) { satData = item.name } }) return satData } catch (e) { console.log(e) } } } ] } ] },
element-ui的寫法相對簡單一些,因為設定項沒辦法進行遍歷渲染。
template裡面的寫法
<el-table :data="tableData" style="width: 100%" > <el-table-column prop="month" label="月份" width="150" header-align="center"> </el-table-column> <!-- 這裡使用遍歷的形式來進行渲染 --> <template v-for="(item,index) in dateList" > <el-table-column :label="`${month}月${item.ri}日`" header-align="center" :key="'date' + index"> <el-table-column header-align="center" :label="`星期${item.xq}`" > <el-table-column header-align="center" :prop="item.sw" label="上午" width="120" ></el-table-column> <el-table-column header-align="center" :prop="item.xw" label="下午" width="120" ></el-table-column> </el-table-column> </el-table-column> </template> </el-table>
data中還是宣告變數,methods中還是應用和上面類似的方法
data(){ return { dateList: [], // 日期list month: 0, // 選中的月份 dayNum: 0, // 選中月的天數 } } created() { this.montInfo(GetYearLastMonth()) // 當前月的天數 const arr = GetYearLastMonth().split('-') this.month = parseInt(arr[1]) this.dayNum = this.dayNumFn(parseInt(arr[0]), parseInt(arr[1])) }, methods: { // 月日以及對應的星期 montInfo(res) { /** * 獲取一個月多少天,並獲取月初星期幾 */ const daxier = ['一', '二', '三', '四', '五', '六', '日']; // 這裡是每個上午下午展示為不同的變數 const amArr = ['oneAmAttendance', 'twoAmAttendance', 'threeAmAttendance', 'fourAmAttendance', 'fiveAmAttendance', 'sixAmAttendance', 'sevenAmAttendance', 'eightAmAttendance', 'nineAmAttendance', 'tenAmAttendance', 'elevenAmAttendance', 'twelveAmAttendance', 'thirteenAmAttendance', 'fourteenAmAttendance', 'fifteenAmAttendance', 'oneAmAttendance', 'twoAmAttendance', 'threeAmAttendance', 'fourAmAttendance', 'fiveAmAttendance', 'sixAmAttendance', 'sevenAmAttendance', 'eightAmAttendance', 'nineAmAttendance', 'tenAmAttendance', 'elevenAmAttendance', 'twelveAmAttendance', 'thirteenAmAttendance', 'fourteenAmAttendance', 'fifteenAmAttendance', 'sixteenAmAttendance', 'seventeenAmAttendance', 'eighteenAmAttendance', 'nineteenAmAttendance', 'twentyAmAttendance', 'twentyOneAmAttendance', 'twentyTwoAmAttendance', 'twentyThreeAmAttendance', 'twentyFourAmAttendance', 'twentyFiveAmAttendance', 'twentySixAmAttendance', 'twentySevenAmAttendance', 'twentyEightAmAttendance', 'twentyNineAmAttendance', 'thirtyAmAttendance', 'thirtyOneAmAttendance'] const pmArr = [ 'onePmAttendance', 'twoPmAttendance', 'threePmAttendance', 'fourPmAttendance', 'fivePmAttendance', 'sixPmAttendance', 'sevenPmAttendance', 'eightPmAttendance', 'ninePmAttendance', 'tenPmAttendance', 'elevenPmAttendance', 'twelvePmAttendance', 'thirteenPmAttendance', 'fourteenPmAttendance', 'fifteenPmAttendance', 'onePmAttendance', 'twoPmAttendance', 'threePmAttendance', 'fourPmAttendance', 'fivePmAttendance', 'sixPmAttendance', 'sevenPmAttendance', 'eightPmAttendance', 'ninePmAttendance', 'tenPmAttendance', 'elevenPmAttendance', 'twelvePmAttendance', 'thirteenPmAttendance', 'fourteenPmAttendance', 'fifteenPmAttendance', 'sixteenPmAttendance', 'seventeenPmAttendance', 'eighteenPmAttendance', 'nineteenPmAttendance', 'twentyPmAttendance', 'twentyOnePmAttendance', 'twentyTwoPmAttendance', 'twentyThreePmAttendance', 'twentyFourPmAttendance', 'twentyFivePmAttendance', 'twentySixPmAttendance', 'twentySevenPmAttendance', 'twentyEightPmAttendance', 'twentyNinePmAttendance', 'thirtyPmAttendance', 'thirtyOnePmAttendance' ] const date = res ? new Date(res) : new Date() const y = date.getFullYear() const m = date.getMonth() + 1 var date2 = new Date(y, m, 0) var rq = date2.getDate() // 日 本月最後一天 var xq = date2.getDay(); // 星期 本月第一天星期幾 new Date(0).getDay() var rq2 = rq % 7 if (rq2 === 0) { xq = rq2 + 1 } else { if (rq2 > xq) xq += 7 xq = xq - rq2 } var data = []; for (var i = 1; i <= rq; i++) { data.push({ 'ri': i, 'xq': daxier[xq] }) xq = (++xq === 7) ? 0 : xq } data.map((item, index) => { item.sw = amArr[index] item.xw = pmArr[index] }) this.dateList = data }, // 獲取選中月的天數 dayNumFn(year, month) { console.log(new Date(year, month, 0).getDate()) return new Date(year, month, 0).getDate() } }
element-ui渲染的效果
到此這篇關於Avue和Element-UI動態三級表頭的實現的文章就介紹到這了,更多相關Element 動態三級表頭內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45