2016-08-05 12 views
0

私はreact.jsを使用して、<script>をHTMLページに表示しています。このスクリプト内には、私の反応クラス内から呼び出す必要があるjavascript関数があります。反応を使用して外部で定義されたjavascript関数を呼び出す方法は?

これは私が持っているものですが...だからcomponentWillMount()

class Example extends React.Component { 

    componentWillMount() { 

     //render a script 
     const script = document.createElement("script"); 
     script.src = "http//random_source.js"; 

    render(){ 

     //call method from the script rendered 
     window.someMethod(); 
     return(
      <div>{this.componentWillMount}</div> 

      ); 
     } 
    } 

は、HTMLページに私のスクリプトをレンダリングしている、と render()以内に私は someMethodがレンダリングスクリプト内に配置され window.someMethod()を呼んでいます。

これは反応を使用して可能ですか?そうでない場合は回避策がありますか?

+0

これが動作するかどうかを確認しているようです。なぜそれを試してみませんか? –

+0

@CalebAnthony私は自分のコードを見てみました^^ – Bolboa

+2

@Bolboaこれは可能です - https://jsfiddle.net/_alexander_/69z2wepo/51817/、なぜ反応成分の中にスクリプトを読み込む必要がありますか?あなたはwebpackを使いますか?たぶん、このスクリプトを一般バンドルに追加するほうがいいでしょうか? @AlexanderT。 –

答えて

0

スクリプトは非同期なので、スクリプトの読み込みと解析が完了するまで待つ必要があります。これが完了すると、onloadコールバック/イベントが発生します。

class Example extends React.Component { 

    getInitialState(){ 
     return {loaded:false} //initially not loaded 
    } 

    componentWillMount() { 

     //render a script 
     const script = document.createElement("script"); 
     script.src = "http//random_source.js"; 

     //when the script loads, we're ready to go, so change state 
     script.onload = (function(){ 
      this.setState({loaded: true}) 
     }).bind(this); 

     //append the script to the DOM 
     //you should take care not to include it twice 
     // and if include to setState to loaded just as script.onload does 
     document.getElementsByTagName('head')[0].appendChild(script); 
    } 

    render(){ 
     if(!this.state.loaded){ 
      return (<div>Loading...</div>); 
     } 

     //call method from the script rendered 
     window.someMethod(); 
     return(
      <div>{this.componentWillMount}</div> 

      ); 
     } 
    } 
0

はい、これは実際にはreactJSを使用して可能です。私はこれを使っていくつかのスクロールイベントを実装しています。唯一の条件は、あなたのjavascriptがあなたのreactjsコンポーネントの前にロードされるべきで、それ以外の未定義のエラーがスローされるということです。

しかし、これがこの特定のコンポーネントに対してのみ必要な場合は、コンポーネントクラスのみを実装できます。

+0

上記の私の例では、メソッドが呼び出される前または後にJavaScriptがロードされていますか? – Bolboa

+0

これはなぜこのように実装されていますか?私はreactjsからjs要素を作成することを意味しますか? jsファイルをhtmlに入れ、webpackであなたのreactjsファイルをコンパイルし、バンドルされたファイルをhtmlコードの下に置くのはなぜですか? –

関連する問題