这是我在一年的前端开发自学之后在Stackoverflow上的第一个问题。我已经为我的疑问找到了答案,但是由于这些问题是第三次出现,我认为现在是向Web提问的时候了。
∮我想要建立的东西∮
我正在尝试建立一个图书馆服务,访客用户可以登录、预订书籍、添加到愿望列表、返回等。对于前端,我使用react
、react-router
、react-bootstrap
和redux-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.到目前为止,我已经有了reserve
、addToWishlist
、login
、register
,它们都是用createAsyncThunk
创建的,并且在切片的extrareducers
中产生了很多代码。我计划添加更多代码,这将是其他thunk发送请求到服务器。这个工作流程可以吗?我在后端做了一些大的逻辑错误?
1.我不明白,thunk
和middleware
之间的区别是什么。有有用的资源吗?
这是发送请求的两个主要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!')
}
}
2条答案
按热度按时间2admgd591#
主要问题的答案。
我认为,上述IF语句的正确位置是React组件。分派操作意味着,在App工作流中涉及Redux Store。因此,涉及Store是无用的,只是为了检查条件。它还有助于保持store切片中的代码干净。
渴望知道你其他疑惑的答案。
ohfgkhjo2#
在我看来,对于可用性和用户角色等条件:
1.请签入React组件,以便在不满足条件时呈现
disabled
按钮。1.这会阻止调度首先运行,并且还可以显示帮助器文本(如
"out of stock", "already reserved"
)以获得更好的用户体验。1.当调用api时,在写数据库之前,另一个验证可以在后端发生,具有严格的安全规则。