ReactJS Array.push函数在setState中不起作用 [英] ReactJS Array.push function not working in setState
问题描述
到目前为止,我正在制作一个有3个问题的原始测验应用程序,无论是真还是假。在我的 handleContinue
方法中,有一个调用将用户输入从无线电表单推送到 userAnswers
数组。它适用于第一次运行 handleContinue
,之后它会抛出一个错误:未捕获TypeError:this.state.userAnswers.push不是函数(...)
I'm making a primitive quiz app with 3 questions so far, all true or false. In my handleContinue
method there is a call to push the users input from a radio form into the userAnswers
array. It works fine for the first run of handleContinue
, after that it throws an error: Uncaught TypeError: this.state.userAnswers.push is not a function(…)
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>
)
}
}
推荐答案
Array.prototype.push()
mutates 数组在 - 地点。基本上,当你将
推送到 setState
中的数组时,你可以使用推
。由于 push
返回新的数组长度而不是实际的数组,因此您将 this.state.userAnswers
设置为一个数值,这就是为什么你得到 Uncaught TypeError:this.state.userAnswers.push在第二次运行时不是一个函数(...)
,因为你可以't 将
推送到一个数字。
Array.prototype.push()
mutates the array in-place. So essentially, when you push
to an array inside setState
, you mutate the original state by using push
. And since push
returns the new array length instead of the actual array, you're setting this.state.userAnswers
to a numerical value, and this is why you're getting Uncaught TypeError: this.state.userAnswers.push is not a function(…)
on the second run, because you can't push
to a number.
您需要使用 Array.prototype.concat()。它不会改变原始数组,并返回带有新连接元素的新数组。这是你想在 setState
中做的。您的代码应如下所示:
You need to use Array.prototype.concat() instead. It doesn't mutate the original array, and returns a new array with the new concatenated elements. This is what you want to do inside setState
. Your code should look something like this:
this.setState({
userAnswers: this.state.userAnswers.concat(this.state.value),
questionNumber: this.state.questionNumber + 1
}
这篇关于ReactJS Array.push函数在setState中不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!