2017-10-18 9 views
1

Salut je ne suis pas très bon en utilisant réagir et je ne comprends pas pourquoi mon this.setState ne fonctionne pas ici, mais sur certains autres fichiers c'est. Sur mes autres fichiers il est écrit exactement la même chose et ça marche mais pas ici. Quelqu'un peut-il me dire pourquoi?this.setState n'est pas une fonction pourquoi cela n'a pas fonctionné?

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

Pourquoi utilisez-vous un 'IIFE' dans' if'? –

+1

'function (prop) {' est une nouvelle fonction (non-flèche); il a un nouveau «ceci». Commencer à travailler en [mode strict] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode) et stocker une référence à 'this' quelque part. – Ryan

Répondre

3

Dans cette ligne:

(function(prop) { 

Vous créez une nouvelle fermeture, perdant essentiellement référence à l'objet this correct. Vous pouvez le remplacer par:

((prop) => { 

La fonction de flèche maintient la bonne fermeture intacte. Mais honnêtement, je ne sais pas pourquoi vous en avez même besoin dans ce cas, vous pourriez mettre votre code directement dans l'instruction if et n'aurait pas besoin de créer un IIFE.

0

La fonction 'test' semble être un gestionnaire d'événements. this l'intérieur d'un gestionnaire d'événements doit être binded manuellement dans le contructor composant avec quelque chose comme:

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

Après que this.setState fonctionnera avec espoir.