かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

React 切り替えた input タグに focus させたい

React入門初心者マンです。

Reactビギナーズガイド ―コンポーネントベースのフロントエンド開発入門

Reactビギナーズガイド ―コンポーネントベースのフロントエンド開発入門

この本をやっていてエクセルのようなものを作る例があり、セルをダブルクリックしたら編集モードに切り替わるコンポーネントを作っていました。編集モードになった時に自動的にinputタグにフォーカスさせたかったのでメモ

"react": "^16.8.3",
"react-dom": "^16.8.3",

DOMにアクセスして .focus() でフォーカスさせる

状態じゃないから?結局はDOMに対して.focus()させるしかないっぽいです。

  1. input タグに ref属性を設定
  2. this.refs["ref_value"]で対象ref属性を持つDOMにアクセスできる
  3. DOMにアクセスして.focus()でフォーカスさせる
import React, { Component } from 'react';
import ReactDOM from 'react-dom';

class Cell extends Component {
  componentDidUpdate() {
    if( this.props.isEdit ) {
      this.refs['text-cell'].focus();
    }
  }

  render() {
    let content = this.props.value;
    if( this.props.isEdit ) {
      content = (
        <input
          type="text"
          ref="text-cell"
          defaultValue={this.props.value}
        />
      );
    }
    return (
      <td>{content}</td>
    );
  }
}

componentDidUpdateライフサイクルメソッドでコンポーネントが更新されたタイミングで編集モードになっていればinputタグが出力されているので、ここでDOMを取得してフォーカスさせました。
 

安心と信頼のO'REILLYと思って買ったReactの本、2017年に出たものなのに既に使えなくなってるメソッドや、やり方が変わってる方法だらけでReactやゔぁい… 調べながらやってるので、その分力になってると思いたいけど、その調べた結果が正しいのかが判断しづらい点が問題。


[参考]

Reactビギナーズガイド ―コンポーネントベースのフロントエンド開発入門

Reactビギナーズガイド ―コンポーネントベースのフロントエンド開発入門

React入門 React・Reduxの導入からサーバサイドレンダリングによるUXの向上まで (NEXT ONE)

React入門 React・Reduxの導入からサーバサイドレンダリングによるUXの向上まで (NEXT ONE)