Javascript 当redux中的状态更改时,存储在变量中的先前状态也会更改
我正在尝试为帖子实现喜欢和不喜欢的功能 当用户喜欢/不喜欢post并向服务器发送请求时,我更改了状态,若请求失败,我将状态更改为以前的状态。但是以前的州变成了新的州,我不知道为什么Javascript 当redux中的状态更改时,存储在变量中的先前状态也会更改,javascript,reactjs,react-native,redux,redux-thunk,Javascript,Reactjs,React Native,Redux,Redux Thunk,我正在尝试为帖子实现喜欢和不喜欢的功能 当用户喜欢/不喜欢post并向服务器发送请求时,我更改了状态,若请求失败,我将状态更改为以前的状态。但是以前的州变成了新的州,我不知道为什么 export const dislikepostation=( posted:string, ):ThunkAction=>{ 返回异步(dispatch:ThunkDispatch,getState):Promise=>{ console.log(getState().GroupPosts.posts);//甚至这
export const dislikepostation=(
posted:string,
):ThunkAction=>{
返回异步(dispatch:ThunkDispatch,getState):Promise=>{
console.log(getState().GroupPosts.posts);//甚至这里还有新状态
const prevState=getState().GroupPosts.posts;
console.log(prevState);
const newState=prevState.map(项=>{
如果(item.postId==postId){
const newPost=项目;
if(newPost.currentUserLike==UserPostLike.Loke){
newPost.likeCount=item.likeCount+1;
newPost.currentUserLike=UserPostLike.NO_动作;
}否则{
newPost.likeCount=item.likeCount-1;
newPost.currentUserLike=UserPostLike.Loke;
}
返回newPost;
}否则{
退货项目;
}
});
console.log(prevState);
调度(设置邮政(新闻状态));
常量响应=等待PostsApi.dislikePost(postId);
如果(!response.success){
console.log(prevState);//此处的prev state与newState相同
调度(设置站(prevState));
}
};
};
我正在将
redux
与redux thunk一起使用redux
,因为您正在将newState
分配给prevState
,而不是对其进行变异,因此它将引用内存中prevState
的地址,并且它将更改prevState
,相反,您应该通过变异来创建一个新的Obj或数组prevState
像这样:
如果阵列:
const prevState =[... getState().GroupPosts.posts];
如果对象:
const prevState ={... getState().GroupPosts.posts};
或者您可以使用Object.assign()
,它将创建一个新对象,而不引用内存中的prevState
地址。我使用新帖子(项目)
创建新的对象,并解决了问题
const newPost = new Post(item)
您正在操作中改变状态。@HMR我将newState
存储到新变量中。我想您在理解JavaScript中的对象引用时有困难:newPost=item
意味着newPost和item都指向同一个对象,所以newPost.likeCount=item.likeCount+1
变异newPost,但由于它指向与item相同的引用,它也变异item,所以您可以尝试constnewpost={…item}
将newPost设置为项目的浅层副本。也许可以help@HMR我这样做了,但是我得到了他们类型的typescript错误。我把它改成了新的帖子(项目)
,现在可以了。tnx。