当前位置: 首页 > 知识库问答 >
问题:

ReactJS Array.Push函数在setState中不工作

郎魁
2023-03-14
import React from "react"

export default class Questions extends React.Component {
  constructor(props) {
    super(props)
    this.state = {
      questionNumber: 1,
      userAnswers: [],
      value: ''
    }

    this.handleContinue = this.handleContinue.bind(this)
    this.handleChange = this.handleChange.bind(this)
  }

  //when Continue button is clicked
  handleContinue() {
    this.setState({
      //this push function throws error on 2nd go round
      userAnswers: this.state.userAnswers.push(this.state.value),
      questionNumber: this.state.questionNumber + 1
    //callback function for synchronicity
    }, () => {
      if (this.state.questionNumber > 3) {
        this.props.changeHeader(this.state.userAnswers.toString())
        this.props.unMount()
      } else {
        this.props.changeHeader("Question " + this.state.questionNumber)
      }
    })
    console.log(this.state.userAnswers)
  }

  handleChange(event) {
    this.setState({
      value: event.target.value
    })
  }

  render() {
    const questions = [
      "Blargh?",
      "blah blah blah?",
      "how many dogs?"
    ]
    return (
      <div class="container-fluid text-center">
        <h1>{questions[this.state.questionNumber - 1]}</h1>
        <div class="radio">
          <label class="radio-inline">
            <input type="radio" class="form-control" name="trueFalse" value="true" 
            onChange={this.handleChange}/>True
          </label><br/><br/>
          <label class="radio-inline">
            <input type="radio" class="form-control" name="trueFalse" value="false" 
            onChange={this.handleChange}/>False
          </label>
          <hr/>
          <button type="button" class="btn btn-primary" 
          onClick={this.handleContinue}>Continue</button>
        </div>
      </div>
    )
  }
}

共有1个答案

梁丘兴腾
2023-03-14

不要直接修改状态!一般情况下,尽量避免突变。

array.prototype.push()就地变异数组。因此,本质上,当您pushsetstate中的数组时,您可以使用push改变原始状态。由于push返回新的数组长度而不是实际的数组长度,所以将this.state.useranswers设置为数值,这就是为什么在第二次运行时得到uncated typeerror:this.state.useranswers.push不是函数(…),因为您不能push设置为数字。

您需要使用array.prototype.concat()。它不会改变原始数组,而是返回一个包含新串联元素的新数组。这就是您希望在setstate中执行的操作。您的代码应该如下所示:

this.setState({
  userAnswers: this.state.userAnswers.concat(this.state.value),
  questionNumber: this.state.questionNumber + 1
}
 类似资料:
  • 问题内容: 这两个功能之间的主要区别是什么? 为什么用直接更改状态的handleOnChange()函数可以正常工作? 当我使用第一个通过回调更改状态的函数时,出现以下错误: 问题答案: 这是setState的两种不同语法 第一: 使用updater函数作为第一个参数。 第二: 使用要更新的对象 在更新程序功能中使用综合事件时,需要使用 从 文档中 : SyntheticEvent被合并。这意味着

  • 问题内容: 有人可以解释一下为什么 this.setState 不是函数吗? 我不明白为什么我的代码有错误 谢谢 问题答案: 这是问题。使用。

  • 我是JS的初学者。我正在尝试使用 jwt 令牌构建身份验证。 我在系统中有3个用户(角色:管理员,医生 我有一个用于身份验证的中间件,它是auth.js 我试图写另一个将限制路由的(路由/api/admin/me)访问只有管理员。同样是在adminguard.js.(我试图提取角色和检查条件) 请求有关第二个中间件功能的帮助或提出更好的解决方案。 routes/api/systemusers。js

  • 我是React中的一个noob,正在尝试为水相制作一个简单的应用程序,用户输入一个数字,然后根据数值显示水的状态,例如,如果他输入212,它应该是气体,12应该是固体,但由于某些原因,它没有正确显示数值,非常感谢任何帮助!!!

  • 我试图更新的值与中的的值,但它只更改的值,而不更新

  • 当我试图用日期重命名上传的图像时,一个错误被抛出,它显示“无法读取未定义的属性'isLoggedIn'”。 如果有人能解决这个问题,我会很高兴的。首先感谢Multer,我认为它会抛出一个错误,然后转到错误处理中间件。 下面是我的app.js常量path=require('path');