我正在try 将一个对象作为‘props ’从父类发送到子类,目的是显示信息:

Parent class

const TaskDetail = () => {

    //Get parameter from URL
    const { id } = useParams()

    const [taskDetail, setTaskDetail] = useState([])


    useEffect(() => {
        TaskService.getTaskById(id)
            .then(response => {
                setTaskDetail(response.data);
            })

    }, [id]) //This [id] avoid infinite loop of requests
    
    if (!taskDetail) return <div>No data</div>

    return (
        <div>
            <Detail taskDetail={taskDetail}/>
        </div>
    )
}

此类向服务器发出请求并收集数据对象.然后,该对象被传递到Child Detail,在那里它将被反序列化并相应地可视化.

Child class

const Detail = ({ taskDetail }) => {


    return (
        <Box
            align='center'
            justifyContent='center'
            sx={{ width: '100%', marginTop: 4}}
            bgcolor=''
            //border='solid'
            >
            <Stack
                //border='solid'
                sx = {{width: '50%'}}
                justifyContent='center' 
                //border='solid'
                >
                <Typography
                    sx = {{ marginTop: 5}}
                    variant='h4'
                    fontWeight='bold'
                    bgcolor='#b2dafa'  
                    >NOMBRE DEL EJERCICIO<br/>{taskDetail.taskName}</Typography>
                    <Box
                        sx = {{ marginTop: 3}}
                        bgcolor='#b2dafa'
                    >
                        <Typography
                            variant='h5'
                            align='center'
                            sx = {{ margin: 2}}
                            fontWeight='bold'  
                            >DETALLES DEL EJERCICIO</Typography>
                        <Typography
                            sx = {{ margin: 2}}
                            variant='text'
                            border='#555'
                            >{taskDetail.details}
                            </Typography>
                    </Box>
                    <Box
                        sx = {{ marginTop: 5}}>
                    <Typography
                            variant='h6'
                            >Marca para completar</Typography><Toogle
                            label=''
                            toogled={false}
                            onClick={null}/>
                        <br></br>
                    </Box>
                    {taskDetail.id}
                    <Box
                        sx = {{ marginTop: 2}}>
                        <AddComment taskId={taskDetail.id}/>
                    </Box>
                    <Box
                        sx = {{ marginTop: 2}}>
                        <ListComments taskId={taskDetail.id}/>
                    </Box>
            </Stack>   
        </Box>
    )
}

正如您所观察到的,该对象还被传递给其他子组件.上下文是TaskDetail显示信息,然后提供两个特性ListComments和AddComments.目前,我在AddComment中遇到了一个问题,props taskId={taskDetail.id}未定义.

Function in Child where I am having this issue

function ListComments(props) {

    const [comments, setComments] = useState([])

    useEffect(() => {
    
        console.log('DEBUG listcomments: ' + props.taskId)
        TaskService.getTaskCommentsById(props.taskId)
            .then(response => {
                setComments(response.data)
            })
        
    }, [])

return (
        <div>
            <h2>Comentarios</h2>
            {comments.map((comment, _) => {    
                return  <Comment key={comment.id} comment={comment}/>
            })}
        </div>
)


}

我注意到,如果我更改代码中的某些内容并保存它(重新呈现页面).突然间,我得到了我需要的属性,而不是未定义的值.

How could I avoid this situation?个 我相信我犯了一个我看不见的巨大错误,但这是学习的一部分.出于这个原因,我对建议持开放态度.

推荐答案

因为您从服务返回的数据是一个对象,所以我建议使用对象{}来初始化状态.

const [taskDetail, setTaskDetail] = useState({});

ListComments组件中,您可以执行与在TaskDetail组件中相同的操作.当props.taskId改变时,运行useEffect.如果taskId还没有价值,还可以提前返还.

useEffect(() => {
  console.log("DEBUG listcomments: " + props.taskId);

  if (!props.taskId) return;

  TaskService.getTaskCommentsById(props.taskId).then((response) => {
    setComments(response.data);
  });
}, [props.taskId]);

Javascript相关问答推荐

react/redux中的formData在expressjs中返回未定义的req.params.id

Chromium会将URL与JS一起传递到V8吗?

我的服务工作器没有连接到我的Chrome扩展中的内容脚本.我该怎么解决这个问题?

如何在JavaScript文件中使用Json文件

Prisma具有至少一个值的多对多关系

这个值总是返回未定义的-Reaction

在浏览器中触发插入事件时检索编码值的能力

扩展类型的联合被解析为基类型

使用Nuxt Apollo在Piniastore 中获取产品细节

让chart.js饼图中的一个切片变厚?

从另一个数组中的对应行/键值对更新数组中的键值对对象

触发异步函数后不能显示数据

Google脚本数组映射函数横向输出

将Auth0用户对象存储在nextjs类型脚本的Reaction上下文中

通过跳过某些元素的对象进行映射

如何在FiRestore中的事务中使用getCountFromServer

谷歌饼图3D切片

表单数据中未定义的数组键

使用Java脚本筛选数组中最接近值最小的所有项

如何让noWrap在嵌套在Alert/AlertTitle组件中的排版组件中工作?