「リカバリ」チェックアウト、チェックアウトステータスの反映、およびCallbackの使用
24003 ワード
objectにキー値は存在しません。
カレンダーの日付配列を生成するときにobject形式で作成します.
ex) [{day: '21', beforeDay=false}, {day: '22', beforeDay=false}, ...]
また、毎月の開始曜日が異なるため、unshiftを使用して空白を埋めると、未定義の値があるため、キー値にアクセスする際にエラーが発生します.arr.unshift(...new Array(firstDay))
ただし、空白領域をobject形式で埋め込むとエラーは発生しません.// 변경된 방식
arr.unshift(...new Array(firstDay).fill(0).map((v, i) => ({})));
勘定を締める
ホームページでチェックイン、チェックアウトに変更しました.
このためには、次の条件が必要です.
1.チェックイン日が空白(カレンダーに表示されるスペース)の場合
この場合、カレンダーの並べ替えを作成する際に、day日付を空白に設定するので、容易に判断できます.
// Calendar.js
<div
data-dateformat={`${monthData.year}-${monthData.month}-${date.day}`}
css={dateBtn({ date })}
key={`${monthData.year} + ${i}`}
onClick={e => handleDatePick(e.target, date.beforeDay)}
>
{date.day}
</div>
// CalendarContainer.js
const handleDatePick = (target, beforeDay) => {
const pickedDate = target.dataset.dateformat.split('-');
const day = pickedDate[2];
if (day === 'undefined') return; // 공백인 칸
};
2.今日より早いチェックイン
同様に、この場合、以前の日付もboolean値として記憶されているので、判断できる.
// Calendar.js
<div
data-dateformat={`${monthData.year}-${monthData.month}-${date.day}`}
css={dateBtn({ date })}
key={`${monthData.year} + ${i}`}
onClick={e => handleDatePick(e.target, date.beforeDay)}
>
{date.day}
</div>
// CalendarContainer.js
const handleDatePick = (target, beforeDay) => {
/* 생략... */
if (beforeDay) return; // 이전 날짜
};
3.チェックアウトがチェックアウトより早い場合
まず、チェックアウトはチェックイン日を設定しなければなりません.
チェックアウトを設定すると、既存のチェックアウトはtimeStamp形式で保存されるため、チェックアウト日とチェックアウト日を比較し、事前にチェックアウト日に変更します.
const handleDatePick = (target, beforeDay) => {
/* 생략... */
const timeStamp = new Date(`${pickedDate[0]}-${padding(pickedDate[1])}-${padding(pickedDate[2])}`,
);
if (!checkInDay || timeStamp < checkInDay) {
console.log('체크인 날짜 설정...');
changeCheckInOutDay('checkIn', timeStamp);
} else {
console.log('체크아웃 날짜 설정...');
changeCheckInOutDay('checkOut', timeStamp);
}
};
上記で使用した존재하지 않는 key값이더라도 undefined 값을 리턴
は、const timeStamp = new Date('2021-10-01');
においてtimeStampとして管理されていれば非常に有用な結果となる.useCallback
検索ウィンドウで場所を検索するときに遅くなります...
原因
Date객체의 메서드를 사용할 수 있기 때문
が不必要なレンダリングを行っていることが確認された.SingleCalendar 컴포넌트
です.<Calendar
leftMonth={leftMonth}
rightMonth={rightMonth}
setMonth={setMonth}
handleDatePick={handleDatePick}
/>
上に新しく追加されたhandleDatePick関数は、レンダリングのたびに新しく作成されるため、この関数を受信したサブアセンブリ이유는 리렌더링시마다 새로 생성되는 상위 컴포넌트의 함수때문
は、値が変更されたと判断し、不要な再レンダリングを行っている.では、
SingleCalendar 컴포넌트
を使用して、レンダリング時に不要な関数を再生することを防止する必要があります.useCallback
は値を返し、useMemo
は関数を返すため、関数を再利用するためにuseCallback
が使用される.const handleDatePick = useCallback(
(target, beforeDay) => {
const pickedDate = target.dataset.dateformat.split('-');
const timeStamp = new Date(
`${pickedDate[0]}-${padding(pickedDate[1])}-${padding(pickedDate[2])}`,
);
const day = pickedDate[2];
if (beforeDay) return;
if (day === 'undefined') return;
if (!checkInDay || timeStamp < checkInDay) {
console.log('체크인 날짜 설정 중');
changeCheckInOutDay('checkIn', timeStamp);
} else {
console.log('체크아웃 날짜 설정 중');
changeCheckInOutDay('checkOut', timeStamp);
}
},
[checkInDay, checkOutDay],
);
ここではuseCallback
のように,2番目のパラメータの依存状態値を用いることに注意し,useMemo
を用いると所望の結果が得られる.Reference
この問題について(「リカバリ」チェックアウト、チェックアウトステータスの反映、およびCallbackの使用), 我々は、より多くの情報をここで見つけました https://velog.io/@jiseong/React-체크인-체크아웃-state-반영-및-useCallbackテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol