React CRUD项目中如何让新增帖子渲染在列表顶部
问题原因
你当前的逻辑是调用数组的push方法将新帖子追加到状态数组末尾,渲染时按数组正序遍历,因此新增帖子会出现在列表底部。
解决方案
有两种常用实现方式,推荐优先修改数据层逻辑保证状态顺序符合预期:
方案1:修改Redux Slice的新增逻辑(推荐)
修改postslice.js中的addPost reducer,将追加到数组末尾的push方法改为插入到数组开头的unshift方法:
import { createSlice } from "@reduxjs/toolkit"; const postsSlice = createSlice({ name: "posts", initialState: [], reducers: { // add one post to the array. addPost: (state, action) => { state.unshift(action.payload); // 新帖子插入数组开头 }, // replace the entire array. replacePosts: (state, action) => action.payload } }); export default postsSlice
Redux Toolkit内置Immer支持直接修改draft状态,unshift方法可以安全使用。
方案2:渲染时倒序遍历数组(无需修改状态)
如果不想改动Redux逻辑,可以在渲染时对帖子数组做倒序处理,注意先拷贝数组再调用reverse避免修改原状态:
修改MainScreen组件中帖子渲染部分的代码:
{posts.slice().reverse().map((post) => ( <div className="boxPost"> <div className="bar"> <h1>{post.title}</h1> <MdDeleteForever className="icon" onClick={() => { setOpenModal(true); }} /> <FiEdit style={{ color: "white", fontSize: "45px", paddingLeft: "23px" }} /> </div> <div id="postowner"> <h3>@{user}</h3> <h3>25 minutes ago</h3> <br></br> <textarea style={{ border: "none" }}>{post.content}</textarea> </div> </div> ))}
slice()不传参会浅拷贝整个帖子数组,避免reverse原位修改Redux中的原始状态数组。
额外优化建议
建议在新增帖子时同步添加createdAt时间戳字段,后续如果需要从服务端拉取历史帖子,也可以统一按时间戳排序保证顺序正确。
内容的提问来源于stack exchange,提问作者Heitor Kenzou
相关产品推荐
相关产品推荐

