Я могу получить доступ к this.state вне fetch, но при попытке получить доступ к состоянию внутри fetch я получаю эту ошибку:

Uncaught TypeError: Невозможно прочитать свойство 'state' из null

Я просмотрел другие посты в StackOverflow, но не нашел работающего решения для использования свойств состояния в вызове fetch. Пожалуйста помоги.

class SignIn extends React.Component {
  constructor(props){
    super(props);
    this.state = {
      email: '',
      password: ''
    }
    this.handleValueChange = this.handleValueChange.bind(this);
  }

  handleValueChange(event) {
    const property = event.target.name;
    this.setState({[property]: event.target.value});
  }

  handleLogin(event){
    event.preventDefault();

    fetch("http://localhost:3001/login.json", {
        method: "POST",
        headers: {
          'Accept': 'application/json',
          'Content-Type': 'application/json'
        },
        body: JSON.stringify({
          email: this.state.email,  //this is where the error occurs
          password: '123456'
        })
    })
    .then(function(res){return res.json();})
    .then(function(data){console.log(data)});
  }

  render() {
    return(
      <header>
        <NavigationBar />

        <div className="form-box">
          <form onSubmit={this.handleLogin}>
            <h2>Login</h2>
            <br />
            <div className="row">
              <div>
                <label>Email</label>
                <input type="text" name="email" ref='emailInputField' 
                  onChange={(event) => this.handleValueChange(event)}
                  required
                />
              </div>
            </div>
            <br />
            <div className="row">
              <div>
                <label>Password</label>
                <input type="text" name="password"
                  onChange={(event) => this.handleValueChange(event)}
                  required
                />
              </div>
            </div>
            <br />
            <div className="btn-submit">
              <input type="submit" value="Let's go!" />
            </div>
          </form>
          <button onClick={() => console.log("this.state", this.state)} >Show state</button>
        </div>
      </header>
    )
  }
}

ПРИМЕЧАНИЕ: некоторые коды не показаны для краткости

1
user4851649 27 Авг 2017 в 20:35

3 ответа

Лучший ответ

Вы пробовали что-то вроде этого:

handleLogin = (event) => {
    event.preventDefault();

    fetch("http://localhost:3001/login.json", {
        method: "POST",
        headers: {
          'Accept': 'application/json',
          'Content-Type': 'application/json'
        },
        body: JSON.stringify({
          email: this.state.email,  //this is where the error occurs
          password: '123456'
        })
    })
    .then((res) => {return res.json();})
    .then((data) => {console.log(data)});
  }

Или просто привяжите свою функцию к вашему компоненту, как предложено в комментариях, и как вы уже сделали с другой функцией. Функции стрелок намного более гладкие, хотя.

1
Nocebo 27 Авг 2017 в 17:38

Добавьте this.handleLogin в конструктор, как показано ниже.

 constructor(props){
    super(props);
    this.state = {
      email: '',
      password: ''
    }
    this.handleValueChange = this.handleValueChange.bind(this);
    this.handleLogin = this.handleLogin.bind(this)
  }
1
Kalaikumar Thangasamy 27 Авг 2017 в 17:42

Я думаю, что следующее должно работать.

В строке выше fetch (...) добавьте const self = this; и вызовите self.state.email.

Дайте мне знать, если это так.

0
tyskr 27 Авг 2017 в 18:12