一开始,应用程序始终有100条信息。
这是我处理DELETE操作的方式:
handleDelete = async post => {
const oldPosts = this.state.posts;
const posts = this.state.posts.filter(n => n.id !== post.id);
this.setState({ posts });
try {
await axios.delete(`${apiEndpoint}/${post.id}`);
console.log(oldPosts);
} catch (e) {
alert("There was an error while removing post " + post.id);
}
};
oldPosts变量包含一个用于发布状态数组的REFERENCE。如您在接下来的两行中所看到的,我正在使用较少的帖子(其中99篇)更新状态。我希望我的oldPosts参考指向此99个元素的数组。但是,在console.logged时,我看到100个元素。为什么会这样?
答案 0 :(得分:3)
const oldPosts = this.state.posts;
将对数组的引用复制到oldPost
变量中。如果this.state.posts
内部的数组被更改,您将在oldPosts
内部看到这些更改,但是如果引用本身被更改,则oldPost
和this.state.posts
指向两个不同的数组。
使用.filter
确实创建了一个新数组。
答案 1 :(得分:1)
我希望我的oldPosts引用指向此99个元素 数组。但是,在console.logged时,我看到100个元素。为什么是 那?
很好的问题,让我尝试解释。可以看到情况是,数组将存储在某个内存位置,并且this.state.posts
将引用该array
。您通过array
引用了同一oldPosts
,这意味着oldPosts
指向数组而不是this.state.posts
。
当我们更新this.state.posts
的值时,它将有一个新的引用,引用到新创建的array
,而不是旧数组。但是该oldPosts
仍将指向旧数组。
即使您分配数组以外的任何值,也不会影响oldPosts
的值。
检查此示例,您将获得一个更好的主意:
// consider this as state obj
let obj = {
posts: [1, 2, 3, 4],
}
let oldPosts = obj.posts;
let newPosts = obj.posts.filter(el => el < 4);
// same as setState
obj.posts = newPosts;
// still point to old array
console.log('oldPosts', oldPosts);
// it will have the new array
console.log('obj.posts', obj.posts);
obj.posts = 10;
// now it will have a totally new value
console.log('obj.posts', obj.posts);
再次查看此示例:
let a = [1, 2, 3, 4];
let b = a;
/*
a and b both points to same array, but if we assign a
new value to a, b will still points to array
*/
a = 10;
// by changing the value of a, it will not affect b
console.log('a', a);
// still point to array
console.log('b', b);
答案 2 :(得分:0)
您正在将100 posts
分配给oldPosts
。然后,您正在过滤posts
以获取新数组并保存状态。过滤器返回一个新数组,并且不更新实际数组,即oldPosts
。如果您想要这种行为,可以使用Array.prototype.splice
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice
答案 3 :(得分:0)
您没有更新oldPosts状态。 这应该工作
this.setState({ oldPosts : posts });
谢谢