質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

2回答

2589閲覧

ReactとjQueryの併用のメリット・デメリット

roooo

総合スコア57

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

1クリップ

投稿2017/08/02 22:10

巷の記事では、Jqueryで出来ることはReactで出来ので併用はいらない、パフォーマンスが下がるという事ですが、DOM操作だけにとどまらず、ちょとした動きをつける歳、生のjsよりJqueryの方が記述量が少ないと思うのですが、併用するメリットとデメリットを教えてもらえませんか

Reactベースの実装です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Jqueryで出来ることはReactで出来ので併用はいらない、パフォーマンスが下がる

そういう問題では済みません。ReactはVirtual DOMライブラリという性質上、jQueryなどReact外の手段で直接DOMを書き換えてしまうと、「React内で把握している仮想DOMの構造」と「実際のDOM構造」が違ってしまって、DOMの反映が破綻します

どうしてもjQueryなどを使いたければ、jQueryプラグインを入れる部分を<div>などでくるんで、componentDidMountcomponentWillUnmountで書き換えることで対応は可能です。

Integrating with DOM Manipulation Plugins - React公式

投稿2017/08/02 22:34

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

Reactの構成にもよりますが、例えばフルSPA、routingもすべてreact-router-domなどで行なった場合、jqueryとの併用は非常に難しいと思います。
また、基本的にはSSRで一部分だけReactで管理したい場合などはjqueryとの併用は仕組みを理解すれば可能です。

maisumakunさんも仰ってますが、Reactアプリケーションでは、React内でのデータとして持っている仮装DOM構造を元にviewを生成します。

Reactの例

例えばuserのリストをレンダリングするパターンだとします。
this.stete.usersにユーザーのリストを定義
#jsUserListにrenderする

js

1// データの例 2class Users extends React.Component{ 3 constructor(props){ 4 super(props) 5 this.state.users = [ 6 {name: '太郎', age: 20}, 7 {name: '花子', age: 19}, 8 ] 9 } 10 render(){ 11 return( 12 <div className="users"> 13 {{ 14 this.state.users.map(user => { 15 return( 16 <div className="user"> 17 <div className="user-name">{{user.name}}</div> 18 <div className="user-age">{{user.age}}</div> 19 </div> 20 ) 21 }) 22 }} 23 </div> 24 ) 25 } 26} 27//renderする(文法間違ってたらごめんなさい) 28ReactDOM.render( 29 <User />, 30 document.getElementById('jsUserList') 31)

そうすると以下のようにレンダリングされます。

html

1<div id="jsUserList"> 2 <div class="users"> 3 <div class="user"> 4 <div class="user-name">太郎</div> 5 <div class="user-age">20</div> 6 </div> 7 <div class="user"> 8 <div class="user-name">花子</div> 9 <div class="user-age">21</div> 10 </div> 11 </div> 12</div>

jqueryを使用する(Reactで生成したDOMに対して)

さて、今.usersの中に.userのリストが入っていますよね。
これに対してjqueryを使用して各ユーザーの名前を書き換えてみましょう。

js

1var $users = $('.user'); 2$users.each(function(){ 3 $(this).find('.users-name').text('書き換えた名前') 4})

こうすると、テキストは書き換わります。

この場合、Reactが持っているデータの名前は太郎花子です。
しかし、実際にviewに反映されているのは書き換えた名前です。

jqueryを使用してデータを書き換えると、viewの内容は更新されるので書き換わりますが、reactのデータを書き直した瞬間にもとに戻ってしまいます。

このように実際にDOMが持っているものとReactが持っているものが違う、しかしデータが更新されるとReactはレンダリングを行なってしまうので、viewを書き換えるjqueryデータを保持し、データを元にviewを書き換えるReactでは同じ場所で共存することは出来ません。

jqueryを使用する(Reactで生成した以外のDOMに対して)

さて、共存が不可能と書きましたが、同じ場所に対してjqueryとReactを併用することは基本的に難しいです。
しかし、renderを囲っている#jsUserListそれを囲っている要素に関してはReactで管理されていないので可能です。

例えば先ほどの例で'#jsUserList'に対してjqueryを使って$('#jsUserList').fadeIn()などすると普通に動きます。(もしかしたらもう1階層上しか無理かも。。。)

なので併用というとちょっと語弊があるかもしれませんが、Reactでrenderした部分以外であれば併用は可能です

Reactでレンダリングjqueryを使用したい場合(どうしても)の注意

しかし、どうしてもjqueryでイベントをバインディングしたいなどの場合があるかと思います。
その場合の注意は、普通に$('.user').on('click', function(){})のようにイベントをセットすると動かないという点です。

jqueryは要素に対してイベントを付与します。
つまり、jqueryが読み込まれた際に要素があるのが大前提です。
しかし、ReactやAngularやknockout, vueなど、jsに保持しているデータを元にviewをレンダリングしていくようなものだと、突然要素が追加されたりするのでjqueryのイベントが付与されていない要素が現れます。

なので、jqueryでセットしたはずのイベントがでない!クリックが反応しない!などが起こります。

なのでそういうのを防ぐために以下のようにrenderには関係ない要素にイベントをセットし、クリックイベントが伝搬してきたときにイベントが呼ばれるようにしてください。

js

1$('#jsUserList').on('click', '.user', function(){ 2 3})

これは、Reactなどに限らずAngular, vue, knockoutや他のフレームワーク、jqueryのみのアプリケーションでajaxで追加した要素にイベントを付与するのにも必要です。

結論

Reactでレインダリングしている部分に対してjqueryを併用することは非常に難しいですし、界隈を見てると明らかにアンチパターンな気がします。
ちょっとした動きなどはjqueryでやるのではなく、cssのアニメーションを使用し、classの付け替えなどで実現するほうがいいと思います。

長くなってしまってスイマセン_(:3 」∠ )_

投稿2017/08/03 03:26

MasakazuFukami

総合スコア1869

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問