2017-10-18 124 views
1

嗨,我不是很好使用反应,我不明白为什么我的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'。开始在[严格模式](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode)中工作,并在某处存储对“this”的引用。 – Ryan

回答

3

在这一行:

(function(prop) { 

你正在创建一个新的闭包,基本上失去了参考正确this对象。你可以将其替换为:

((prop) => { 

箭头功能保持正确的封闭完好。 但是,老实说,我不确定为什么你甚至在这种情况下需要它,你可以直接在if声明中放置你的代码,并且不需要创建一个IIFE。

0

'测试'功能似乎是一个事件处理程序。 this在事件处理中必须手动绑定在组件构造器的东西,如:

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

之后this.setState将有望合作。

相关问题