javascript React与还原:我在后台有State,但是不能在我的JSX中呈现循环的Array [duplicate]

qni6mghb  于 2023-01-29  发布在  Java
关注(0)|答案(2)|浏览(299)
    • 此问题在此处已有答案**:

(17个答案)
What does return keyword mean inside forEach function? [duplicate](2个答案)
5小时前关门了。
到目前为止,我已经使用GET_TOURNAMENTS将所有锦标赛对象设置为我的状态,并将它们呈现在页面上。
然后,我给每个锦标赛一个调用showTournament()的按钮,它选择我点击的任何锦标赛,并更新状态。当我点击SHOW_TOURNAMENT时,我的状态如下所示:

tournament
  tournaments: [{...}, {...}]           <<~~this is from GET_TOURNAMENTS
  showTournament: {                     <<~~begins as (showTournament: "") until showTournament() action
    _id: "etc",
    title: "Tournament One",
    status: "Open",
    participants: [                          <<~~an array of User objects
      0: {_id: "asdf", username: "asdf"},
      1: {_id: "asdf", username: "asdf"}
    ]
  }

Annnnnnnnd我尝试通过以下操作在ShowTournament组件中呈现所有这些内容:

class TournamentShow extends Component {
    static propTypes = {
        tournament: PropTypes.object.isRequired,
        auth: PropTypes.object.isRequired
    };

    render() {
        const { _id, title, hostedBy, status, participants } = this.props.tournament.showTournament;

        return (
            <div>
                <h1>{ title }</h1>
                <p>status: { status }</p>
                <p>Registered Participants:</p>
                {
                    participants ?
                    participants.forEach(participant => {
                        return (
                            <ul>
                                <li>{participant}</li>
                            </ul>
                        )
                    }) :
                    null
                }
                <p>Hosted by: { hostedBy }</p>
                <Link to="#">Sign Up</Link><br/>
                <Link to="/">Back to Tournaments main page</Link>
            </div>
        )
    }
};

const mapStateToProps = state => ({
    tournament: state.tournament,
    auth: state.auth
});

export default connect(mapStateToProps, { showTournament })(TournamentShow);

这将不显示任何内容。即使数组中存在参与者,也不会呈现任何内容。
我也尝试简单〈〈~~编辑:一开始我把标签放在里面,放在{}外面

<p>Registered Participants:</p>
                <ul>
                  {
                      participants.forEach(participant => {
                          return (
                              <li>{participant}</li>
                          )
                      })
                  }
                </ul>

我得到了错误TypeError: Cannot read property 'forEach' of undefined
所有来自showTournament的非数组数据呈现得很好..我发现了其他堆栈溢出问题,并尝试了许多解决方案,但其他问题只是不同的足够,我不能弄清楚如何获得正确的实现。
谢谢大家!

rjee0c15

rjee0c151#

1)你需要使用map,因为forEach不返回任何东西,所以你在forEach中返回的任何东西对forEach的外部世界都是不可见的。map将返回一个数组。
2)你想用{participant}做什么?它是一个对象,所以要么用JSON.stringify(participant)打印它,要么更好,分别打印_idusername,如下所示:

participants.map(participant => 
   (
      <ul>
         <li>{participant._id}</li>
         <li>{participant.username}</li>
      </ul>
   )
)

3)如果你得到了一个你所说的错误,那么participants很可能是undefined。你能试着调试一下,看看它的值是否被填充了吗?如果调试不可能,简单地试着用

<div>{JSON.stringify(participants)}</div>

甚至

<div>{JSON.stringify(this.props.tournament.showTournament)}</div>
rks48beu

rks48beu2#

首先你需要使用Array.prototype.map()来渲染一个数组,Array.prototype.forEach()不返回任何要渲染的东西,它只是对每个数组项应用给定的函数。
然后确保你有正确的数据从一个还原器,只是设置一个breakpoint或使用console.log看到thich数据,你试图渲染。

<ul>
  {
    participants.map(participant => (
      <li key={participant._id}>
        {participant.username}
      </li>
    ))
  }
</ul>

相关问题