2016-10-27 3 views
0

У меня есть следующий конструктор и функция в компоненте реакции, который я создал.React setState не работает

constructor() { 
    super() 
    this.state = { 
     error: false 
    } 
} 

handleSubmit(e) { 
    e.preventDefault() 
    const email = this.refs.email.value 
    const password = this.refs.password.value 
    const self = this 

    firebase.auth().signInWithEmailAndPassword(email, password).then(
     function(result) { 
      const location = self.props.location 
      if (location.state && location.state.nextPathname) { 
       self.context.router.replace(location.state.nextPathname) 
      } else { 
       self.context.router.replace("/home") 
      } 
      // User signed in! 
      console.log("User signed in!") 
    }).catch(function(error) { 
     this.setState({error: error}) // Error points to this line 
    }) 
} 

я получаю следующее сообщение об ошибке в консоли:

Uncaught TypeError: Cannot read property 'setState' of undefined

Может кто-нибудь помочь моему идентифицировать проблему?

+0

вам нужно использовать 'refs' для получения значений ? Если компонент является элементом 'input', вы можете использовать событие onChange и обновлять переменную со значением. –

+0

Есть ли польза от использования этого над 'refs'? –

+0

Refs должен быть последним средством, когда вы не можете делать то же самое с событиями, состояниями или реквизитами в соответствии с документацией. Также мелкий рендеринг не работает при тестировании модулей с ними. –

ответ

2

В следующем коде, вы используете «это», когда вы должны использовать «я»

catch(function(error) { 
    this.setState({error: error}) // Error points to this line 
}) 

должен быть

catch(function(error) { 
    self.setState({error: error}) // Error points to this line 
}) 
+1

Вы также можете использовать функцию стрелки, а затем 'this' наследует лексическую область' handleSubmit' – ken4z

+0

Спасибо, что работал! У меня также был пользователь 'error: error.message', но это выходит за рамки моего вопроса –

+0

@ ken4z Как бы это сделать? –