redux 正确的代码流:分派操作并阻止,还是提前验证是否分派它们?

ijxebb2r  于 2022-11-24  发布在  其他
关注(0)|答案(2)|浏览(140)

这是我在一年的前端开发自学之后在Stackoverflow上的第一个问题。我已经为我的疑问找到了答案,但是由于这些问题是第三次出现,我认为现在是向Web提问的时候了。
∮我想要建立的东西∮
我正在尝试建立一个图书馆服务,访客用户可以登录、预订书籍、添加到愿望列表、返回等。对于前端,我使用reactreact-routerreact-bootstrapredux-toolkit。由于我还不了解后端,我使用json-server获取数据,它监视一个简单的数据库,其中有两个大对象:users和书catalogue

在我看来,应用程序流

在代码中有一个<Catalogue />组件,它向json-server' to get the data (with useEffect ), which is stored in the state. When data is fetched, it renders '组件发送一个请求,其中包含必要的信息和两个按钮。其中一个按钮用于预订一本书。预订按钮背后的逻辑是:

  • 验证如果当前用户不是管理员
  • 验证如果当前用户已预订此图书
  • 验证如果数据库中至少有一本书要保留

只有在一切正常的情况下,代码才会调度在catalogueSlice中使用createAsyncThunk创建的操作。在此thunk中,它从数据库中删除一个图书副本,并将结果传递给extrareducers以更新状态。handleClick函数为async,并等待此操作结束。当操作完成时,代码将调度另一个操作,该方法更新数据库,将该图书添加到该用户的当前预订中,并像其他thunk一样,将结果传递给state,并更新用户的状态。
我的疑惑和疑问

  • 我的主要问题 *

1.上面的IF语句验证用户、当前预订和图书在数据库中的存在,它们的正确位置在哪里?在React组件中还是在createAsyncThunk中?我的意思是:验证是否必须调度一个操作,或者调度该操作并在之后阻塞它,哪个更好?例如,是否可以使用thunkAPI在thunk内部调用dispatch

  • 我的其他疑惑 *

1.通常,使用useAppSelector检索状态更好,还是在可能的情况下通过子级props传递状态更好?
1.到目前为止,我已经有了reserveaddToWishlistloginregister,它们都是用createAsyncThunk创建的,并且在切片的extrareducers中产生了很多代码。我计划添加更多代码,这将是其他thunk发送请求到服务器。这个工作流程可以吗?我在后端做了一些大的逻辑错误?
1.我不明白,thunkmiddleware之间的区别是什么。有有用的资源吗?
这是发送请求的两个主要thunk。很抱歉,它们不是很清楚,但我认为这足以理解问题。
第一个
这是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!')
          }
        }
2admgd59

2admgd591#

主要问题的答案。
我认为,上述IF语句的正确位置React组件分派操作意味着,在App工作流中涉及Redux Store。因此,涉及Store是无用的,只是为了检查条件。它还有助于保持store切片中的代码干净。
渴望知道你其他疑惑的答案。

ohfgkhjo

ohfgkhjo2#

在我看来,对于可用性和用户角色等条件:
1.请签入React组件,以便在不满足条件时呈现disabled按钮。
1.这会阻止调度首先运行,并且还可以显示帮助器文本(如"out of stock", "already reserved")以获得更好的用户体验。
1.当调用api时,在写数据库之前,另一个验证可以在后端发生,具有严格的安全规则。

相关问题