react-datepicker コンポーネントに制限または検証を実装しようとしています。検証と正規化にredux-formを使用しています(制限を実装するため)
https://redux-form.com/6.0.0-rc.1/examples/normalizing/
質問:フィールドに何かを入力しようとしたときにredux-formの正規化関数も検証関数も呼び出されないことを確認しました
フォームを送信するときにこの値は送信されませんが、検証エラーを表示するか、ユーザーが無効な文字を入力できないようにする必要があります。
日付ピッカーコンポーネントのラッパーを作成し、それをreduxフィールドを通じてフォームで使用しました
私の日付ピッカーコンポーネント:-
return (
<div className={"render-date-picker "}>
<div className="input-error-wrapper">
{(input.value) ? <label> {placeholder} </label> : ''}
<DatePicker className="input form-flow" {...input}
placeholderText={placeholder}
selected={input.value ? moment(input.value) : null}
maxDate={maxDate || null}
minDate={minDate || null}
dateFormat={isTimePicker ? "LLL" : "DD/MM/YYYY"}
showYearDropdown
showMonthDropdown
disabledKeyboardNavigation
/>
{touched && error && <span className="error-msg">{t(error)}</span>}
<span className="bar" style={{ 'display': this.state.is_focus ? 'block' : 'none' }} ></span>
</div>
</div>
);
reduxフォームフィールド:-
<Field
name="date_of_birth"
type="text"
className="input form-flow extra-padding-datepicker"
component={RenderDatePicker}
maxDate={moment().subtract(18, "years")}
validate={[required, dateOfBirth]}
normalize={isValidDateFormat}
placeholder={t("DOB (DD/MM/YYYY)")}
/>
私の正規化機能:-
export const isValidDateFormat = (value, previousValue) => {
if (value == null || !value.isValid()) {
return previousValue;
}
return value;
}
react-datepickerは、onChangeRawプロパティを提供して、datePicker内の未加工の(型付き)値を取得します。 datepicker入力フィールドを制限または検証するには、datepickerコンポーネントのonChangeイベントでは使用できない未加工の値が必要です。
モーメントオブジェクトを返します。
生の値を取得するためにonChangeRawを使用します
生の値は単にe.target.valueから取得されます。私の場合、単純な関数によって、ユーザーが日付ピッカー入力フィールドに何かを入力することを制限します:
handleChangeRaw = (date) => {
let s=document.getElementById(date_picker_id)
s.value =moment(this.props.input.value).format("DD/MM/YYYY");
}
私の日付ピッカーコンポーネント:-
<DatePicker
.....
disabledKeyboardNavigation
onChangeRaw={(e)=>this.handleChangeRaw(e)}
id={date_picker_id}
.....
/>
これは私の問題を解決しました。それが役に立てば幸い:)