arrays - Redux、React、MapStateToProps : Retrieve a specific element in an array from the redux state tree

标签 arrays reactjs redux

我在 redux 状态树中有一个名为“leagues”的 reducer,它只是一个单独的联赛对象数组。每个联赛都有一个唯一的 ID(在后端分配)和一个名称。

我正在尝试编写一个代表单个联赛的组件,因此我想要一个 mapStateToProps 函数来检索正确的联赛。正确的联赛是从 url 中获知的,即通过 react-router-v4 中的 match Prop 。

我试过:

function mapStateToProps(state, ownProps) {
    return {
        league: state.leagues.find(aLeague => aLeague.id === ownProps.match.params.id)
    }
}

但这导致错误“state.leagues.find”不是函数。

然后我试了一下

function mapStateToProps(state, ownProps) {
    return {
        league: state.leagues[ownProps.match.params.id]
    }
}

这不会出错,但会检索到错误的联赛 - 如果 id 为 3,则检索 state.leagues[3],而不是 state.leagues.where(league.id === 3)

当我尝试访问单个联赛的页面时联赛的值(value):

leagues: [
    {
      id: 54,
      name: 'Test League'
    },
    {
      id: 55,
      name: 'Another Test'
    }
  ],

以及联盟 reducer 代码:

const initialState = {
  leagues: []
};

export default (state = initialState, action = {}) => {
  switch(action.type) {
    case SET_USER_LEAGUES:
      return state = action.leagues
    case ADD_USER_LEAGUE:
    return [
      ...state,
      {
        id: action.league.id,
        name: action.league.name,
      }
    ];
    default: return state;
  }
}

非常感谢任何帮助。 谢谢!

最佳答案

这是因为当 redux store 被初始化时,你很可能将初始状态设置为 null 这就是为什么你得到错误 state.leagues.find is not一个函数,一旦通过异步 ajax 调用解决了状态,那么状态就在那里。我建议在像 componentDidMount 这样的 React 生命周期方法中制作这种逻辑,并在联盟状态可用后为联盟设置状态。像这样:

componentDidMount() {
  const { leagues } = this.state;
  if (leagues && leagues.length > 0) {
    // update the state to the correct league here and this.props.id is the id that you want
    const league = leagues.find(aLeague => aLeague.id === this.props.id);
    this.setState({
      league
    }
  }
}

希望对您有所帮助。

关于arrays - Redux、React、MapStateToProps : Retrieve a specific element in an array from the redux state tree,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49240416/

相关文章:

node.js - 如何用 fetch api 正确替换 axios api 并映射到 nodeJS 中接收到的数据?

javascript - NPM 错误 : EINTEGRITY: Integrity checksum failed using sha 512

javascript - Uncaught Error : A state mutation was detected between dispatches

javascript - 学习了react和redux之后,我们还需要在组件中声明状态吗?

python - numpy 数组,a/= x 与 a = a/x 之间的区别

Java多态处理: Incorrect output?

java - MVC - 使用 Java 中的 Swing/Graphics 设计和显示数组

ios - 你如何在 Swift 中解析字典数组?

input - React — 内联 onfocus 占位符 = ''

Angular NGRX - 为 Redux-Devtools 命名商店/应用程序实例