[英]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.