日時入力用Reactコンポーネントを(途中まで)つくってみる

日時入力用Reactコンポーネントを(途中まで)つくってみる

デザイナーの田中です。

TimeCrowdは時間を扱うサービスなので、時間の手動入力という作業も重要です。
今回、時間入力用のReactコンポーネントを個人的に勝手につくってみることにしました。
(正確には前につくりかけて放置していたのを再開してみました)

今回は途中までです。

どういうのをつくる?

ちょっと楽に入力できるのがほしいです。

日時入力用Reactコンポーネントを(途中まで)つくってみる

こんな感じの見た目で、まずは年月日も時分もテキストで入力できるようにしてみます。

動作としては、

  • 入力終わったり「→」キーで次のinputにフォーカスする
  • Backspaceや「←」キーで前のinputにフォーカスする
  • 上限や下限を越えた値ではエラー表示になる(自動訂正はしない)
  • 全角で入力しても半角になる
  • 自動で0埋めする

ぐらいの形を目指してみます。

動作や実装についてのいくつか

まだ途中で動作がおかしいところも多いのですが、いまのところ以下のように動いています。

日時入力用Reactコンポーネントを(途中まで)つくってみる

全角を強制的に半角にする

こちらを参考にさせていただき、
以下のようにしました。


    let value = e.target.value.replace(/[0-9]/g, (s) => {
      return String.fromCharCode(s.charCodeAt(0) - 65248)
    })

Backspaceの動作

Backspaceの場合、内容が空の場合にさらにもう一度押した場合にのみ、前のinputに移動したいです。
以下のようにしてみました。


class InputNumberRange extends React.Component {
  constructor(props) {
    ...
    this.state = {
      value: this.props.value,
      backspaced: false,
    }
  }
  handleKeyDown(e) {
    const selectionStart = this.textInput.selectionStart

    // valueが空かつBackspaceを押された場合
    if (e.keyCode === 8 && selectionStart === 0 && this.state.value.length === 0) {
      this.setState({
        backspaced: true,
      })
    } else {
    // 押されなかった場合はfalse
      this.setState({
        backspaced: false,
      })
    }
   handleKeyUp(e) {
     ...
     // 内容が空でBackspace押された場合のみ
     if (e.keyCode === 8 && selectionStart === 0 && this.state.backspaced) { onBack(e) } 
   }

コード

途中ですが、GitHubにおいてあります。

TimeCrowdに戻る