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

Redux Thunk无法从API删除书籍问题求助

书店应用删除书籍失效问题修复方案

问题根源

删除操作仅更新了前端状态,未成功触发API的后端删除逻辑,导致页面刷新后数据恢复。

代码错误点及修复

1. 组件删除参数传递错误

Book组件中点击按钮时传递的是{item_id}对象,但deleteBooks thunk需要的是字符串类型的书籍ID,导致API请求URL错误(变成BOOK_URL/[object Object])。

错误代码:

onClick={() => deleteHandler({item_id})}

修复后:

onClick={() => deleteHandler(item_id)}

2. DELETE请求冗余参数

根据Bookstore API规则,DELETE请求无需在body中传递item_id(ID已包含在URL路径中),多余的body会导致API拒绝处理。

错误代码:

const response = await fetch(`${BOOK_URL}/${bookId}`,  {
 method: 'DELETE',
  body: JSON.stringify({
    item_id: bookId
  }),
  headers: {
    'Content-Type': 'application/json',
  },
});

修复后:

const response = await fetch(`${BOOK_URL}/${bookId}`,  {
 method: 'DELETE',
  headers: {
    'Content-Type': 'application/json',
  },
});

3. Thunk中状态更新逻辑错误

removeBook action需要接收含item_id的对象,但当前传递的是字符串ID,同时应确保API请求成功后再更新前端状态,避免请求失败时错误删除UI数据。

错误代码:

export const deleteBooks = createAsyncThunk(REMOVE, async (bookId, thunkAPI) => {
  const response = await fetch(`${BOOK_URL}/${bookId}`,  {
   method: 'DELETE',
    body: JSON.stringify({
      item_id: bookId
    }),
    headers: {
      'Content-Type': 'application/json',
    },
  });
  await thunkAPI.dispatch(removeBook(bookId));
  return response.data;
});

修复后:

export const deleteBooks = createAsyncThunk('books/delete', async (bookId, thunkAPI) => {
  const response = await fetch(`${BOOK_URL}/${bookId}`, {
    method: 'DELETE',
    headers: {
      'Content-Type': 'application/json',
    },
  });

  if (!response.ok) {
    throw new Error('删除书籍失败');
  }

  thunkAPI.dispatch(removeBook({ item_id: bookId }));
  return bookId;
});

4. 可选:统一AsyncThunk状态更新

建议直接监听createAsyncThunk生成的fulfilled action来更新状态,替代手动dispatchremoveBook,让逻辑更清晰:

const bookReducer = (state = initialState, action) => {
  switch (action.type) {
    case ADD:
      return [...state, action.book];
    case FETCH_BOOKS: {
      const bookList = [];
      Object.entries(action.books).forEach(([key, value]) => bookList.push({
        item_id: key,
        title: value[0].title,
        author: value[0].author,
        category: value[0].category,
      }));
      return bookList;
    }
    case deleteBooks.fulfilled:
      return state.filter(book => book.item_id !== action.payload);
    default:
      return state;
  }
};

验证步骤

修复完成后,点击删除按钮:

  • 检查浏览器网络请求,确认DELETE请求URL正确且返回成功状态码
  • 刷新页面,确认对应书籍已从API中移除

内容的提问来源于stack exchange,提问作者David Daniel Zambrano Corral

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 10:40:43