From 35f7e818e210327e03ad15ce3cc3d7361f5bcbc1 Mon Sep 17 00:00:00 2001
From: neverland <chenjiahan@youzan.com>
Date: Wed, 16 Sep 2020 21:07:11 +0800
Subject: [PATCH] fix(Calendar): incorrect height when using rem (#7190)

* fix(Calendar): incorrect height when using rem

* fix: realRowHeight default value
---
 src/calendar/components/Month.js              | 29 +++++++++++++++----
 src/calendar/index.js                         | 13 +++++----
 .../test/__snapshots__/demo.spec.js.snap      |  6 ++--
 .../test/__snapshots__/index.spec.js.snap     | 12 ++++----
 src/calendar/utils.ts                         |  2 --
 5 files changed, 41 insertions(+), 21 deletions(-)

diff --git a/src/calendar/components/Month.js b/src/calendar/components/Month.js
index 63a0b9abc..9a6508a00 100644
--- a/src/calendar/components/Month.js
+++ b/src/calendar/components/Month.js
@@ -4,7 +4,6 @@ import {
   t,
   bem,
   compareDay,
-  ROW_HEIGHT,
   getPrevDay,
   getNextDay,
   formatMonthTitle,
@@ -27,6 +26,7 @@ export default createComponent({
     currentDate: [Date, Array],
     allowSameDay: Boolean,
     showSubtitle: Boolean,
+    realRowHeight: Number,
     showMonthTitle: Boolean,
     firstDayOfWeek: Number,
   },
@@ -43,9 +43,7 @@ export default createComponent({
     },
 
     rowHeightWithUnit() {
-      if (this.rowHeight !== ROW_HEIGHT) {
-        return addUnit(this.rowHeight);
-      }
+      return addUnit(this.rowHeight);
     },
 
     offset() {
@@ -71,7 +69,7 @@ export default createComponent({
     monthStyle() {
       if (!this.shouldRender) {
         const padding =
-          Math.ceil((this.totalDay + this.offset) / 7) * this.rowHeight;
+          Math.ceil((this.totalDay + this.offset) / 7) * this.realRowHeight;
 
         return {
           paddingBottom: `${padding}px`,
@@ -106,6 +104,23 @@ export default createComponent({
     },
   },
 
+  watch: {
+    shouldRender(value) {
+      if (value) {
+        this.$nextTick(() => {
+          if (this.$refs.day[0] && !this.realRowHeight) {
+            const { height } = this.$refs.day[0].getBoundingClientRect();
+            this.$emit('update-height', height);
+          }
+        });
+      }
+    },
+
+    realRowHeight() {
+      this.height = null;
+    },
+  },
+
   methods: {
     getHeight() {
       if (!this.height) {
@@ -289,6 +304,8 @@ export default createComponent({
       if (type === 'selected') {
         return (
           <div
+            ref="day"
+            refInFor
             role="gridcell"
             style={style}
             class={[bem('day'), item.className]}
@@ -313,6 +330,8 @@ export default createComponent({
 
       return (
         <div
+          ref="day"
+          refInFor
           role="gridcell"
           style={style}
           class={[bem('day', type), item.className]}
diff --git a/src/calendar/index.js b/src/calendar/index.js
index 4eca1687b..e3e172677 100644
--- a/src/calendar/index.js
+++ b/src/calendar/index.js
@@ -8,7 +8,6 @@ import {
   copyDates,
   getNextDay,
   compareDay,
-  ROW_HEIGHT,
   calcDateNum,
   compareMonth,
   createComponent,
@@ -29,6 +28,7 @@ export default createComponent({
     value: Boolean,
     readonly: Boolean,
     formatter: Function,
+    rowHeight: [Number, String],
     confirmText: String,
     rangePrompt: String,
     defaultDate: [Date, Array],
@@ -51,10 +51,6 @@ export default createComponent({
       type: Boolean,
       default: true,
     },
-    rowHeight: {
-      type: [Number, String],
-      default: ROW_HEIGHT,
-    },
     maxRange: {
       type: [Number, String],
       default: null,
@@ -115,6 +111,7 @@ export default createComponent({
     return {
       subtitle: '',
       currentDate: this.getInitialDate(),
+      realRowHeight: 0,
     };
   },
 
@@ -403,6 +400,10 @@ export default createComponent({
       this.$emit('confirm', copyDates(this.currentDate));
     },
 
+    onUpdateHeight(height) {
+      this.realRowHeight = height;
+    },
+
     genMonth(date, index) {
       const showMonthTitle = index !== 0 || !this.showSubtitle;
       return (
@@ -421,9 +422,11 @@ export default createComponent({
           currentDate={this.currentDate}
           showSubtitle={this.showSubtitle}
           allowSameDay={this.allowSameDay}
+          realRowHeight={this.realRowHeight}
           showMonthTitle={showMonthTitle}
           firstDayOfWeek={this.dayOffset}
           onClick={this.onClickDay}
+          onUpdate-height={this.onUpdateHeight}
         />
       );
     },
diff --git a/src/calendar/test/__snapshots__/demo.spec.js.snap b/src/calendar/test/__snapshots__/demo.spec.js.snap
index 2e5ac8a76..b0a56dda3 100644
--- a/src/calendar/test/__snapshots__/demo.spec.js.snap
+++ b/src/calendar/test/__snapshots__/demo.spec.js.snap
@@ -64,7 +64,7 @@ exports[`renders demo correctly 1`] = `
         <div class="van-calendar__weekdays"><span class="van-calendar__weekday">日</span><span class="van-calendar__weekday">一</span><span class="van-calendar__weekday">二</span><span class="van-calendar__weekday">三</span><span class="van-calendar__weekday">四</span><span class="van-calendar__weekday">五</span><span class="van-calendar__weekday">六</span></div>
       </div>
       <div class="van-calendar__body">
-        <div class="van-calendar__month" style="padding-bottom: 320px;">
+        <div class="van-calendar__month" style="padding-bottom: 0px;">
           <div role="grid" class="van-calendar__days">
             <div class="van-calendar__month-mark">1</div>
             <div role="gridcell" class="van-calendar__day van-calendar__day--disabled" style="margin-left: 0%;">1</div>
@@ -102,7 +102,7 @@ exports[`renders demo correctly 1`] = `
             <div role="gridcell" tabindex="-1" class="van-calendar__day">31</div>
           </div>
         </div>
-        <div class="van-calendar__month" style="padding-bottom: 320px;">
+        <div class="van-calendar__month" style="padding-bottom: 0px;">
           <div class="van-calendar__month-title">2012年2月</div>
           <div role="grid" class="van-calendar__days">
             <div class="van-calendar__month-mark">2</div>
@@ -137,7 +137,7 @@ exports[`renders demo correctly 1`] = `
             <div role="gridcell" tabindex="-1" class="van-calendar__day">29</div>
           </div>
         </div>
-        <div class="van-calendar__month" style="padding-bottom: 320px;">
+        <div class="van-calendar__month" style="padding-bottom: 0px;">
           <div class="van-calendar__month-title">2012年3月</div>
           <div role="grid" class="van-calendar__days">
             <div class="van-calendar__month-mark">3</div>
diff --git a/src/calendar/test/__snapshots__/index.spec.js.snap b/src/calendar/test/__snapshots__/index.spec.js.snap
index f5af9ddcf..b27a7f541 100644
--- a/src/calendar/test/__snapshots__/index.spec.js.snap
+++ b/src/calendar/test/__snapshots__/index.spec.js.snap
@@ -8,7 +8,7 @@ exports[`color prop when type is range 1`] = `
     <div class="van-calendar__weekdays"><span class="van-calendar__weekday">日</span><span class="van-calendar__weekday">一</span><span class="van-calendar__weekday">二</span><span class="van-calendar__weekday">三</span><span class="van-calendar__weekday">四</span><span class="van-calendar__weekday">五</span><span class="van-calendar__weekday">六</span></div>
   </div>
   <div class="van-calendar__body">
-    <div class="van-calendar__month" style="padding-bottom: 384px;">
+    <div class="van-calendar__month" style="padding-bottom: 0px;">
       <div role="grid" class="van-calendar__days">
         <div class="van-calendar__month-mark">1</div>
         <div role="gridcell" class="van-calendar__day van-calendar__day--disabled" style="margin-left: 71.42857142857143%;">1</div>
@@ -61,7 +61,7 @@ exports[`color prop when type is single 1`] = `
     <div class="van-calendar__weekdays"><span class="van-calendar__weekday">日</span><span class="van-calendar__weekday">一</span><span class="van-calendar__weekday">二</span><span class="van-calendar__weekday">三</span><span class="van-calendar__weekday">四</span><span class="van-calendar__weekday">五</span><span class="van-calendar__weekday">六</span></div>
   </div>
   <div class="van-calendar__body">
-    <div class="van-calendar__month" style="padding-bottom: 384px;">
+    <div class="van-calendar__month" style="padding-bottom: 0px;">
       <div role="grid" class="van-calendar__days">
         <div class="van-calendar__month-mark">1</div>
         <div role="gridcell" class="van-calendar__day van-calendar__day--disabled" style="margin-left: 71.42857142857143%;">1</div>
@@ -114,7 +114,7 @@ exports[`formatter prop 1`] = `
     <div class="van-calendar__weekdays"><span class="van-calendar__weekday">日</span><span class="van-calendar__weekday">一</span><span class="van-calendar__weekday">二</span><span class="van-calendar__weekday">三</span><span class="van-calendar__weekday">四</span><span class="van-calendar__weekday">五</span><span class="van-calendar__weekday">六</span></div>
   </div>
   <div class="van-calendar__body">
-    <div class="van-calendar__month" style="padding-bottom: 384px;">
+    <div class="van-calendar__month" style="padding-bottom: 0px;">
       <div role="grid" class="van-calendar__days">
         <div class="van-calendar__month-mark">1</div>
         <div role="gridcell" class="van-calendar__day van-calendar__day--disabled" style="margin-left: 71.42857142857143%;">1</div>
@@ -173,7 +173,7 @@ exports[`popup wrapper 2`] = `
       <div class="van-calendar__weekdays"><span class="van-calendar__weekday">日</span><span class="van-calendar__weekday">一</span><span class="van-calendar__weekday">二</span><span class="van-calendar__weekday">三</span><span class="van-calendar__weekday">四</span><span class="van-calendar__weekday">五</span><span class="van-calendar__weekday">六</span></div>
     </div>
     <div class="van-calendar__body">
-      <div class="van-calendar__month" style="padding-bottom: 384px;">
+      <div class="van-calendar__month" style="padding-bottom: 0px;">
         <div role="grid" class="van-calendar__days">
           <div class="van-calendar__month-mark">1</div>
           <div role="gridcell" class="van-calendar__day van-calendar__day--disabled" style="margin-left: 71.42857142857143%;">1</div>
@@ -228,7 +228,7 @@ exports[`row-height prop 1`] = `
     <div class="van-calendar__weekdays"><span class="van-calendar__weekday">日</span><span class="van-calendar__weekday">一</span><span class="van-calendar__weekday">二</span><span class="van-calendar__weekday">三</span><span class="van-calendar__weekday">四</span><span class="van-calendar__weekday">五</span><span class="van-calendar__weekday">六</span></div>
   </div>
   <div class="van-calendar__body">
-    <div class="van-calendar__month" style="padding-bottom: 300px;">
+    <div class="van-calendar__month" style="padding-bottom: 0px;">
       <div role="grid" class="van-calendar__days">
         <div class="van-calendar__month-mark">1</div>
         <div role="gridcell" class="van-calendar__day van-calendar__day--disabled" style="height: 50px; margin-left: 71.42857142857143%;">1</div>
@@ -281,7 +281,7 @@ exports[`title & footer slot 1`] = `
     <div class="van-calendar__weekdays"><span class="van-calendar__weekday">日</span><span class="van-calendar__weekday">一</span><span class="van-calendar__weekday">二</span><span class="van-calendar__weekday">三</span><span class="van-calendar__weekday">四</span><span class="van-calendar__weekday">五</span><span class="van-calendar__weekday">六</span></div>
   </div>
   <div class="van-calendar__body">
-    <div class="van-calendar__month" style="padding-bottom: 384px;">
+    <div class="van-calendar__month" style="padding-bottom: 0px;">
       <div role="grid" class="van-calendar__days">
         <div class="van-calendar__month-mark">1</div>
         <div role="gridcell" class="van-calendar__day van-calendar__day--disabled" style="margin-left: 71.42857142857143%;">1</div>
diff --git a/src/calendar/utils.ts b/src/calendar/utils.ts
index 1e078770d..dfff1e390 100644
--- a/src/calendar/utils.ts
+++ b/src/calendar/utils.ts
@@ -4,8 +4,6 @@ const [createComponent, bem, t] = createNamespace('calendar');
 
 export { createComponent, bem, t };
 
-export const ROW_HEIGHT = 64;
-
 export function formatMonthTitle(date: Date) {
   return t('monthTitle', date.getFullYear(), date.getMonth() + 1);
 }