从数组中删除 1 个元素时,map 函数仅删除反应中的最后一个元素

On removing 1 element from array, map function removes only last element in react

我正在从后端获取一组帖子并映射到该数组以显示帖子。但是当我删除任何一个元素并将其再次设置为 useState 时,它​​只会呈现除最后一个元素之外的所有元素。但是当我刷新页面时,它显示了应该在不刷新页面的情况下呈现的实际数组。

function Feed() {

   const [posts, setPosts] = React.useState(null);
   const [error, setError] = React.useState(false);
   const [isLoading, setIsLoading] = React.useState(true);
   const [refresh, setRefresh] = React.useState(false);

   const {user} = isAuthenticated();

   const loadPosts = () => {
          setIsLoading(true);
          getPosts()
          .then(data => {
                 if(data.error)
                        setError(error)
                 else {
                        console.log(data);
                        setPosts(data);
                        setIsLoading(false);
                 }
          })
          .catch(err => console.log(err))
   }

   React.useEffect(() => {
          loadPosts();
          console.log(posts); //here it logs actual posts array with the right element removed but it doesn't render the same array 
   }, [refresh]);

   React.useEffect(() => {
          loadPosts();
   }, []);

   return (
          <div>
                 <Header />
                        <div className="container">
                               <div className="row">
                                      <div className="col-8 mx-auto">
                                             
                                             <div><Link to={`/user/${user._id}/post/create`}><button className="btn btn-purple rounded-3 col-12 p-3 mx-auto mt-4 mb-5 fw-bold" type="submit"><i class="fas fa-plus"></i><strong>  New Post</strong></button></Link></div>

                                             {posts && (posts.map((post, index) => {
                                                    return <Post postId={post._id} key={index} setRefresh={setRefresh} refresh={refresh} />
                                             }))}

                                      </div>
                               </div>
                        </div>
                 <Footer />
          </div>
   );
}

export default Feed;

数组正在更新,当一个元素被删除但在渲染时,它只是删除最后一个元素,而不是删除一个。

[1]: https://i.stack.imgur.com/6x9eS.png [删除 1 个元素之前][1]

[1]: https://i.stack.imgur.com/zPUnb.png [删除第一个元素后,仅在渲染中删除最后一个元素。在数组中,它删除了第一个。][1]

这就是你 don't use array indexes for element keys if the array can ever change 的原因。 :-) key 的目的是告诉 React 它可以重用哪些元素。如果您使用索引 1(例如)作为元素 A 的键,然后删除索引 01 处的元素,则下次您使用索引 1 作为键,它位于 different 元素(元素 B)上。相反,使用 post Id(我假设它是 post 所独有的):

return <Post postId={post._id} key={post._id} setRefresh={setRefresh} refresh={refresh} />