You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React+Firebase项目如何在Redux state中动态生成评论对象顺序键名

动态生成顺序键的实现方法

你只需要先计算当前comments_text里已存在的最大数字键,加1后作为新的键名即可,利用JS对象的动态属性名语法(用方括号包裹变量作为键)替换硬编码的comment即可,修改后的Redux reducer代码如下:

case HOLD_COMMENT_POST:
{
  const { postUserId, postId, commenter_comment, commenter_handle, commenter_uid, comment_key } = action.payload;

  return state.map((user) => {
    if (user.uid === postUserId) {
      return {
        ...user,
        posts: user.posts.map(post => {
          if (post.key === postId) {
            // 计算新的顺序键
            let newCommentKey = '0';
            if (post.comments_text) {
              // 提取所有数字键,过滤非法值
              const numKeys = Object.keys(post.comments_text)
                .map(key => parseInt(key, 10))
                .filter(key => !isNaN(key));
              // 取最大键+1作为新键
              const maxKey = numKeys.length ? Math.max(...numKeys) : -1;
              newCommentKey = String(maxKey + 1);
            }

            return {
              ...post,
              // 用动态键替换硬编码的comment
              comments_text: post.comments_text ? 
                {...post.comments_text, [newCommentKey]: {commenter_comment, commenter_handle, commenter_uid, key: comment_key}} 
                : {[newCommentKey]: {comment: commenter_comment, handle: commenter_handle, uid: commenter_uid, key: comment_key}}
            };
          } else {
            return post;
          }
        })
      }
    }
    else {
      return user;
    }
  })
}

能不能保留现有硬编码写法?

绝对不建议保留,现有写法存在隐藏bug:你在不刷新页面的前提下连续新增多条评论时,所有新评论都会覆盖同一个comment键的内容,只会保留最后一条新增的评论,只是你现在每次刷新后Firebase会重置键名,才没暴露问题而已,实际生产环境用户不会每加一条评论就刷新页面,必然会触发这个bug。

额外注意

如果你用的是Firebase Realtime Database,顺序数字键在多用户并发提交评论时容易出现键冲突,有条件的话更建议用Firebase自带的push()方法生成唯一键,不过如果你需要和现有刷新后的数字键逻辑保持一致,用上面的方案就可以满足需求。

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 07:57:04