javascript - TypeError : _this. state.answers.push 不是函数 React

标签 javascript reactjs

我有一个按钮可以将内容添加到一些数组中。使用 .push 时,元素添加正确(因为它看起来像使用了 for 循环)但是当我第二次单击该按钮时,出现上述错误。这是我的一些代码:

class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      key: uuid(),
      title: "",
      author: "",
      questions: [],
      answers: []
    };

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

  //yada yada

  addQuestion = () => {
    questionNum++;
    this.setState({
      questions: this.state.questions.concat(["question", "hi"])
    });
    console.log(this.state.questions);
    for (var i = 0; i < 4; i++) {
      this.setState({
        answers: this.state.answers.push({
          answerChoice: "",
          key: uuid()
        })
      });
    }
    console.log(this.state.answers);
    console.log(questionNum);
    console.log(this.state.title);
    console.log(this.state.author);
  };

  render() {
    //yada yada
    <div>
      <form>
        <div className="Intro">
          Give your Quiz a title:{" "}
          <input
            type="text"
            value={this.state.title}
            onChange={this.handleChange}
            name="title"
          />
          <br />
          Who's the Author?{" "}
          <input
            type="text"
            value={this.state.author}
            onChange={this.handleChange}
            name="author"
          />
          <br />
          <br />
        </div>
        <div className="questions">
          Now let's add some questions... <br />
          {this.addQuestion}
        </div>
      </form>
      <button onClick={this.addQuestion}>Add Question</button>
    </div>;
    //yada yada
  }
}
export default App;

但是当我更换

this.setState({
   answers: this.state.answers.push({
     answerChoice: '',
     key: uuid()
   })
})

this.setState({
  answers: this.state.answers.concat({
    answerChoice: '',
    key: uuid()
  })
})

似乎我的 for 循环不起作用(因为其中四个没有添加)。我对 React 和 JS 很陌生,所以任何提示都会有所帮助。

谢谢!

最佳答案

你不应该使用 push,因为它会改变当前状态中的数组。

当您更新派生自当前状态的状态时,最好为 setState 提供一个函数并返回该函数的状态更改。否则存在覆盖状态更新的风险,这就是您的第二个示例中发生的情况。

您可以改为展开状态中的当前数组并向其中添加新对象。

this.setState(previousState => {
  return {
    answers: [...previousState.answers, { answerChoice: '', key: uuid() }]
  };
});

如果您愿意,您还可以将状态更新组合在一起并仅使用一次 setState:

addQuestion = () => {
  questionNum++;
  this.setState(previousState => {
    const questions = [...previousState.questions, "question", "hi"];
    const answers = [...previousState.answers];

    for (var i = 0; i < 4; i++) {
      answers.push({
        answerChoice: "",
        key: uuid()
      });
    }

    return { questions, answers };
  });
});

关于javascript - TypeError : _this. state.answers.push 不是函数 React,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51270552/

相关文章:

javascript - 有没有办法将ejs文件的文件扩展名保留为.html?

javascript - 在 url 中推送查询参数时,Vue.js 中的 "NavigationDuplicated"异常是否有任何解决方法,同时保持在同一路径上

javascript - 对于如何在 React 组件中的条件语句中返回,是否有解决方法?

javascript - 如何在React中调用api之前设置状态

javascript - 选择某些字母之前的字符串

javascript - 按键事件中的 undefined variable

javascript - moment.js 中的 diff 比较操作

javascript - 导入深度嵌套的 Javascript 组件的最佳实践

reactjs - 使用 Redux 时如何使组件可重用

javascript - 无法从 Material-UI 对话中的 Popper 复制到剪贴板