更改依赖性时使用效应不会运行

发布于 2025-02-07 04:31:41 字数 2741 浏览 3 评论 0原文

我正在使用React Redux进行状态管理。我有一个匿名用户和一个管理员。我有当前用户为空{},并且在管理员登录时正在将其更改以存储用户详细信息。没有匿名的Navbar。当前,当管理员登录时,更改了Navbar,但是当我单击注销时,Navbar不会更改。我该如何解决这个问题?

这是我的navbar.js:

import React, { useEffect, useState } from "react";
import { useSelector } from "react-redux";
import NavBarAdmin from "./NavBarAdmin";
import NavBarAnonymous from "./NavBarAnonymous";

function NavBar() {
    const currentUser = useSelector((state) => state.currentUser);
    const [currentView, setCurrentView] = useState('anonymous');
    useEffect(() => {
        console.log(currentUser);
        if(currentUser==null || currentUser.length==0 || currentUser == undefined){
            setCurrentView('anonymous');
        }else{
            setCurrentView('admin');
        }
    }, [currentUser])

    const handleView = () => {
        switch(currentView){
            case "anonymous": return <>
                <NavBarAnonymous/>
            </>
            case "admin":
                return <>
                <NavBarAdmin/>
            </>
        }
    }

    return(
        <>
        {handleView()}
        </>
    )
}
export default NavBar;

我的action.js看起来像:

import actionTypes from "./actionTypes";

export function setCurrentUser(value) {
    return{
        type: actionTypes.SET_CURRENT_USER,
        payload: value
    }
}

actiontypes.js

const actionTypes = {
    SET_CURRENT_USER: 'SET_CURRENT_USER',
}
export default actionTypes;

configurestore.js

import { applyMiddleware, compose, createStore } from "redux";
import thunkMiddleware from "redux-thunk";
import rootReducer from './reducers';

export default function configureStore(preloadedState) {
    const middlewares = [thunkMiddleware];
    const middlewareEnhancer = applyMiddleware(...middlewares);

    const enhancers = [middlewareEnhancer];
    const composedEnhancers = compose(...enhancers);

    const store = createStore(rootReducer, preloadedState, composedEnhancers);
    return store;
}

reducers.js:

import { combineReducers } from "@reduxjs/toolkit";
import actionTypes from "./actionTypes";

export function currentUser(state = {}, action) {
    switch (action.type) {
        case actionTypes.SET_CURRENT_USER:
            
            return Object.assign({}, state, {
                q: action.payload,
            })
        default:
            return state
    }
}

export default combineReducers({
    currentUser
});

在注销功能中,我正在使用:

    dispatch(setCurrentUser({}));

当我单击登录按钮时,{}在控制台中,这意味着,这意味着那是当前用户设置为{},但未重新渲染NAVBAR。

I am using React Redux for state management. I have an anonymous user and an admin. I have current user which is empty {} and I am changing it to store the user details when the admin logs in. So, in my application I want to show the admin navbar if there is a logged user and I would like to show the anonymous navbar when there is not. Currently, when the admin logs in, the navbar is changed, but when I click logout, navbar is not changed. How can I solve this issue?

This is my NavBar.js:

import React, { useEffect, useState } from "react";
import { useSelector } from "react-redux";
import NavBarAdmin from "./NavBarAdmin";
import NavBarAnonymous from "./NavBarAnonymous";

function NavBar() {
    const currentUser = useSelector((state) => state.currentUser);
    const [currentView, setCurrentView] = useState('anonymous');
    useEffect(() => {
        console.log(currentUser);
        if(currentUser==null || currentUser.length==0 || currentUser == undefined){
            setCurrentView('anonymous');
        }else{
            setCurrentView('admin');
        }
    }, [currentUser])

    const handleView = () => {
        switch(currentView){
            case "anonymous": return <>
                <NavBarAnonymous/>
            </>
            case "admin":
                return <>
                <NavBarAdmin/>
            </>
        }
    }

    return(
        <>
        {handleView()}
        </>
    )
}
export default NavBar;

My actions.js looks like:

import actionTypes from "./actionTypes";

export function setCurrentUser(value) {
    return{
        type: actionTypes.SET_CURRENT_USER,
        payload: value
    }
}

actionTypes.js

const actionTypes = {
    SET_CURRENT_USER: 'SET_CURRENT_USER',
}
export default actionTypes;

configureStore.js

import { applyMiddleware, compose, createStore } from "redux";
import thunkMiddleware from "redux-thunk";
import rootReducer from './reducers';

export default function configureStore(preloadedState) {
    const middlewares = [thunkMiddleware];
    const middlewareEnhancer = applyMiddleware(...middlewares);

    const enhancers = [middlewareEnhancer];
    const composedEnhancers = compose(...enhancers);

    const store = createStore(rootReducer, preloadedState, composedEnhancers);
    return store;
}

reducers.js:

import { combineReducers } from "@reduxjs/toolkit";
import actionTypes from "./actionTypes";

export function currentUser(state = {}, action) {
    switch (action.type) {
        case actionTypes.SET_CURRENT_USER:
            
            return Object.assign({}, state, {
                q: action.payload,
            })
        default:
            return state
    }
}

export default combineReducers({
    currentUser
});

In the logout functionality I am using:

    dispatch(setCurrentUser({}));

And when I click logout button, {} is printed in the console, which means that the current user is set to {}, but the NavBar is not re-rendered.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文