反応でテキスト入力のフォーカスを変更する

ofhouse

ここでの私の目標は、フォームを作成することです。このフォームでは、リターンキーを押すと次の入力要素に移動し、最後の入力時にフォームを送信します。

これはモバイル向けに構築されており、ブラウザの「キーボードに移動」ボタンの代わりに「次へ」ボタンを使用するオプションがないため(これについて詳しくは、この回答を参照してください)。

これをよりよく視覚化するために、ここに写真があります:ここに画像の説明を入力してください

コードも書いていますが、イベントを適切な場所でキャッチできないので、返品後すぐにフォームが送信されるか、イベントを防ぐと、ヒット後にフォーカスが変更されます。 2回返します。

こちらの例をご覧くださいhttps//codepen.io/ofhouse/pen/Rgwzxy(以下のコードも貼り付けました)

class TextInput extends React.Component {
  constructor(props) {
    super(props);
    this._onKeyPress = this._onKeyPress.bind(this);
  }

  componentDidMount() {
    if (this.props.focus) {
      this.textInput.focus();
    }
  }

  componentDidUpdate(nextProps) {
    if (nextProps.focus) {
      this.textInput.focus();
    }
  }

  _onKeyPress(e) {
    if (e.key === 'Enter') {
      this.props.onSubmit(e);
    }
  }

  render() {
    return (
      <div>
        <input
          type="text"
          onKeyPress={this._onKeyPress}
          ref={input => {
            this.textInput = input;
          }}
        />
      </div>
    );
  }
}

class Application extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      currentElement: 0,
    };
  }

  _submitForm(e) {
    // If I remove this preventDefault it works, but also the form is submitted --> SiteReload
    e.preventDefault();
  }

  _changeFocus(nextElement) {
    return e => {
      this.setState({
        currentElement: nextElement,
      });
    };
  }

  render() {
    const { currentElement } = this.state;
    return (
      <form>

        <h1>React input focus</h1>

        <TextInput focus={currentElement === 0} onSubmit={this._changeFocus(1)} />
        <TextInput focus={currentElement === 1} onSubmit={this._changeFocus(0)} />

        <div>
          <button type="submit" onClick={this._submitForm}>Submit</button>
        </div>

      </form>
    );
  }
}

ReactDOM.render(<Application />, document.getElementById('app'));
マルコ・スカビオロ

あなたが最善のアプローチを使用しているとは思わない、説明させてください。入力のフォーカスはfocus、ネイティブDOM要素のメソッドによって行われます。現在フォーカスしている入力に基づいてフォーカスする入力を知ることは、それらの入力のコンテナー(このApplication場合コンポーネント)に実装する必要があるロジックです

私はあなたのコードにいくつかの重要な変更を加えました、そして今それは働いています:CodePen

説明させてください:

まず、フォームを防ぐためkeyPressedに、キーが押されたときに入力イベントの送信'Enter'を防止していますsubmit

_onKeyPress(e) {
  if (e.key === 'Enter') {
    this.props.onSubmit(e);
    e.preventDefault();
  }
}

私たちは、いずれかの必要はありませんcomponenDidMountたりcomponentDidUpdateしてTextInput、すべての私達の必要性であるfocus方法。

focus() {
  this.textInput.focus();
}

ほとんどの変更はApplicationコンポーネントで行われます。まず第一に、状態は必要ありません。本当に必要なのは、入力を配列に入れて呼び出すことができるようfocusにすることです。

constructor(props) {
  super(props);

  this.inputs = [];
}

フォーカスを変更するにfocusは、TextInputコンポーネントのメソッドを呼び出すための入力のインデックスが必要です。

_changeFocus(index) {
  return e => {
    this.inputs[index].focus();
  };
}

その後、我々はへの入力を追加する方法を必要とするthis.inputsref私は方法を作成しました、プロパティが理想的である_addInput。このためのヘルパーとして:

_addInput(index) {
  return input => {
    this.inputs[index] = input;
  };
}

最後に、TextInputsをレンダリングするときは、それぞれのインデックスを使用しそれら_addInputref_changeFocus渡す必要がありonSubmitます。

<TextInput ref={this._addInput(0)} onSubmit={this._changeFocus(1)} />
<TextInput ref={this._addInput(1)} onSubmit={this._changeFocus(0)} />

2番目TextInputでは、フォーカスを最初のフォーカスに変更しますが、フォームを送信する方が便利な場合があります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

次のプレスでネイティブフォーカステキスト入力を反応させる

分類Dev

ネイティブテキスト入力を境界線で反応させ、常にフォーカスする

分類Dev

入力テキストフォームのテキストサイズを画像で変更する

分類Dev

フォーカス入力のラベルのテキストの色を変更する

分類Dev

フォーカスをangularjsで次の入力テキストに変更します

分類Dev

角度反応フォームでテキストフィールドに入力中にテキストを大文字に変換する

分類Dev

マテリアルのスタイルを変更する-フォーカス、反応に関するUIテキストフィールド

分類Dev

フォームの入力に応じてテキストを変更するにはどうすればよいですか?(すぐに価格を表示)

分類Dev

現在のテキスト入力に応じて、フォーカスアウトの個別のdivの背景色を変更します

分類Dev

反応JSで入力要素をオートフォーカス

分類Dev

フラッターテキストフォームフィールドで入力テキストの色を黒から白に変更する方法

分類Dev

反応フォームを使用する場合、mat-datepickerでのテキスト入力を無効にする

分類Dev

入力フォーカスで境界線の色を変更する方法

分類Dev

フォーカスのテキスト入力のパディング/マージンを変更すると、parentdivが流出しますか?

分類Dev

useStateフックに反応する-フォームを小道具に渡すと、入力時にテキスト入力のフォーカスが失われます

分類Dev

フォームを送信する前に、入力テキストの値を変更してください

分類Dev

値がプログラムで変更されたときにテキスト入力でonChangeイベントをトリガーする方法-反応する

分類Dev

タイプテキストの制御された入力を制御されないように変更するフォームエラーに反応する

分類Dev

フォームからの応答テキストを変更するjQuery

分類Dev

フォーカスのみでタイプ番号の入力にテキストを表示する

分類Dev

入力フォーカスでReactの親クラスを変更します

分類Dev

Jqueryは、キューなしでホバーとフォーカスの入力の幅を変更します

分類Dev

入力フォーカスでテキストを選択

分類Dev

入力フォーカスで、ラベルのフォントサイズを変更します

分類Dev

フォーカスされた入力を変更するJquery

分類Dev

入力テキストフィールドを使用して、Javascriptで関数の値を動的に変更する

分類Dev

カスタムフォントでリサイクルビューのテキストを変更する

分類Dev

必要な入力に表示されるデフォルトの入力ツールチップテキストを変更する方法

分類Dev

入力時にスペルチェッカーで問題が発生します。テキストの一部のみのフォントを変更するにはどうすればよいですか?

Related 関連記事

  1. 1

    次のプレスでネイティブフォーカステキスト入力を反応させる

  2. 2

    ネイティブテキスト入力を境界線で反応させ、常にフォーカスする

  3. 3

    入力テキストフォームのテキストサイズを画像で変更する

  4. 4

    フォーカス入力のラベルのテキストの色を変更する

  5. 5

    フォーカスをangularjsで次の入力テキストに変更します

  6. 6

    角度反応フォームでテキストフィールドに入力中にテキストを大文字に変換する

  7. 7

    マテリアルのスタイルを変更する-フォーカス、反応に関するUIテキストフィールド

  8. 8

    フォームの入力に応じてテキストを変更するにはどうすればよいですか?(すぐに価格を表示)

  9. 9

    現在のテキスト入力に応じて、フォーカスアウトの個別のdivの背景色を変更します

  10. 10

    反応JSで入力要素をオートフォーカス

  11. 11

    フラッターテキストフォームフィールドで入力テキストの色を黒から白に変更する方法

  12. 12

    反応フォームを使用する場合、mat-datepickerでのテキスト入力を無効にする

  13. 13

    入力フォーカスで境界線の色を変更する方法

  14. 14

    フォーカスのテキスト入力のパディング/マージンを変更すると、parentdivが流出しますか?

  15. 15

    useStateフックに反応する-フォームを小道具に渡すと、入力時にテキスト入力のフォーカスが失われます

  16. 16

    フォームを送信する前に、入力テキストの値を変更してください

  17. 17

    値がプログラムで変更されたときにテキスト入力でonChangeイベントをトリガーする方法-反応する

  18. 18

    タイプテキストの制御された入力を制御されないように変更するフォームエラーに反応する

  19. 19

    フォームからの応答テキストを変更するjQuery

  20. 20

    フォーカスのみでタイプ番号の入力にテキストを表示する

  21. 21

    入力フォーカスでReactの親クラスを変更します

  22. 22

    Jqueryは、キューなしでホバーとフォーカスの入力の幅を変更します

  23. 23

    入力フォーカスでテキストを選択

  24. 24

    入力フォーカスで、ラベルのフォントサイズを変更します

  25. 25

    フォーカスされた入力を変更するJquery

  26. 26

    入力テキストフィールドを使用して、Javascriptで関数の値を動的に変更する

  27. 27

    カスタムフォントでリサイクルビューのテキストを変更する

  28. 28

    必要な入力に表示されるデフォルトの入力ツールチップテキストを変更する方法

  29. 29

    入力時にスペルチェッカーで問題が発生します。テキストの一部のみのフォントを変更するにはどうすればよいですか?

ホットタグ

アーカイブ