巷の記事では、Jqueryで出来ることはReactで出来ので併用はいらない、パフォーマンスが下がるという事ですが、DOM操作だけにとどまらず、ちょとした動きをつける歳、生のjsよりJqueryの方が記述量が少ないと思うのですが、併用するメリットとデメリットを教えてもらえませんか
Reactベースの実装です。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答2件
0
Jqueryで出来ることはReactで出来ので併用はいらない、パフォーマンスが下がる
そういう問題では済みません。ReactはVirtual DOMライブラリという性質上、jQueryなどReact外の手段で直接DOMを書き換えてしまうと、「React内で把握している仮想DOMの構造」と「実際のDOM構造」が違ってしまって、DOMの反映が破綻します。
どうしてもjQueryなどを使いたければ、jQueryプラグインを入れる部分を<div>
などでくるんで、componentDidMount
とcomponentWillUnmount
で書き換えることで対応は可能です。
投稿2017/08/02 22:34
総合スコア146544
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
総合スコア1869
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。