Redux能否仅管理布尔类型状态?该实现方式是否合理?
关于React Redux认证状态Reducer的问题解答
先给你吃个定心丸:你的当前写法没有触发Redux禁止的状态突变问题!因为布尔值是JavaScript原始类型,你在reducer里返回的!state或者原state都是全新的值,没有修改传入的原始state对象/值,完全符合Redux对immutable状态的要求。
不过你的reducer逻辑存在一些可以优化的地方,同时我也会给你简化从store获取状态的方案:
一、修正Reducer的逻辑问题
你的当前代码中,AUTHENTICATED和AUTHENTICATION_REMOVE都用return !state来切换状态,这可能导致不符合预期的行为:比如用户已经处于登录状态时,如果误触发了AUTHENTICATED action,状态会被切换为false,这显然和“认证成功”的语义不符。
更合理的做法是让每个action对应明确的状态值,而不是切换:
import { AUTHENTICATED, AUTHENTICATION_ERROR, AUTHENTICATION_REMOVE, UNAUTHENTICATED } from '../actions/types'; const INITIAL_STATE = false; export default function authReducer(state = INITIAL_STATE, action) { switch(action.type) { case AUTHENTICATED: return true; // 明确标记为已认证 case UNAUTHENTICATED: case AUTHENTICATION_REMOVE: return false; // 未认证/移除认证都标记为未认证 case AUTHENTICATION_ERROR: return false; // 可选:认证错误时也重置为未认证,根据业务需求调整 default: return state; } }
二、简化从Store获取状态的操作
如果你的项目使用函数组件,可以通过封装自定义Hook来简化重复的useSelector调用:
- 创建自定义Hook文件
// src/hooks/useAuthStatus.js import { useSelector } from 'react-redux'; export const useAuthStatus = () => { // 假设你的auth reducer在store中的key是`auth`,根据实际情况调整 return useSelector(state => state.auth); };
- 在组件中使用
import { useAuthStatus } from '../hooks/useAuthStatus'; function Dashboard() { const isAuthenticated = useAuthStatus(); return ( <div> {isAuthenticated ? ( <h2>欢迎访问后台面板</h2> ) : ( <p>请先登录</p> )} </div> ); }
这样每次需要获取认证状态时,直接调用useAuthStatus()即可,不用重复写useSelector的逻辑,代码更简洁也更易维护。
内容的提问来源于stack exchange,提问作者PrimeTimeTran
相关产品推荐
相关产品推荐

