繁体   English   中英

React - 使用 Redux 状态填充第一个选择选项

[英]React - Populating First Select Option with Redux State

我有组件League.js ,其中有 4 个包含联赛球队详细信息的框。

球队详细信息来自此 API => https://www.api-football.com/demo/api/v2/teams/league/${id}

当我点击每个联赛框时,我会在我的组件Details.js填充下拉Details.js

我不会得到team_id一线队的下拉只要我在每个联赛框中单击League.js为了有一个名为组件正确计算Stat.js 为此,我向该端点发出呼叫请求 => https://www.api-football.com/demo/api/v2/statistics/${league}/${team}

所以我需要将league_idteam_id作为参数传递,我可以正确获取这两个值,但是我在如何为每个联赛传递团队的第一个team_id了。

这些是步骤,我只放了相关的代码。 我正在创建我正在调度的firstTeamStats状态

在我的行动中 => index.js

export const RECEIVE_FIRST_TEAM_STATS = "RECEIVE_FIRST_TEAM_STATS";

export const receivedFirstTeamStats = json => ({
  type: RECEIVE_FIRST_TEAM_STATS,
  json: json
});



.get(`https://www.api-football.com/demo/api/v2/teams/league/${id}`)
.then(res => {
  let teams = res.data.api.teams;
  dispatch(receivedFirstTeamStats(teams[0].team_id));
})

在我的reducer => index.js

case RECEIVE_FIRST_TEAM_STATS:
  return {
    ...state,
    firstTeamStats: action.json,
    isTeamsDetailLoading: false
  };

在我的 League.js 组件中

import {getTeamsStats} from "../actions";

const mapStateToProps = state => ({
  firstTeamStats: state.firstTeamStats
});

const mapDispatchToProps = {
  getStats: getTeamsStats,
};

const onClick = (evt, id, firstTeamStats) => {
  evt.preventDefault();
  getDetail(id); \\  get the team names in the Detail.js component
  getStats(id, firstTeamStats); \\ get the state value for the first team in the dropdown in Detail.js component
};

<a href={`#${item.league_id}`} onClick={(e) => onClick(e, item.league_id, firstTeamStats)}

现在,上面的onclick方法中的firstTeamStats正确返回了第一支球队状态值,但是是现有联赛的值,而不是我点击的那个是我想要的。

但是,我可以在Details.js组件中正确获取此信息,我已将{firstTeamStats}放在演示中,在那里我复制了我的案例 => https://codesandbox.io/s/romantic-solomon-6e0sb (使用 CORS Unblock Chrome 扩展程序查看)

所以问题是,我怎样才能在League.js中的onclick方法中正确传递{firstTeamStats}到请求getStats(id, firstTeamStats)其中{firstTeamStats}是我的联盟第一个team_id的状态?

每当您进行 API 调用时,它都是一个异步事件。 在下一行使用它的响应之前,您应该始终等待。

因此,在getDetail() ,您正在进行 API 调用。 但是您尚未将此方法声明为异步方法。 所以你不用等待它完成,在下一行你用旧数据调用getStats()方法。 这就是为什么您的应用程序将始终比 DOM 事件落后一步的原因。

  • 一种方法是使用async|await并从函数返回 API 响应,而不是使用 dispatch。

  • 您还可以在获取 api 响应后调用getTeamsStats()getTeamsDetailById() ,而不是在OnClick()事件中调用它。

const onClick = (evt, id, firstTeamStats) => { evt.preventDefault(); getDetail(id); \\\\ this is an async api call. you should have used await here. getStats(id, firstTeamStats); \\\\ It will execute before the new stats are fetched };

在 Stats.js 中,您不应该严格验证这些字段以显示统计信息……这些只是数字……有时也可以是0 所以请删除这些检查。

if (
     teamsStatsWinHome &&
     teamsStatsWinAway &&
     teamsStatsDrawHome &&
     teamsStatsDrawAway &&
     teamsStatsLoseHome &&
     teamsStatsLoseAway
   ) {

我有你的应用程序的一个工作实例......检查下面。 https://codesandbox.io/s/charming-dewdney-zke2t

有什么需要的话请告诉我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM