所以我有这个父组件,它有一个子组件.我已经在主应用程序中为该组件定义了一条路由.现在我想从另一个页面访问这个父级,所以我使用了Link组件.问题是,每当用户想要访问页面(父组件)时,子组件中的useEffect无论如何都不会运行,因此会抛出一个错误.以下是相关代码.

应用程序组件:


import { BrowserRouter, Routes, Route} from "react-router-dom";
import Signup from "./components/signup";
import Messenger from "./components/messenger";
import Login from "./components/login";

function App() {

  return (
    <>
      <Routes>
        <Route path="/" element={<Login/>}/>
        <Route path='/signup' element={<Signup />}/>
        <Route path='/messenger' element={<Messenger/>}/>
        
      </Routes>
    </>
        
  );
}

export default App;


我要从中调用父级的组件

import { useEffect, useState, useRef } from 'react';
import {Link } from 'react-router-dom';
import SendIcon from '@mui/icons-material/Send';
import CircleIcon from '@mui/icons-material/Circle';
import AccountCircleIcon from '@mui/icons-material/AccountCircle';

const Header = ({pfp}) => {


    return ( 
        <div className='header'>

            <div className='headerleft'>
                <img src={logo} className='logo' alt="" />
            </div>
            <div className='headerright'>
                {ismsg && <span className={textval < 10 ? "countertexts" : "countertextsdouble"}  >8</span>}



                <Link to="/messenger"><SendIcon className='texts' fontSize='large' /></Link>



        
            </div>
        </div>

    );
}
 
export default Header;



父辈

return (
        <>
            
                            conversations.map((c) => (
                                <div key={c._id} onClick={() => { convohandler(c) }}>
                                    <Conversation conver={c} latestchat={latestchat} />
                                </div>
                            ))
                           
                        
        
       </>
       );
}

export default Messenger;

这子元素


import { useSelector } from "react-redux";
import { useEffect, useState} from "react";

const Conversation = ({conver,latestchat}) => {

    console.log(conver)    // this prop sent from 父辈 is getting printed just fine.

    
    let [fre, setFre] = useState("");
    let [isnow, setIsnow] = useState(false);

  
    useEffect(() => {

        console.log("not working anymore");  // this text is never printed

        // api call to set 'fre' state value

    },[]);

 
    return ( 

        <div className={ fre.blocked.includes("user") ?  "blocked"  : "unblocked" }>
    );
   
}
 
export default Conversation;

错误是由于初始状态值为空而产生的.但这不是解决之道. 我想使用API调用来设置状态值,这显然是不可能的,因为useEffect不运行.有谁能帮我拿一下这个吗?我认为问题出在链接组件的使用上.但我不确定.

谢谢你

推荐答案

try 更新子组件代码-

return ( 
    <div className={ fre?.blocked?.includes("user") ?  "blocked"  : "unblocked" }>
);

问题是,正如您所说的那样,状态是空的.这里发生的情况是,返回首先执行,然后使用Effect.此时它处于空状态,因此阻塞是未定义的,因此包含未定义的抛出错误.

解决方案-我们在这里使用了可选链接,这等同于使用-

fre && fre.blocked && fre.blocked.includes("user")

Javascript相关问答推荐

v-textfield的规则找不到数据中声明的元素

使用useParams路由失败

获取加载失败:获取[.]添加时try 将文档添加到Firerestore,Nuxt 3

没有输出到带有chrome.Devtools扩展的控制台

D3 Scale在v6中工作,但在v7中不工作

在网页上添加谷歌亵渎词

使用Java脚本根据按下的按钮更改S文本

XSLT处理器未运行

对路由DOM嵌套路由作出react

如何在Svelte中从一个codec函数中调用error()?

NG/Express API路由处理程序停止工作

OpenAI转录API错误请求

搜索功能不是在分页的每一页上进行搜索

SPAN不会在点击时关闭模式,尽管它们可以发送日志(log)等

如何利用CSS中的隐藏元素实现平滑扩展和防止网格行间隙

在验证和提交表单后使用useNavigate()进行react 重定向,使用带有加载器和操作的路由

如何在一个对象Java脚本中获取不同键的重复值?

处理TypeScrip Vue组件未初始化的react 对象

postman 预请求中的hmac/sha256内标识-从js示例转换

用于测试其方法和构造函数的导出/导入类