首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeError: bookmarks.map不是一个函数

TypeError: bookmarks.map不是一个函数
EN

Stack Overflow用户
提问于 2021-08-03 13:19:29
回答 1查看 144关注 0票数 1

我正在开发一个React应用程序,我正在使用Redux来管理状态。我有以下代码:

reducer.js

代码语言:javascript
复制
import { actionTypes } from "./actionsTypes";

const initialState = {
  items: [],
  loading: false,
  error: null,
  bookmarks: [],
  hidden: false,
  basket: [],
};

const productReducer = (state = initialState, action) => {
  switch (action.type) {
    case actionTypes.FETCH_PRODUCTS_BEGIN:
      return {
        ...state,
        loading: true,
        error: null,
      };

    case actionTypes.FETCH_PRODUCTS_SUCCESS:
      return {
        ...state,
        loading: false,
        items: action.payload,
      };

    case actionTypes.FETCH_PRODUCTS_FAILURE:
      return {
        ...state,
        loading: false,
        error: action.payload,
        items: [],
      };

    case actionTypes.ADD_TO_BOOKMARK:
      return {
        ...state,
        bookmarks: [...state.bookmarks, action.payload],
      };

    case actionTypes.ADD_TO_BASKET:
      return {
        ...state,
        basket: [...state.basket, action.payload],
      };

    case actionTypes.TOGGLE_HIDDEN:
      return {
        ...state,
        hidden: !state.hidden,
      };

    default:
      return state;
  }
};

export default productReducer;

actions.js

代码语言:javascript
复制
import axios from "axios";
import { actionTypes } from "./actionsTypes";

..
...
...

export const addToBookmarks = (item) => ({
  type: actionTypes.ADD_TO_BOOKMARK,
  payload: item,
});

export const addToBasket = (product) => ({
  type: actionTypes.ADD_TO_BASKET,
  payload: product,
});

axios.defaults.baseURL = "https://fakestoreapi.com";

export const fetchProducts = () => {
  return (dispatch) => {
    dispatch(fetchProductsBegin());
    try {
      return axios
        .get("https://fakestoreapi.com/Products")
        .then(({ data }) => dispatch(fetchProductsSuccess(data)));
    } catch (error) {
      dispatch(fetchProductsFailure(error));
    }
  };
};

selectors.js

代码语言:javascript
复制
import { createSelector } from "reselect";

export const selectItems = (state) => state.products; 
export const selectBookmarksProducts = createSelector(
[selectItems],
(shop) => shop.bookmarks
); 

对于我的还原器函数,初始状态(项)是从api.检索数据的。

Product.js

代码语言:javascript
复制
const Product = ({ product, toggleHidden, addToBookmarks, addToBasket }) => {
  const { title, category, description, image, price } = product || {};    
  return (
    <div className="relative">
     ....
     .....
      <HeartIcon
        className={`absolute top-2 right-4 w-8 cursor-pointer ${
          bookmark ? "text-red-500" : "text-gray-500"
        }`}
        onClick={() => addToBookmarks(product)}
      />
      <CustomButton onClick={() => addToBasket(product)}>
        Add to Basket
      </CustomButton>
    </div>
  );
};

export const mapDispatchToProps = (dispatch) => ({
  addToBookmarks: (item) => dispatch(addToBookmarks(item)),
  toggleHidden: () => dispatch(toggleHidden()),
  addToBasket: (item) => dispatch(addToBasket(item)),
});

export default connect(null, mapDispatchToProps)(Product);

注意:我发送了一个操作addToBookmarks,然后将产品作为一个对象传递,我想在bookmarksPage中获取书签产品--我不知道为什么会出现错误TypeError: state.bookmarks是不可迭代的

有人能帮忙吗?

EN

回答 1

Stack Overflow用户

发布于 2021-08-03 13:35:28

我相信跟随改变会解决这个问题。

代码语言:javascript
复制
case actionTypes.ADD_TO_BOOKMARK:
{
      const bookmarks = state.bookmarks;
      bookmarks.push(action.payload);
      return {
        ...state,
        bookmarks,
      };
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68636802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档