私はこの単純なv6還元型を、反応日ピッカーを使用して値を入力するカスタムコンポーネントをレンダリングする入力としています。React Date Pickerに接続しているReact/ReduxフォームフィールドをonFocusおよびonBlurに移動する方法は?
https://github.com/gpbl/react-day-picker
それはmoment.jsに依存し、私の現在のセットアップで動作しないので、私は他のものより反応する日ピッカーを選択しました。
フィールドにフォーカスすると、日付ピッカーがポップアップしますが、日付ピッカーでない場所をクリックすると消えます。
基本的に、私は私の中でjQueryUI 1のように動作するように日付ピッカーに反応します:
https://jqueryui.com/datepicker/
私はで終わる3つのシナリオは以下のとおりです。
私は、フィールドをクリックし、 datepickerがポップアップしますが、日付を選択するか、フィールドを再度クリックしないと消えません。
私は、フィールドをクリックし、日付ピッカーがポップアップし、それが選択した日付を持つフィールドを移入する日付ピッカーのためのクリックイベントを処理する前に、入力フィールドのonBlurイベントが呼び出されると、私は、任意の場所をクリックした場合TOOすぐに消えます。
フィールドをクリックすると、日付ピッカーがポップアップ表示され、自動フォーカスが適用され、<ボディ>またはdatepickerでないものをクリックした場合を除き、正しくブラーされます。
私は、最初のページ全体をラップ兄弟の空のdivを使用しようとしましたので、私は空のdivをクリックしたときに、それが適切に日付ピッカーを切り替えます。これはz-indexesとpositionで正常に機能しました:datepickerの月を変更するまで固定されていました。これはdatepickerを再描画してクリックの順序を乱したように見え、状況2)に戻りました。
私の最も最近の試みは、日付ピッカーdivがポップアップするときに自動的にフォーカスすることです。そのため、日付ピッカーではないものをぼかすと、datepickerが切り替わります。これは理論で働いていましたが、日付ピッカーは、日、週、月、無効日を制御するためにdiv0>の中に入れ子になっている多くの要素を含んでいます。だから私は 'day'をクリックすると、 「day」<div>
をクリックして、ルート 'datepicker' <div>
ではなく、最初にフォーカスしたものをクリックします。上記の解決策は、「日付ピッカー」を微調整することでした
<div>
のdocument.activeElementが<体であるとき、それが唯一の日付ピッカーをトグルすることonBlurイベントは、>が、私は別のフォームフィールドをクリックしない場合にのみ動作します。
WizardFormPageOne.js:
function WizardFormPageOne({ handleSubmit }) {
return (
<form onSubmit={handleSubmit} className="col-xs-6">
<h1>WizardFormPageOne</h1>
<div className="card">
<div className="card-block">
<div className="form-group">
<label htmlFor="first">Label 1</label>
<Field type="text" name="first" component={DateInput} className="form-control" />
</div>
...
export default reduxForm({
form: 'wizardForm',
destroyOnUnmount: false,
})(WizardFormPageOne);
DateInput.js:
import React from 'react';
import styles from './styles.css';
import DatePicker from '../DatePicker';
class DateInput extends React.Component { // eslint-disable-line react/prefer-stateless-function
constructor(props) {
super(props);
this.state = {
dateValue: new Date(),
activeDateWidget: false,
};
}
changeDate = (date) => {
this.setState({
dateValue: date,
});
}
changeActiveDateWidget = (e) => {
e.stopPropagation();
this.setState({
activeDateWidget: !this.state.activeDateWidget,
});
}
render() {
const { input, meta } = this.props;
const { dateValue, activeDateWidget } = this.state;
return (
<div className={styles.dateInput}>
<input
{...input}
className="form-control"
type="text"
value={dateValue}
onClick={this.changeActiveDateWidget}
// onBlur={this.changeActiveDateWidget}
/>
{activeDateWidget ? (
<div>
<DatePicker
changeActiveDateWidget={this.changeActiveDateWidget}
changeDate={this.changeDate}
dateValue={dateValue}
/>
</div>
) : (
<div></div>
)}
</div>
);
}
}
export default DateInput;
日付ピッカー。JS:
import React from 'react';
import 'react-day-picker/lib/style.css';
import DayPicker, { DateUtils } from 'react-day-picker';
import styles from './styles.css';
import disabledDays from './disabledDays';
class DatePicker extends React.Component { // eslint-disable-line react/prefer-stateless-function
constructor(props) {
super(props);
this.state = {
selectedDay: new Date(),
};
}
componentDidMount() {
if (this._input) {
this._input.focus();
}
}
handleDayClick = (e, day, { disabled }) => {
e.stopPropagation();
if (disabled) {
return;
}
this.setState({ selectedDay: day },() => {
this.props.changeDate(day);
this.props.changeActiveDateWidget();
});
}
focusThisComponent = (e) => {
if (e) {
this._input = e;
}
}
focusIt =() => {
console.log('focusing');
}
blurIt =() => {
console.log('blurring');
setTimeout(() => {
if (document.activeElement == document.body) {
this.props.changeActiveDateWidget();
}
}, 1);
}
render() {
const { changeActiveDateWidget } = this.props;
const { selectedDay } = this.state;
return (
<div
className={styles.datePicker}
ref={this.focusThisComponent}
tabIndex="1"
onFocus={this.focusIt}
onBlur={this.blurIt}
>
<DayPicker
id="THISTHING"
initialMonth={selectedDay}
disabledDays={disabledDays}
selectedDays={(day) => DateUtils.isSameDay(selectedDay, day)}
onDayClick={this.handleDayClick}
/>
</div>
);
}
}
export default DatePicker;
は、ここで私が今抱えている問題のスクリーンキャストです:
http://screencast.com/t/kZuIwUzl
日付ピッカーは、それがブレ停止した時点で別のフィールド、/をクリックしたときを除いて、適切に切り替わります適切に切り替える。すべての私のしつけは、上記の3つのシナリオのいずれかに私を導いた。
o他の日付選択コンポーネントをチェックします。私の意見では、フォーカスの開閉はコンポーネントによって適切に処理されるべきです。回避策として、次のようなコンポーネント内にコンポーネントをラップすることができます:https://github.com/nkbt/react-page-click。他の実装を利用できる場合は、次のコンポーネントをチェックしてください:http://airbnb.io/react-dates/?selectedKind=SingleDatePicker&selectedStory=single%20month&full=0&down=1&left=1&panelRight=0&downPanel=kadirahq%2Fstorybook-addon-actions% 2Factions-panel – Steffen
反応ページのクリックはすばらしくて、私たちの頭痛の救済になります。 Airbnb datepickerが私の最初の選択でしたが、mxstbr/react-boilerplateの依存関係と矛盾するかどうかを調べるだけでなく、create-react-appを使って簡単なサンプルを作成して実行することはできませんでした。 –