0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

jQueryをReactでラップ

Last updated at Posted at 2022-05-24

Reactの公式チュートリアルの「他のライブラリとのインテグレーション」を読む。

可能だけど、ベストではない

Reactの内部表現に反してライブラリが直接DOMを書き換えなどを行った場合は、Reactは混乱してしまって回復できない。
ReactでjQuery(他のライブラリ)を使う場合、Reactによる更新がjQuery(他のライブラリ)によって追加されたDOMノードと競合しないように気を付ける必要がある。
Reactでラップすることで他のライブラリを使うことはできる。
Reactは他のライブラリによって追加されたDOMノードを触らないことが重要。

React は、React 以外のものが DOM に加えた変更を認識しません。React は自身の内部表現に基づいて更新内容を決定します。もし同じ DOM ノードが別のライブラリによって操作された場合、React は混乱してしまい、回復する方法がありません。

これが可能だからといって、これが React アプリケーションに最適なアプローチであるという意味ではありません。可能な限り React コンポーネントを使用することをお勧めします。React コンポーネントは React アプリケーションで簡単に再利用でき、また多くの場合、それらの動作や外観をより細かくコントロールできます。

jQueryのライブラリであるChosenを使用する例

class Chosen extends React.Component {
  
  componentDidMount() {
    this.$el = $(this.el);
    // ref 経由で渡された <select> ノードで Chosen を初期化
    this.$el.chosen();
    // jQueryのchangeイベント時に値を受け取る
    this.handleChange = this.handleChange.bind(this);
    this.$el.on('change', this.handleChange);
  }

  componentDidUpdate(prevProps) {
    // jQueryで追加したDOMに変更を知らせる(propsの変更に応じてDOMを手動で更新)
    if (prevProps.children !== this.props.children) {
      this.$el.trigger("chosen:updated");
    }
  }

  componentWillUnmount() {
    // jQueryのchangeイベント時に値を受け取る
    this.$el.off('change', this.handleChange);
    // ref 経由で渡された <select> ノードで Chosen を破棄
    this.$el.chosen('destroy');
  }
  
  // 値の変更を受け取るメソッド
  handleChange(e) {
    this.props.onChange(e.target.value);
  }

  render() {
    return (
      {/* ReactがjQueryで追加したDOMに触れないようdivでラップする */}
      <div>
        <select className="Chosen-select" ref={el => this.el = el}>
          {this.props.children}
        </select>
      </div>
    );
  }
}  );
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?