2017-10-18 3 views
1

こんにちは、私は反応を使用して良いverryではないと私はなぜthis.setStateはここで働いていないが、いくつかの他のファイルで理解していない。私の他のファイルでは、まったく同じように書かれていますが、動作しますが、ここでは動作しません。誰かが私に理由を教えてくれますか?この行でthis.setStateはなぜ機能しなかったのですか?

test(event){ 
event.preventDefault(); 
var regex_mongoinclude = document.getElementById("regexinclude").value; 
var regex_mongoexclude = document.getElementById("regexexclude").value; 
if (this.props.item.type == "email") { 
    (function(prop) { 
    var text = document.getElementById("name_sub").value; 
    var reg = /^([a-zA-Z0-9.\-_]+[@]{1}[a-zA-Z0-9\-_]+[.]{1}[a-zA-Z0-9\-_]+[,]*)+/; 
    if(reg.test(text)==true) { 
     Subs.update(
     { _id: prop.item._id }, 
     { 
      text, 
      type :"email", 
      createdAt: new Date(), 
      regex_mongoinclude, 
      regex_mongoexclude, 
      topic:prop.parent._id, 

     }, 
     { upsert: true } 
    ) 
     this.setState({ 
     showMessage: true, 
     isError: false 
     }); 
    } else { 
     this.setState({ 
     showMessage: true, 
     isError: true 
     }); 
    } 
    })(this.props) 
} else if (this.props.item.type == "slack") { 
+1

なぜ 'if'の中で' IIFE'を使用していますか? –

+1

'function(prop){'は新しい(矢印以外の)関数です。それは新しい「this」を持っています。 [strict mode](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode)で作業を開始し、 'this'の参照をどこかに保存してください。 – Ryan

答えて

3

(function(prop) { 

あなたは、本質的に正しいthisオブジェクトへの参照を失って、新しいクロージャを作成しています。

((prop) => { 

arrow機能は正しいクロージャーをそのまま維持します。 しかし正直なところ、なぜこのような場合に必要なのかわからないのですが、コードをifに直接記述することができ、IIFEを作成する必要はありません。

0

'test'関数がイベントハンドラのようです。そのthis.setStateがうまくいけば動作します後

// inside constructor 
this.test = this.test.bind(this) 

:イベントハンドラ内 thisのようなものでコンポーネントのコンストラクタで手動でバインドされる必要があります。

関連する問題