1
2

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 5 years have passed since last update.

Reactと他のライブラリとのインテグレーション

Posted at

参考:他のライブラリとのインテグレーション

公式サイトではjQueryプラグイン(Chosen)のラッパーのサンプルコードが掲載されていますが
実際に要素を追加したときの動きの違いを確認しました。

componentDidUpdateにあるChosenライブライのtriggerを呼び出さないと、
Reactがstateの変化を検知してrenderを実行してもChosenが生成するドロップダウンのリストには反映されません。

App.js
import React, { Component } from "react";
import "./App.css";
import $ from "jquery";
import "chosen-js/chosen.css";
import "chosen-js/chosen.jquery.js";

class Chosen extends React.Component {
  componentDidMount() {
    this.$el = $(this.el);
    this.$el.chosen();

    this.handleChange = this.handleChange.bind(this);
    this.$el.on("change", this.handleChange);
  }

  componentDidUpdate(prevProps) {
    if (prevProps.children !== this.props.children) {
      this.$el.trigger("chosen:updated"); //ここをコメントアウトすると・・・
    }
  }

  componentWillUnmount() {
    this.$el.off("change", this.handleChange);
    this.$el.chosen("destroy");
  }

  handleChange(e) {
    this.props.onChange(e.target.value);
  }

  render() {
    return (
      <div>
        <select className="Chosen-select" ref={el => (this.el = el)}>
          {this.props.children}
        </select>
      </div>
    );
  }
}

class App extends Component {
  constructor(prpps) {
    super(prpps);

    this.state = {
      items: ["one", "two", "three"]
    };
  }

  handleAddList = () => {
    this.setState({ items: this.state.items.concat(["four"]) });
  };

  render() {
    return (
      <div className="App">
        <button onClick={this.handleAddList}>追加</button>

        {/* Reactの守備範囲外 */}
        <Chosen onChange={value => console.log(value)}>
          {this.state.items.map(item => (
            <option key={}>{item}</option>
          ))}
        </Chosen>
        
        {/* Reactの守備範囲 */}
        <select>
          {this.state.items.map(item => (
            <option key={item}>{item}</option>
          ))}
        </select>
      </div>
    );
  }
}

export default App;

componentDidUpdateをコメントアウトした場合、追加ボタンによって新たな要素が追加され
DOMには4つめの要素が生成されますが、Chosenが生成しているSelectには表示されません。
image.png

もちろん、普通のを利用しているリストには追加した要素が表示されます。
image.png

基本的にはReactのComponentとして提供されているライブラリを利用する方がよいですが、
必要に迫られた場合には、やれないことはないということですね。

1
2
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
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?