javascript - 在 React/Redux 中,如何在 componentDidMount 中调用相同的 fetch 两次,并使用结果设置 2 个状态变量

标签 javascript reactjs redux react-redux

标题很罗嗦,但是一个简短/简单的例子将有助于解释我的问题。我对组件进行了以下启动:

import React, { Component } from 'react';
import { connect } from 'react-redux';

import { fetchGames } from '../../path-to-action';

class TeamsApp extends Component {
    constructor(props) {
        super(props);
        this.state = {
            oldGames: [],
            newGames: []
        };
    }

    componentDidMount() {
        this.props.dispatch(fetchGames('1617'));
        this.setState({ oldGames: this.props.teamGameData });
        this.props.dispatch(fetchGames('1718'));
        this.setState({ newGames: this.props.teamGameData });
    }

    ...
    ...
}

function mapStateToProps(reduxState) {
    return {
        teamGameData: reduxState.GamesReducer.sportsData
    };
}

export default connect(mapStateToProps)(TeamsApp);

我想要与 fetchGames() 对应的操作/ reducer 和gamesReducer当组件安装时被调用两次。这个 Action / reducer 获取一些体育数据,我正在尝试获取两个不同赛季(“1617”赛季和“1718”赛季)的数据。 fetchGames()已正确构建以处理季节参数。

在当前设置中,未设置状态,并且我的 linter 抛出错误 Do not use setState in componentDidMount .

我可以将回调传递给 this.props.dispatch 来获取 fetchGames() 的结果吗? (teamGameData 属性),并将 oldGames/newGames 状态设置为等于该对象?

如有任何帮助,我们将不胜感激!

编辑:如果我只是删除 this.setState(),那么我的 teamGameData prop 只是被第二个 this.props.dispatch() 覆盖打电话...

编辑 2:我完全不能 100% 确定拥有 2 个状态变量(oldGames、newGames)是否是最好的方法。我只需要在组件加载时调用 this.props.dispatch(fetchGames('seasonid')) 两次,并将结果作为组件其余部分可以使用的两个单独的对象。

编辑3:我的操作有以下部分:

export const fetchSportsDataSuccess = (sportsData, season) => ({
    type: FETCH_NBA_TEAM_GAME_SUCCESS,
    payload: { sportsData, season }
});

以及我的 reducer 中的以下情况:

case FETCH_NBA_TEAM_GAME_SUCCESS:
console.log('payload', action.payload);
return {
    ...state,
    loading: false,
    sportsData: action.payload.sportsData
};

console.log() 现在看起来像这样:

payload
{ sportsData: Array(2624), season: "1718" }

但我不知道如何使用季节 ID 在包含本季节数据的返回中创建键......

编辑 4:找到编辑 3 的解决方案 - Use a variable as an object key in reducer - 感谢大家对此的帮助,应该可以从这里获取!

最佳答案

将数据从 redux 存储复制到组件状态是一种反模式

相反,您应该修改您的 redux 存储,例如使用对象来存储数据,这样您就可以存储多个季节的数据:

sportsData: {
    '1617': { ... },
    '1718': { ... },
}

这样您就可以同时获取两个季节:

 componentDidMount() {
    const seasons = ['1718', '1617'];
    const promises = seasons.map(fetchGames);
    Promise.all(promises).catch(…);
}

并将它们连接起来:

// you can use props here too
const mapStateToProps = (reduxState, props) => ({
    // hardcoded like you did
    oldGames: reduxState.GamesReducer.sportsData['1617'],
    // or using some props value, why not
    newGames: reduxState.GamesReducer.sportsData[props.newSeason],
};

或者照常连接商店并获取 key :

const mapStateToProps = (reduxState, props) => ({
    games: reduxState.GamesReducer.sportsData,
};
…
render() {
  const oldGame = this.props.games[1718];
  const newGame = this.props.games[1718];
  …
}

Redux 是您的单一事实来源,始终找到一种方法将您需要的所有内容放入 Redux,而不是在组件中复制数据

关于javascript - 在 React/Redux 中,如何在 componentDidMount 中调用相同的 fetch 两次,并使用结果设置 2 个状态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53035470/

相关文章:

javascript - 将react的UI中的数据以文件的形式保存

javascript - 将 react native 侧菜单添加到我的应用程序(来自 react native 元素) - 应用程序在启动时崩溃

reactjs - React Redux Connect DefaultRootState 类型

javascript - 在 Angular2 中的 router.navigate 之后执行代码

javascript - 过滤所有属性和属性值

javascript - 填充选择菜单 onChange

javascript - 嵌套 Promise : Creating N promises based on array

javascript - 对 OnSubmit 感到困惑

javascript - react Redux 未捕获错误 : Expected the reducer to be a function

javascript - Rxjs 递归与 bindcallback