Javascript Redux:访问当前状态-最佳实践?

Javascript Redux:访问当前状态-最佳实践?,javascript,reactjs,react-native,react-redux,flux,Javascript,Reactjs,React Native,React Redux,Flux,关于Redux,我有点不明白。我有一个可以浏览项目的应用程序。您可以转到上一个项目和下一个项目。据我所知,你不应该在你的行为中访问当前状态 关于我的应用程序,我有一个处于redux状态的数组,它保存我的项目的所有id:[“3123123123123”、“1231414151”、“15315415”等],我有一个状态块,它保存当前所选项目的(或者更好,它保存该项目的id)。现在,当用户单击nextItem时,我需要获取下一项。我的(未完成)操作如下所示: export function nextI

关于Redux,我有点不明白。我有一个可以浏览项目的应用程序。您可以转到上一个项目和下一个项目。据我所知,你不应该在你的行为中访问当前状态

关于我的应用程序,我有一个处于redux状态的数组,它保存我的项目的所有id:
[“3123123123123”、“1231414151”、“15315415”等]
,我有一个状态块,它保存当前所选项目的
(或者更好,它保存该项目的id)。现在,当用户单击nextItem时,我需要获取下一项。我的(未完成)操作如下所示:

export function nextItem(currentId) {

  //my idea:
  //take the currentId, look where in the array it is, and get the position
  //increment that position
  //get the id of the next item in the array (at position: position+1)
  //update state

  return {
    type: SET_CURRENT_ITEM,
    payload: item
  }
}

类似的情况也适用于上一个项目操作创建者。但是,我不知道如何在不访问当前状态的情况下执行此操作?理想情况下,这种情况会在哪里发生?我建议您采取以下行动:

{
    type: INCREMENT_CURRENT_ITEM
}
您可以直接从任何连接的组件中分派此文件:

dispatch({ type: INCREMENT_CURRENT_ITEM })
或者,如果您喜欢使用动作创建者,也可以:

dispatch(incrementItem()) // incrementItem() returns the action above

在reducer中,您可以访问当前状态,在该状态下,您可以增加项目索引,而不必在数组中搜索当前值。

我可能会添加一个组件,负责通过应用程序增加项目id

从“React”导入React;
从“redux”导入{bindActionCreators};
从“react redux”导入{connect};
从“./redux/actions”导入{nextItem};
const ItemNav=({nextItem,items,item})=>{
函数setNextItem(){
让currentItemID=items.indexOf(item)+1;
如果(currentItemID>=items.length-1)currentItemID=0;
nextItem(项目[currentItemID]);
}
返回(
  • 上一项
  • 下一项
); }; 常量mapStateToProps=状态=>({ 项目:state.items, 项目:state.item }); const-mapDispatchToProps=dispatch=>bindActionCreators({nextItem},dispatch); 导出默认连接( MapStateTops, mapDispatchToProps )(项目导航);
。制作人必须收到 相同类型的参数,生产者必须计算新的 状态的版本并返回它。没有意外。没有副作用。不 调用第三方API。没有变化(突变)。只有 计算新版本的状态

纯函数-在基本层次上,任何不 更改输入不依赖于外部状态(数据库、DOM) 或全局变量),并为相同的输入返回相同的结果 数据作为一个纯函数

此外,如果值位于不同的减速器中,该怎么办

动作创建者-也是纯函数,为了计算,我们必须 从存储区接收数据

组件-在组件错误实践中使用业务逻辑

保留中间件,为了不产生太多中间件,最好 使用redux thunk

此外,还有一个类似问题的链接:

以及与第一个发现的实现这种情况的项目的链接:

实际上,action creator不应该做任何事情。它应该由减速器完成,减速器具有当前状态的参考。操作应该类似于“SET_NEXT_ITEM”,您可以在redux上存储当前项目的索引item@JoaozitoPolo我可以这样做,但这是否意味着在我的状态中引入冗余,因为我可以通过检查数组中的何处找到所需id来推导/计算索引?@R.Kohlisch我同意。。。我也不喜欢“索引”的想法。。。您可以使用.findIndex()在渲染时或在函数中查找索引
在reducer中,您可以访问当前状态,在该状态下,您可以增加项目索引
——但我只能访问部分状态。在我的例子中,我需要访问另一个减缩器的状态,以便获得下一个id。我该如何做?@R.Kohlisch在看不到a的情况下,很难给出任何具体的建议,但听起来您可能想重新构造减缩器,并决定是否存储项id或索引,而不是同时存储两者。
import React from "react";
import { bindActionCreators } from "redux";
import { connect } from "react-redux";
import { nextItem } from "../redux/actions";

const ItemNav = ({ nextItem, items, item }) => {

  function setNextItem() {
    let currentItemID = items.indexOf(item) + 1;
    if (currentItemID >= items.length - 1) currentItemID = 0;
    nextItem(items[currentItemID]);
  }

  return (
    <ul>
      <li>previous item</li>
      <li onClick={setNextItem}>next item</li>
    </ul>
  );
};

const mapStateToProps = state => ({
  items: state.items,
  item: state.item
});

const mapDispatchToProps = dispatch => bindActionCreators({ nextItem },dispatch);

export default connect(
  mapStateToProps,
  mapDispatchToProps
)(ItemNav);