reactjs - 在reducers之间共享状态的最佳方式(redux工具包)

标签 reactjs redux middleware redux-toolkit

我正处于规划应用程序结构的阶段。这是我的第一个 react 应用程序。 应用程序有几个状态切片和一些影响其他切片的全局状态。 我正在寻找建立切片之间关系的最佳方法。 我的第一个想法是中间件。

例如:

export const store = configureStore({
  reducer: {
    posts: postsReducer, // { posts: [] }
    user: userReducer // { blocked: true }
  },
  middleware: [userValidation]
})

如果用户被阻止,我想禁用添加帖子。我应该为此使用中间件吗?

export default const userValidation = store => next => action => {

    const { user } = store.getState()

    if (action.type === 'posts/add' && user.blocked) {
        store.dispatch(someWarning())
    } else {
        next()
    }
}

恐怕中间件会太多,逻辑和条件太多。我也担心性能。有什么好办法吗?

最佳答案

我的观点是什么?

我认为后端应该负责授权,后端不应该信任前端并进行双重检查(为什么如果被阻止的用户找到了发送请求的方法?)。

你应该注意什么?

我认为您只应该隐藏触发调度操作的按钮/表单。如果被阻止的用户找到发送请求的方式,后端将返回401(未经授权)代码响应。

真实的例子?

看看 StackOverflow 如何处理投票操作,它允许您点击自己帖子的向上箭头,发送请求,后端验证它并发送响应您不能为自己的帖子投票.

enter image description here

如果还有其他组件执行取决于用户状态的其他操作怎么办?

好吧,假设您有 PostComponentCommentComponent,并且您希望在用户被阻止时隐藏发帖和评论操作。

我建议组件不要了解有关用户的信息,而是应该有一些像 canAddNewPostcanAddNewComment 这样的属性,这些属性将在渲染时定义,如下所示:

<PostComponent canAddNewPost={!user.isBlocked} />
// ...
<CommentComponent canAddNewComment={!user.isBlocked} />

然后在组件中,您可以使用该属性来决定向用户显示或隐藏哪些 block 。或者用它来验证调度,例如:

{canAddNewPost ? <AddNewPostForm /> : null}

或者

if (!canAddNewPost) {
    store.dispatch(someWarning())
}

希望对您有所帮助。

关于reactjs - 在reducers之间共享状态的最佳方式(redux工具包),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73863103/

相关文章:

reactjs - 提交成功后关闭表单模式

reactjs - 复选框状态不会根据 redux 状态而改变

ruby - 如何将 Rack 中间件注入(inject)现有的 Rack 应用程序?

node.js - 将 express-busboy 限制在特定路线

javascript - 如何在 React/Jsx 的渲染中调用函数

javascript - createStore with combineReducers 和 applyMiddleware 没有第二个参数

reactjs - 获取类型字符串不可分配给 Storybook 中 TS 组件的类型字符串

next.js - 我可以在自托管环境中运行新的 Next.js 中间件吗?

javascript - 从 JSON 中的对象读取数据

reactjs - 尝试启动create-react-app并安装react-dev-utils时出现NPM错误E404