2017-10-18 4 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'를 가지고 있습니다. [엄격 모드] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode)에서 작업을 시작하고 어딘가에 'this'에 대한 참조를 저장하십시오. – Ryan

답변

3

:

당신은 기본적으로 올바른 this 객체에 대한 참조를 잃고, 새로운 폐쇄를 만드는
(function(prop) { 

. 다음과 같이 바꿀 수 있습니다 :

((prop) => { 

화살표 기능은 올바른 클로저를 그대로 유지합니다. 하지만 솔직히이 경우에도 왜 필요할지 모르겠다. 직접 코드를 if 문에 입력하면 IIFE를 만들 필요가 없다.

0

'test'함수가 이벤트 처리기 인 것 같습니다. 그 this.setState 희망 작동 후

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

: 이벤트 핸들러 내부 this는 같은과 구성 요소 생성자에서 수동으로 바인더 제본되어야한다.