在设置子组件的数组状态并将其通过反应测验传递回父组件时出现问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在设置子组件的数组状态并将其通过反应测验传递回父组件时出现问题相关的知识,希望对你有一定的参考价值。

我是一名学生,对于我的项目,我的职责之一是测验。我从后端获取问题,在QuizContainer中执行componentDidMount,然后将每个问题作为道具传递给QuizForm。在QuizForm中,每个问题都有5个单选按钮,表示从完全不同意到完全同意的范围。当我在子组件(QuizForm)组件中设置setState时,它仅注册最后一个onClick事件,并且仅将其发送给父组件。我认为这可能是因为每个问题都是自己的QuizForm而呈现的,但是我不确定如何在父级内部收集所有数据(也许作为父级的状态,但是我不确定如何处理) )。

这里是参考代码:

QuizContainer

state = {
        all: []
    }

    handleSubmit = (evt, quizObj) => {
        evt.preventDefault()
        this.setState = {
            all: [...this.state.all, quizObj]
        }
    }

 render() {
        return (
            <container className="quiz">
            <h5>For each of the following statements choose on a scale of 1 - 5, one strongly disagree and 5 being strongly agree, and 3 being neutral. </h5>
                <div> {this.props.questions.questions.map(question => <QuizForm question={question} key={question.id} handleSubmit={this.handleSubmit}/>)}
                    <input form="quiz-form" type="submit" value="Submit" />
                </div> 
            </container>
        )
    }

QuizForm

state = {
        question: [],
        answer: []
    }

    handleChange = (evt) => {
        let name = evt.target.name
        let value = evt.target.value


            this.setState({
                questions: [...this.state.questions, name],
                answers: [...this.state.answers, value]
            })

    }



    render() {
        return (
            <form id="quiz-form" onSubmit={(evt) => this.props.handleSubmit(evt, this.state)}>
                <label htmlFor="question">{this.props.question.question}</label>
                <input onChange={this.handleChange}
                    type="radio"
                    name={this.props.question.id}
                    value={0}
                />
                <input onChange={this.handleChange}
                    type="radio"
                    name={this.props.question.id}
                    value={25}
                />

                </form>
        )
    }
答案

您正在使用map()方法,该方法基本上循环数组,所以是的,它会将每个问题呈现为不同的形式。您不应该将每个问题都以不同的形式放置,只需将它们包装成一个表格并从QuizForm中删除标签即可。

另外handleSubmit应该是将表单提交到后端(或w.e.),并创建另一个诸如handleChange之类的方法的方法,该方法接受参数并设置状态。

handleChange(questionName, selectedAnswer){
   this.setState({...answers, {name, selected: selectedAnswer}})
}

通过这种方式,您可以保留问题的名称(ID或类似的名称会更好)和选定的答案,并将其作为道具传递给QuizForm(它也需要重命名为诸如Question的东西),并检查单选是否匹配选择的答案。 。

您当前的QuizForm组件应该看起来像这样(它也应该是功能组件,而不是类)

            function Question({selectedAnswer, name, id}){
               return (
                  <>
                   <label htmlFor={id}>


                  </>
               );

            }

以上是关于在设置子组件的数组状态并将其通过反应测验传递回父组件时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

React 功能组件 - 当组件返回元素数组时,如何将 refs 传递回父级?

如何在 React 中将状态传递回父级?

通过反应上下文 api 将子状态传递给父组件

在选择选项更改时将子组件中的道具传递给父组件

将异步结果从父组件传递给子组件反应功能组件

反应切换功能