2017-03-02 7 views
0

私はReactjをHTML5とjQueryで構築されたWebアプリケーションフロントエンドに段階的に統合しています。私の反応コンポーネントは、反応コンポーネントのJavaScriptが読み込まれたときに利用可能なグローバルjQueryオブジェクト(AJAXといくつかのアニメーション用)を使用します。私は、酵素とテストのためmount()に、このコンポーネントをしようとすると、エンザイムテストグローバルなjQueryオブジェクトを使用するReactjsコンポーネント

今、それは私が実装部品用jQueryオブジェクトを利用できるようにするにはどうすればよい次のエラー

ReferenceError: jQuery is not defined 

を取得しますか?

Testing a React component that uses jQuery & window objectが0の答え...私は必要に応じてコンポーネントのコードを更新するつもりです

と似た質問です。

何か助けていただければ幸いです。私のコンポーネントの

編集

サンプルコード

import React from 'react'; 

    export default class MySimpleComponent extends React.Component { 

    constructor(props) { 
     super(props); 
    } 

    componentDidMount() { 
     var add_btn = this.refs.btn_add; 
     (function ($) { 
      $(add_btn).click(function (ev) { 
       ev.preventDefault(); 
       console.log('button was clicked'); 
      }); 
     })(jQuery); 
    } 

    render() { 
     return (
      <div className="wrap"> 
       <form action="/"> 
       <input type="text" name="myinput" value="" /> 
       <button className="button" ref="btn_add">New Record</button> 
       </form> 
      </div> 
     ); 
    } 
    } 
+0

コンポーネントコードを投稿してください。 – spirift

+0

@spiriftコードを追加しました – Ejaz

答えて

1

オーケー、あなたはjsdomでこれを行うことができるかもしれないので。 readmeにあるように、いくつかのグローバルをセットアップする必要があります。 global.jQuery =() => {};も追加してください。

var jsdom = require('jsdom').jsdom; 

global.document = jsdom(''); 
global.jQuery =() => {}; 
global.window = document.defaultView; 
Object.keys(document.defaultView).forEach((property) => { 
    if (typeof global[property] === 'undefined') { 
    global[property] = document.defaultView[property]; 
    } 
}); 

global.navigator = { 
    userAgent: 'node.js' 
}; 

私は上記を試してみる機会がありませんでした。しかし、私はこれを持続可能な解決策として推奨しません。はるかに良い方法はjQueryを削除することです。ここにあなたのコンポーネントはそれなしでリファクタリングされます。

import React from 'react'; 

    export default class MySimpleComponent extends React.Component { 

    constructor(props) { 
     super(props); 
    } 

    clickHanlder(ev) { 
     ev.preventDefault(); 
     console.log('button was clicked'); 
    } 

    render() { 
     return (
      <div className="wrap"> 
       <form action="/"> 
       <input type="text" name="myinput" value="" /> 
       <button className="button" onClick={this.clickHanlder}>New Record</button> 
       </form> 
      </div> 
     ); 
    } 
    } 

ご覧のとおり、それほど違いはありません。イベントハンドラを要素に直接アタッチすることができます。これにより、コードが読みやすくなり、アクションがどこにあるかがわかります。

+0

ありがとうございます。私は実際にネイティブのイベント処理を使用するために私のコンポーネントの小さな部分を修正し、エラーを排除しました。私は最終的に私のコンポーネントからすべてのjQueryコードを削除し、要素をアニメーション化する他の方法を組み込もうとしていると思う。CSS遷移があるかもしれない。 – Ejaz

+0

[反応速度](https://github.com/twitter-fabric/velocity-react)または[反応動作](https://github.com/chenglou/react-motion)を参照してください。 – spirift

関連する問題