2017-12-04 14 views
0

私はいくつかのユーザー(javascript)入力を評価することを含む反応を伴うweb-appコーディングゲームを作りたいと思います。ボタンを押したときの入力文字列をeval入力して反応させます

constructor(props) { 
    super(props); 
    this.state = { 
     code: '' 
    }; 
    } 

    handleChange(key) { 
    return event => this.setState({ [key]: event.target.value }); 
    } 

    funScript() { 
    eval(this.state.code); 
    } 

    anotherScript() { 
    console.log("Will this work?"); 
    } 

    render() { 
    return (
     <div> 
     <input 
      type={"text"} 
      value={this.state.code} 
      onChange={this.handleChange('code')} 
     /> 
     <button onClick={this.funScript()} >run</button> 
     </div> 
    ); 
    } 

私はテキスト入力がthis.anotherScript()内のユーザーの種類(ユーザーがボタンを押した上でJavaScriptを評価することができるだろうと期待していた。「?ウィルこの作品」。とコンソールログ残念ながら、それはうまくいかず、Reactに固有の問題だと思われます。入力ボックスが入力されるとすぐに、ボタンを押さなくても文字列を評価しようとします。例を参照してください:https://codesandbox.io/s/54rkp584ll

誰でも最初の文字入力でjavascriptを破らない適切なReactソリューションを持っています(機能を評価します)?

答えて

1

入力すると

<button onClick={this.funScript()} >run</button> 

あなたはthis.funScriptに電話しています。括弧を削除すれば、好きなように関数を渡すだけです。また、funScriptが動作するには、これにバインドする必要があります。ここで

+0

うーん..私はちょうどfunScript境界せずに作品内)this.funScriptを(実行機能を渡しました。 https://codesandbox.io/s/54rkp584ll括弧を削除 '<ボタンのonClick = {()=> {this.funScript()}}>の実行' は動作しませんでしたが、私はよ私がthisにバインドしなかったので推測する.funScript –

+0

ええ、関数を呼び出す矢印関数を作成するのは、基本的に関数をバインドすることです。あなたが矢印関数と 'this'に慣れていないなら、あなたはそれを調べるべきです。それは非常に明白ではありませんが、理解するのに非常に役立ちます/重要です。 –

0

あなたが適切なコンテキストでコードを評価funScript、している:

class Test { 

    // ... 

    funScript() { 
     const code = ("" + this.state.code).replace(/this/ig, "__self__"); 
     const execute = new Function("__self__", code); 
     execute(this); 
    } 

    // ... 
} 
+0

これは「this」ですか?コードの実行文字列に不要?便利ですが、私はそれが問題に対処しているかどうかはわかりません。また、私は新しい関数の構文に慣れていませんが、それを調べてみましょう –

+0

コンポーネント 'Test'からメソッドを評価するには、コンテキストを手動で'渡す '必要があります。必要でない場合は、この/ selfを使用してコードをスキップできます。このコードの良い点は、ウィンドウ、ドキュメント、およびその他のグローバルオブジェクトを再定義できることです。これはセキュリティの大幅な向上につながります。 –

+0

私はセキュリティを心配していません(そのフロントエンド以来、セッショントークンを除いて私の目的のための安全な情報を含んではいけません...)私はコードをサンドボックスしているので実行を中断することができますエラーや無限ループなどの原因となるユーザー作成のコードが含まれていますが、これはおそらくサンドボックス化に役立つ可能性がありますか? –

関連する問題