【问题标题】:Deleting state and getting new state problem删除状态并获取新状态问题
【发布时间】:2020-10-21 17:58:28
【问题描述】:

从 React 应用程序中删除收藏夹时,它会删除该菜,但会引发错误

const favorites = props.favorites.favorites[0].dishes.map((dish), {.. TypeError: Cannot read property 'dishes' of undefined ...

重新加载应用后,它只显示剩余的未删除菜肴(正常工作)

在主组件中将 props 'favorite' 传递给最喜欢的组件

<Favorites
  favorites={this.props.favorites}
  deleteFavorite={this.props.deleteFavorite}
/>

在最喜欢的组件中检查道具结果并将道具传递给渲染菜单组件

if (props.favorites.favorites) {
  const favorites = props.favorites.favorites[0].dishes.map((dish) => {
    return (
      <div key={dish._id} className="col-12 mt-5">
        <RenderMenuItem dish={dish} deleteFavorite={props.deleteFavorite} />
      </div>
    );
  })

render menu 组件接收上面传递的 props

function RenderMenuItem({ dish, deleteFavorite }) {
  return (
    <Media tag="li">
      <Media left middle>
        <Media object src={baseUrl + dish.image} alt={dish.name} />
      </Media>
      <Media body className="ml-5">
        <Media heading>{dish.name}</Media>
        <p>{dish.description}</p>
        <Button outline color="danger" onClick={() => deleteFavorite(dish._id)}>
           <span className="fa fa-times"></span>
        </Button>
      </Media>
    </Media>
  );
}

收藏项删除的动作创建者

export const deleteFavorite = (dishId) => (dispatch) => {
const bearer = "Bearer " + localStorage.getItem("token");

return fetch(baseUrl + "favorites/" + dishId, {
  method: "DELETE",
  headers: {
    Authorization: bearer,
  },
  credentials: "same-origin",
 })
  .then(
    (response) => {
      if (response.ok) {
        return response;
      } else {
       var error = new Error(
         "Error " + response.status + ": " + response.statusText
       );
       error.response = response;
       throw error;
     }
   },
    (error) => {
      throw error;
    }
  )
   .then((response) => response.json())
   .then((favorites) => {
   // console.log("Favorite Deleted", favorites);
   dispatch(addFavorites(favorites));
  })
   .catch((error) => dispatch(favoritesFailed(error.message)));
};
     
export const favoritesLoading = () => ({
  type: ActionTypes.FAVORITES_LOADING,
}); 

export const favoritesFailed = (errmess) => ({
  type: ActionTypes.FAVORITES_FAILED,
  payload: errmess,
});

export const addFavorites = (favorites) => ({
  type: ActionTypes.ADD_FAVORITES,
  payload: favorites,
});

收藏项的减速器

import * as ActionTypes from "./ActionTypes";

export const favorites = (
  state = {
    isLoading: true,
    errMess: null,
    favorites: null,
  },
  action
) => {
  switch (action.type) {
    case ActionTypes.ADD_FAVORITES:
      return {
        ...state,
        isLoading: false,
        errMess: null,
        favorites: action.payload,
      };

    case ActionTypes.FAVORITES_LOADING:
      return { ...state, isLoading: true, errMess: null, favorites: null };

    case ActionTypes.FAVORITES_FAILED:
      return {
        ...state,
        isLoading: false,
        errMess: action.payload,
        favorites: null,
      };

    default:
      return state;
  }
};

【问题讨论】:

    标签: javascript node.js reactjs redux redux-store


    【解决方案1】:

    检查您的 REST DELETE 方法。它返回的可能与数组不同(我想是一个对象,可能是已删除的对象)。

    因此,在调用此 DELETE 之后,您正在使用它的响应,并且您正在将 redux 存储中的 favorites 设置为该响应。因为它不是一个数组,所以props.favorites.favorites[0] 没有定义任何内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-21
      相关资源
      最近更新 更多