简体   繁体   English

由于 useEffect,我的 React 应用程序主页刷新

[英]My react app homepage refreshes because of useEffect

Here I am trying to get user Info from redux state to the homepage after signing in but the problem is that the component refreshes and lose all the redux data stored because of the useEffect hook, and I can't use the checkUser() method which retrieve user data without that hook because it cause an infinite rendering problem and ruin the app.在这里,我试图在登录后将用户信息从 redux state 获取到主页,但问题是组件刷新并丢失了由于useEffect挂钩而存储的所有 redux 数据,我无法使用checkUser()方法在没有该钩子的情况下检索用户数据,因为它会导致无限渲染问题并破坏应用程序。 So can you help me get the data from redux state without refreshing the component.那你能不能帮我在不刷新组件的情况下从 redux state 获取数据。

import React, { Component } from 'react';
import { Link } from 'react-router-dom';
import { useEffect, useState } from 'react';
import { checkUser } from '../../actions/userActions';
import { connect } from 'react-redux';
import './main.css';



function Main(props){


    const [loggedIn, setLoggedIn] = useState(false)

    useEffect(() => {
        props.checkUser();
        setLoggedIn(props?.user?.isLoggedIn)
    },[checkUser])

    useEffect(() => {
        console.log(loggedIn)
    }, [loggedIn])
    


    let menuOpened = false;

    const menuToggle = (element) => {
        element.preventDefault();
        let menuButton = document.querySelector('.menu-btn');
        let responsiveMenu = document.querySelector('.toggle-menu');

        if(!menuOpened){
            menuButton.classList.add('open');
            responsiveMenu?.classList.add('opened');

        }else if(menuOpened){
            menuButton.classList.remove('open');
            responsiveMenu?.classList.remove('opened');
        }
        menuOpened = !menuOpened ;
    }

    const search = (e) => {
        e.preventDefault();
    }


    return ( 
        <div>
            <h1 id='Title'>Your favorite<br></br>Gifts shop</h1>
        
            <nav id='navbar'>
                <div className='menu-btn' onClick={menuToggle}>
                    <div className='menu-btn-burger'></div>
                </div>
                <ul className='toggle-menu'>
                    <li className="toggle-menu-items">
                        <Link className='toggle-menu-anchors' {...(loggedIn ? {to:'/user-profile'} : {to:'/user-form'})}>Profile</Link>
                    </li>
                    <li className="toggle-menu-items">
                        <Link className='toggle-menu-anchors' to='/cart'>Cart</Link>
                    </li>
                    <li className="toggle-menu-items">
                        <Link className='toggle-menu-anchors' to='/support'>Support</Link>
                    </li>
                </ul>
                <ul>
                    <li className='menu' id='menu1'><Link className='anchor-menu' {...(loggedIn ? {to:'/user-profile'} : {to:'/user-form'})}>Profile</Link></li>
                    <li className='menu' id='menu2'><Link className='anchor-menu' to='/cart'>Cart</Link></li>
                    <li className='menu' id='menu3'><Link className='anchor-menu' to='/support'>Support</Link></li>
                </ul>
                <form id='mainForm'>
                    <input id='mainInput'/>
                    <button id='search' onClick={search}>search</button>
                </form>
            </nav>
        </div>
    );

    
}


const mapUserStateToProps = (state) => {
    return{
        user : state?.myUser || [],
    }
}






export default connect(mapUserStateToProps, {checkUser})(Main);

Why do you have a function as a dependancy for the first useEffect.为什么你有一个 function 作为第一个 useEffect 的依赖项。 I think you should have props.user as the dependency instead if we want the state to change when the user object changes:如果我们希望 state 在用户 object 更改时更改,我认为您应该将 props.user 作为依赖项:

  useEffect(() => {
        props.checkUser();
        setLoggedIn(props?.user?.isLoggedIn)
    },[props?.user])
    useEffect(() => {
        props.checkUser();
        setLoggedIn(props?.user?.isLoggedIn)
    },[checkUser])

Replace above code with below code用下面的代码替换上面的代码

    // this useEffect to get user data
    useEffect(() => {
        props.checkUser();
    },[]);

    // this useEffect to set isLoggedIn flag
    useEffect(() => {
        setLoggedIn(props?.user?.isLoggedIn)
    },[props?.user]);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 React.js:useEffect() 依赖冻结了我的应用 - React.js: useEffect() dependency freezes my app React Bootstrap 使用 Nav 组件刷新应用 - React Bootstrap using Nav component refreshes the app React onClick function 调用刷新应用 - React onClick function call refreshes app 为什么我的 GitHub 页面只显示我的 React 应用程序的主页而不显示其他页面? - Why does my GitHub page only show the homepage for my react app and not the other pages? 按钮刷新页面,UseEffect 不工作 - Button refreshes page, and UseEffect not working 由于firebase我的React应用程序中的内存泄漏以及如何避免它? - Memory leak in my React app because of firebase and how to avoid it? 为什么每次更改语言时我的 React 应用程序都会重新加载主页? - Why my react app reloads the homepage every time I change the language? React App 加载 HomePage 而不是 Desired Page - React App loads HomePage instead of Desired Page React Hooks,useEffect 中的 setTimeout 直到结束才触发,因为 state 更新 - React Hooks, setTimeout in useEffect not triggering until end, because of state updates 为什么我的 React 应用程序在我更改数据库时在 useEffect 中运行 firebase 查询? - Why my React app runs firebase query in useEffect when I alter the database?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM