Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当redux中的状态更改时,存储在变量中的先前状态也会更改_Javascript_Reactjs_React Native_Redux_Redux Thunk - Fatal编程技术网

Javascript 当redux中的状态更改时,存储在变量中的先前状态也会更改

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);//甚至这

我正在尝试为帖子实现喜欢和不喜欢的功能

当用户喜欢/不喜欢post并向服务器发送请求时,我更改了状态,若请求失败,我将状态更改为以前的状态。但是以前的州变成了新的州,我不知道为什么

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。