Javascript Redux:访问当前状态-最佳实践?
关于Redux,我有点不明白。我有一个可以浏览项目的应用程序。您可以转到上一个项目和下一个项目。据我所知,你不应该在你的行为中访问当前状态 关于我的应用程序,我有一个处于redux状态的数组,它保存我的项目的所有id: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
[“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);