我是新手.我遇到的问题是:

第一次加载文章页面时,一切正常,显示10篇文章.当我点击浏览器后退按钮,然后第二次进入文章页面时,文章列表将被复制(因此,它将是20篇文章).如果我再这样做,它将是30篇文章等等..

我想知道,为什么API调用的结果附加了Redux而不是replace?换句话说,我如何每次在页面加载时清理Redux?预期的结果是,当我打开Article页时,总是能看到10个条目(文章).


以下是主页中元素的简化版本(用于导航到文章列表):

import Pages from "Constants/Pages";

const Component = () => {

    const history = useHistory();
    const navigateWithToken = (page) => {
        history.push(page);
      }
    };
    
    return (
        <div className="d-flex align-items-center flex-column py-1 ">
          <div
            className="main-footer-btn-article"
            onClick={() => navigateWithToken(Pages.Articles)}
          ></div>
          <span className="main-footer-btn-text">Articles</span>
        </div>
    )
};

export const ArticlesBtn = memo(Component);

此外,这是Article页:

import { memo, useEffect } from "react";
import { useHistory } from "react-router-dom";
import { useSelector, useDispatch } from "react-redux";

import PostItems from "SharedComponents/PostItems";
import { getAllPosts } from "Redux/Actions";
import Pages from "Constants/Pages";

const Page = () => {
  const posts = useSelector((state) => state?.articles?.posts?.items);
  const dispatch = useDispatch();
  const { push } = useHistory();
  useEffect(() => {
    dispatch(getAllPosts());
  }, []);

  const onClickPost = (item) => {
    push({
      pathname: Pages.SingleArticle,
      state: {
        postId: item.id,
        title: item.subject,
        is_saved: item.is_saved,
      },
    });
  };

  return (
    <div className="full-height overflow-auto">
      { 
        posts?.map((item, index) => {
          return (
            <PostItems
              {...item}
              key={item.id}
              index={index}
              onClickPost={() => onClickPost(item)}
            />
          );
        })
      }
    </div>
  );
};

export default memo(Page);

这里还有API调用:

const getAllPosts = (page = 1) => {
  return async (dispatch: ReduxDispatch) => {
    //"posts?for=for_website"
    dispatch(toggleLoading(true));
    try {
      const { data } = await axios({
        method: "GET",
        url: "posts?for=for_mobile",
        params: { page: page },
      });
      const items = data?.data?.data;
      const pagination = {
        current_page: data.data.current_page,
        last_page: data.data.last_page,
      };
      dispatch(
        dispatchItemToRedux({
          type: ReducerTypes.GET_ALL_POSTS,
          payload: {
            items,
            pagination,
          },
        })
      );
    } catch (err) {
      return Promise.reject(err);
    } finally {
      dispatch(toggleLoading(false));
    }
  };
};

此外,这是减速器:

import ReducerTypes from "Redux/Types/ReducerTypes";

const INITIAL_STATE = {
    posts: {
        items: [],
        pagination: {}
    },
    singlePost: {
        id: null,
        subject: null,
        caption: null,
        deep_link: null,
        short_link: null,
        total_comments: null,
        total_likes: null,
        total_views: null,
        created: null,
        medias: null,
        likes: [] 
    },
    postComments: []
};

function articleReducer(state = INITIAL_STATE, action) {
    switch (action.type) {
        case ReducerTypes.GET_ALL_POSTS:
            return {
                ...state,
                posts: {
                    items: state.posts.items.concat(action.payload.items),
                    pagination: action.payload.pagination
                }
            };
        case ReducerTypes.GET_SINGLE_POST:
            return {
                ...state,
                singlePost: action.payload
            };
        case ReducerTypes.GET_POST_COMMENTS:
            return {
                ...state,
                postComments: action.payload
            };
        case ReducerTypes.GET_POST_LIKES:
            return {
                ...state,
                singlePost: {
                    ...state.singlePost,
                    likes: action.payload
                }
            };
        default:
            return state;
    };
};
export default articleReducer;

推荐答案

case ReducerTypes.GET_ALL_POSTS:
            return {
                ...state,
                posts: {
                    items: action.payload.items,
                    pagination: action.payload.pagination
                }
            };

试着忽略这个.concat()

Javascript相关问答推荐

二维数组,过滤并返回带有索引而不是值的新数组

在JavaScript中逐一播放随机生成的音频文件数组

如何在alpinejs中显示dev中x-for的元素

我无法在NightWatch.js测试中获取完整的Chrome浏览器控制台日志(log)

在贝塞尔曲线的直线上找不到交叉点:(使用@Pomax的bezier.js)

我试图实现用户验证的reduxstore 和操作中出了什么问题?

IMDB使用 puppeteer 加载更多按钮(nodejs)

扫描qr code后出错whatter—web.js

如何为我的astro页面中的相同组件自动创建不同的内容?

为什么123[';toString';].long返回1?

如何将innerHTML字符串修剪为其中的特定元素?

在Matter.js中添加从点A到另一个约束的约束

从另一个数组中的对应行/键值对更新数组中的键值对对象

当标题被点击时,如何使内容出现在另一个div上?

如何使用<;Link>;执行与JS Reaction中的";window.Location=/GameOverDied;";类似的操作?

Node.js错误: node 不可单击或不是元素

如何根据查询结果重新排列日期

Reaction即使在重新呈现后也会在方法内部保留局部值

JavaScript&;Reaction-如何避免在不使用字典/对象的情况下出现地狱?

我在哪里添加过滤器值到这个函数?