开发者问题收集

为什么我不能用数组传递 props

2019-09-26
97

我是 React 的新手,所以请耐心等待!我认为这是由于生命周期方法造成的,因为这是在状态更新之前渲染的。 我正在尝试学习 Hook,但似乎看不到我做错了什么。

我有一个文件,里面有一个充满对象的数组,处于我的主要状态。然后我创建了另一个名为“Questions”的文件。“choices”应该是一个数组,但这是在传递详细信息之前渲染的。我尝试过“useEffect”,但它进入了一个持续的循环。如果我在最后传递一个空括号,那么我在同一个位置,它会在状态传递之前渲染。我该怎么办?

尝试过 useEffect,但没有成功。

    //top file with state 


    import React, { Component,useState,useEffect } from "react";
    import axios from 'axios'
    import Questions from './Questions'
    import Data from '../Data/Data'
    class Main extends Component {

      constructor(props) {
        super(props);

        this.state={
            nxt:0

        }

    }

    pushData=()=>{
      const {nxt}=this.state;
      this.setState({
          question:Data[nxt].question,
          choices:[Data[0].choice1,Data[0].choice2,Data[0].choice3],
          answer:Data[nxt].answer


      })

    }



    componentDidMount(){
    this.pushData()
    }


    render() {
    const {question,choices,answer}=this.state

    return (
      <div>
    <Questions choices={choices} question={question}/>


      </div>
    )


    }
    }
    export default Main



    import React, { Component,useState,useEffect } from "react";
    import ReactDOM from "react-dom";


    const Questions=({question,choices})=>{

      const [theChoices,setTheChoices] = useState(choices)
    console.log(theChoices,choices)
      return (
        <div>
    <h3>{question} </h3>
    {
    theChoices.map(item => (<h3>{item}</h3>) )
    }
    </div>

    )
    }

    export default Questions

我希望选择中的数组列出

1个回答

questionschoicesanswers 在第一次渲染中 undefined 。在初始状态中声明它

this.state = {
    nxt: 0,
    questions: [],
    answers: [],
    choices : []
} 

更新

为什么会这样?

在第一次渲染中( componentDidMount 之前),您尝试将两个 props 传递给 Questions ,这两个 props 分别称为 qustionschoices 。问题是,直到 pushData() 被调用,这些属性才存在于 Main 的 state 中(仅存在于 nxt 中)。因此,在 Question 中,您尝试在 undefined 中使用 .map()

当我使用 useState 并将状态作为参数时,“theChoices”为什么不起作用?

传递给 useState 的参数是 initial 值。如果您将 prop 作为初始值传递,则它只是初始值。它不会对该 prop 的任何更改做出反应。在类组件中,我们通过使用 componentDidUpdate 甚至 getDerivedStateFromProps 来解决这个问题。在功能组件中,您可以添加效果以在每次 prop 更改时更新状态。

useEffect(() =>{
    setTheChoices(choices)
},[choices])
Dupocas
2019-09-26