正确的代码流程:调度动作并阻止,或者如果调度它们则提前验证?

2024-03-18

这是我前端开发自学一年后在Stackoverflow上的第一个问题。我已经为我的疑问找到了答案,但由于这些问题第三次出现,我认为现在是向网络提问的时候了。

我正在尝试构建什么

我正在尝试建立一个图书馆服务,访客用户可以登录、预订书籍、添加到愿望清单、归还等。对于我正在使用的前端react, react-router, react-bootstrap and redux-toolkit。由于我对后端还不了解,因此我使用以下方式获取数据json-server,它监视一个简单的数据库,其中有两个大对象:users和书catalogue.

我认为应用程序流程

代码中有一个<Catalogue />组件,它将请求发送到json-server' to get the data (with 使用效果), which is stored in the state. When data is fetched, it renders ` 组件,带有必要的信息和两个按钮。其中一个是打算预订一本书。保留按钮背后的逻辑是:

  • verify IF当前用户不是管理员
  • verify IF当前用户已经预订了这本书
  • verify IF数据库中至少有一本要保留的书

仅当一切正常时,代码才会调度使用创建的操作createAsyncThunk in catalogueSlice。在这个 thunk 中,它从数据库中删除了这本书的副本,并将结果传递给extrareducers更新状态。该handleClick函数是async并等待此操作结束。操作完成后,代码将分派另一个操作,即使用以下命令创建的操作createAsyncThunk in userSlice,它更新数据库,将该书添加到该用户的当前预订中,并且像其他 thunk 一样,将结果传递给状态,并更新用户的状态。

我的疑惑和疑问

我的主要问题

  1. 上述用于验证用户、当前预订以及数据库中图书是否存在的 IF 语句的正确位置在哪里?在 React 组件中还是在 createAsyncThunk 中?我的意思是:验证是否必须分派某个操作更好,还是分派该操作并在之后阻止它更好?例如可以打电话吗dispatch在 thunk 内部使用thunkAPI?

我的其他疑惑

  1. 使用以下方式检索状态通常是否更好useAppSelector或者,如果可能的话,将其传递给孩子们props?

  2. 到现在为止,我已经reserve, addToWishlist, login, register,它们都是用创建的createAsyncThunk,并导致大量代码extrareducers的切片。我计划添加更多内容,这将是向服务器发送请求的其他 thunk。这个工作流程可以吗?我在后端犯了一些严重的逻辑错误?

  3. 没看懂,这和a有什么区别thunk and a middleware。有什么有用的资源吗?

这是发送请求的两个主要 thunk。抱歉,他们不是那么干净,但我认为这足以理解这个问题。

export const patchCatalogue = createAsyncThunk(
  'catalogue/patch',
  async ({book, userInfo}: {
    book: IBook;
    userInfo: IUserInfo;
  }, thunkAPI) => {
    const {
      id: bookId,
      book_status: {
        copies,
        history,
        current
      }
    } = book;
    const { 
      id: userId, 
      username 
    } = userInfo;
    try {
      const response = await axios.patch(
        `http://localhost:5000/catalogue/${bookId}`,
        {
          book_status: {
            copies: copies - 1,
            current: [...current, [userId, username]],
          }
        });
      if (response.status === 200) {
        const result = await thunkAPI.dispatch(reserve({ book, userInfo }))
        // console.log(result)
        return response.data;
      }
    }
    catch (error) {
      console.error(`PATCH failed - ${error}`)
    }
  },
);
export const reserve = createAsyncThunk(
  'user/reserve',
  async ({ book, userInfo }: {
    book: IBook;
    userInfo: IUserInfo;
  }, thunkAPI) => {
    const {
      id: userId,
      reservations: {
        current,
        history,
      }
    } = userInfo;

    try {
      const response = await axios.patch(`http://localhost:5000/users/${userId}`, 
      {
        reservations: {
          current: [...current, book],
          history: [...history],
        }
      });
      return response.data;
    }
    catch (error) {
      console.error(error)
    }
  }
);

这是 Button 组件,它调度两个操作。

if (userInfo.role === 'user') {
        if (action === 'Book now!') {
          const alreadyBooked = userInfo.reservations.current.find(item => item.id === book.id)
          if (!alreadyBooked) {
            await dispatch(patchCatalogue({ book, userInfo }));
            dispatch(reserve({ book, userInfo }))
          }
          else {
            alert('The book is already reserved!')
          }
        }

主要问题的答案。

据我说,上述 IF 语句的正确位置, 是个反应组件. 调度动作是指,涉及Redux 商店 in the 应用程序工作流程。所以让商店介入是没有用的,只是为了检查条件。它还有助于保持存储切片中的代码干净。

渴望知道您其他疑问的答案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

正确的代码流程:调度动作并阻止,或者如果调度它们则提前验证? 的相关文章

随机推荐

  • Phonegap 1.7中的Childbrowser插件只能第一次打开

    Phonegap 1 7 中的 Childbrowser 插件只能在第一次打开 我正在使用 Phonegap 1 7 和 Childbrowser 仅在子浏览器第一次工作时 当我关闭 Childbrowser 按下完成按钮 后 当我尝试打开
  • 如何仅删除父表中由子表中的外键引用的行

    我想从父表中删除行 元组 但它抛出错误消息 因为它的子表中有外键引用 但是 就我而言 我想仅删除父表中的记录并保留子表中的数据 有可能实现这一目标吗 我知道的用法ON DELETE CASCADE https stackoverflow c
  • ExtJS“日期字段”验证覆盖

    我需要一个具有一些自定义行为的日期列 特别是我需要能够在同一字段中输入日期或年龄 年龄保持呈现为年龄 日期保持呈现为日期 例如 输入 23 将使 23 在字段中保留为有效值 或者输入 22 1 88 将使 22 1 88 保留为有效值 所以
  • 在第一行有 rowspan 的情况下,在表格的第一行设置 css 样式

    我有很多表 想要在表的第一行设置 css 样式 前提是第一行有行跨度 table tbody tr td width 110 Name td td width 110 Size td td width 110 Status td tr tr
  • Vega-Lite 中的平行坐标?

    是否可以创建平行坐标维加精简版 https vega github io vega lite 我正在寻找一个简单但功能强大的 JavaScript 绘图库 并且需要支持平行坐标 I have googled https www google
  • 如何使用 PHP 将 RSS XML 提要转换为数组

    我希望标题代表全部 如何使用 PHP 将 RSS XML 提要转换为数组 如何才能做到这一点 例如 我正在使用以下网址 这导致了 XML 模式 我需要使用 PHP 将其转换为数组格式 任何帮助将不胜感激和感激 提前致谢 一步步 How to
  • 如何在没有 web.xml 的情况下将 App Engine 项目更新到 Java 11?

    我有一个应用程序引擎项目 Here https github com KevinWorkman GoogleCloudExamples tree master hello world是一个示例存储库 但它只包含几个文件 pom xml
  • viewWillAppear 子视图

    我有 UIScrollView 与多个 UIVIew 子视图 我想更新每个 UIView 显示在 UIScrollView 的可见部分中时显示的数据 触发的回调是什么 我尝试了 viewWillAppear 但似乎没有被调用 谢谢 你必须自
  • XQuery 中的 element() 与 node()

    有人可以告诉我两者之间的确切区别吗node and element XQuery 中的类型 该文档指出element 是一个元素节点 而node 是任何节点 所以如果我理解正确的话element 是一个子集node 问题是我有一个像这样的
  • 如何覆盖 Qwik 中的默认 404 屏幕?

    我正在测试 Builder IO 中的 Qwik Javascript 框架 但找不到任何文档可以指导我自定义 404 页面的方向 我正在使用 Qwik 的 qwik city 插件 核实 这是关于如何渲染404页面的 https qwik
  • 查找到另一组任意点的范围内的所有点

    我有两组点A and B 我想找到所有点B是在一定范围内的r to A 其中一点b in B据说在范围内r to A如果至少有一个点a in A其 欧几里得 距离b等于或小于r 两组点中的每一个都是连贯的点集 它们是根据两个不重叠对象的体素
  • 无法获得多视图控制来更改视图

    我有一个多视图控件 有两个视图 View1 是默认视图 View2 是新视图 当最终用户单击按钮时 我想将视图更改为 View2 无论如何我似乎都无法实现这一目标 ASP NET 代码
  • python/pycharm项目在调试模式下产生分段错误,但在运行模式下不会产生分段错误

    奇怪的是 在调试模式下 如果脚本在通常会发生段错误 没有断点 的地方停止 通过断点 然后恢复 则不会发生段错误 很奇怪吧 本项目使用pycharm和pygame 操作系统是 windows 10 该项目包含跨 8 个模块的约 1500 行代
  • 如何在 Qt 应用程序中使用样式表更改 QPushButton 图标大小

    是否可以使用样式表设置和更改 QPushButton 上的图标大小 我需要这个基于 qt 的模板 客户可以使用样式表对其进行样式化 在样式表中使用以下代码 qproperty iconSize 24px
  • 如何将 SQL 大容量复制与 Dapper .Net 结合使用?

    我正在使用 Dapper net 在 SQL 表中进行批量插入操作 我正在考虑使用 SQKBulk Copy 与 Dapper Net 但没有任何经验如何将 SqlbulkCopy 与 Dapper Net 一起使用 非常感谢你的帮助 使用
  • Windows 7 和 Windows Server 2008 R2 之间的差异

    Windows 7 或 Windows Server 2008 R2 中包含某些功能和 API 但另一个则不包含 在哪里可以找到差异的具体列表 如果程序要兼容两者 有什么需要特别避免的吗 当然 这个问题可以推广到任何版本的 Windows
  • Sapper/Svelte 可以有条件地导入组件吗?

    在 Sapper 中 我仅在客户端渲染时才尝试导入组件 使用onMount 有没有类似React的东西Suspense and React lazy 或者还有其他方法吗 你当然可以这样做 是的
  • Cordova 应用程序 - 构建工具错误 - Gradle

    我有一个科尔多瓦应用程序 重装系统后无法编译 我遇到了错误 Error No installed build tools found Please install the Android build tools version 19 1 0
  • 如何在 Tensorflow 的图形管道中解码 Unicode 字符串

    我创建了一个 tfRecord 文件来存储数据 我必须存储印地语文本 因此我使用 string encode utf 8 将其保存在字节中 但是 我在读取数据时陷入困境 我正在张量流数据集 API 的帮助下读取数据 我知道我可以使用 str
  • 正确的代码流程:调度动作并阻止,或者如果调度它们则提前验证?

    这是我前端开发自学一年后在Stackoverflow上的第一个问题 我已经为我的疑问找到了答案 但由于这些问题第三次出现 我认为现在是向网络提问的时候了 我正在尝试构建什么 我正在尝试建立一个图书馆服务 访客用户可以登录 预订书籍 添加到愿