开发者问题收集

设置状态后做出承诺时出现“TypeError:this.setState(...)未定义”

2020-06-03
61

我正在制作一个全栈应用程序,使用 MERN 堆栈通过经典算法加密文本。在前端,它有一个用于输入文本的表单、所需的算法和要使用的因子。它应该在输入加密文本时呈现它,所以我有一个函数来处理对表单的任何更改 - 目前它是一项正在进行的工作,因此 console.logs:

import React, { Component } from 'react'
import CipherService from './../../services/ciphers.service'

import Form from 'react-bootstrap/Form'

import './InputForm.css'

class InputForm extends Component {
  constructor(props) {
    super(props)
    this.state = {
      text: '',
      cipher: 'caesar',
      factor: 13,
    }

    this.cipherService = new CipherService()
  }

  handleChange = (e) => {
    let { value, name } = e.target
    if (name === 'factor') {
      value = parseInt(value)
    }
    this.setState({ [name]: value })
      .then(() => {
        switch (this.state.cipher) {
          case 'caesar':
            this.cipherService
              .caesar(this.state)
              .then((result) => console.log(result.data.message))
              .catch((err) => console.log(err))
            break
        }
      })
      .catch((err) => console.log(err))
  }

  render() {
    return (
      <Form.Group as='section'>
        <Form.Control as='textarea' name='text' onChange={this.handleChange} />
        <Form.Text className='text-muted'>
          Please only input Latin characters without diacritics or spaces.
        </Form.Text>
        <div className='options-container'>
          <Form.Control as='select' name='cipher' onChange={this.handleChange}>
            <option value='caesar'>Caesar cipher</option>
          </Form.Control>
          <Form.Control
            as='input'
            type='number'
            name='factor'
            value={13}
            onChange={this.handleChange}
          />
        </div>
      </Form.Group>
    )
  }
}

export default InputForm

就目前而言,如果表单的状态发生变化,应用程序就会崩溃并输出此错误:

TypeError: this.setState(...) is undefined
InputForm/this.handleChange
src/components/InputForm/InputForm.js:25
  22 | if (name === 'factor') {
  23 |   value = parseInt(value)
  24 | }
> 25 | this.setState({ [name]: value })
     | ^  26 |   .then(() => {
  27 |     switch (this.state.cipher) {
  28 |       case 'caesar':

我猜这是一个上下文问题,但我找不到导致问题的确切原因。让函数在解析 this.setState 后调用 API,不保证能正常工作,但由于 setState 是一个异步操作,它会将“上一个”状态传递给 API,从而产生不良结果。

1个回答

setState 是异步的,但它不会返回承诺供您在其上使用 .then 。但是,它提供了一个回调作为第二个参数,您可以使用它

this.setState({ [name]: value }, () => {
     switch (this.state.cipher) {
           case 'caesar':
            this.cipherService
              .caesar(this.state)
              .then((result) => console.log(result.data.message))
              .catch((err) => console.log(err))
            break
        }

});
Shubham Khatri
2020-06-03