【发布时间】:2020-12-15 08:42:06
【问题描述】:
我是Node新手,有反应,如有错误请多多包涵。
我想向后端发出 POST 请求,并得到响应。响应是一个包含对象的数组。然后,我想映射数组并将其呈现在组件中。
我可以在前端得到响应并登录控制台如下:
阅读 react-dev-tools 和 VideoConferenceRoom 组件显示:
[
{
"name": "State",
"value": [
{
"id": 1,
"video_room_pw": "57e2c460-3e7f-11eb-9c9c-a329bc0bc2e2",
"video_room_name": "57e2eb70-3e7f-11eb-9c9c-a329bc0bc2e2",
"video_hashed_room_name": null,
"video_room_url": "meet.jit.si/57e2eb70-3e7f-11eb-9c9c-a329bc0bc2e2"
},
{
"id": 2,
"video_room_pw": "13e074c0-3e8d-11eb-8192-4bf84e5d2275",
"video_room_name": "13e074c1-3e8d-11eb-8192-4bf84e5d2275",
"video_hashed_room_name": null,
"video_room_url": "meet.jit.si/13e074c1-3e8d-11eb-8192-4bf84e5d2275"
}
],
"subHooks": []
},
{
"name": "Effect",
"value": "ƒ () {}",
"subHooks": []
}
]
控制台记录 response.videoRooms:
但是当我在 useState 钩子中更新响应数组时,没有任何东西被映射到页面上。 该问题似乎无法在 useState 挂钩 currentVideoRoom 中设置当前状态,因为它在控制台中记录了一些空的内容。 任何人都可以帮忙吗?提前谢谢你。
我的反应代码:
import React, { useEffect, useState } from "react";
import { Paper } from '@material-ui/core';
const VideoConferenceRoom = ({currentWorkspace}) => {
const [currentVideoRoom, setCurrentVideoRoom] = useState([]);
let listItems;
useEffect(()=>{
const getVideo = async()=>{
const body = {currentWorkspace};
try{
const getVideoInfo = await fetch(`http://localhost:4000/workspace/${currentWorkspace}/video/rooms`,{
method:"POST",
headers: {
"Content-Type":"application/json",
"x-access-token": localStorage.getItem("token")
},
body: JSON.stringify(body)
})
const response = await getVideoInfo.json();
setCurrentVideoRoom(prevItems => [...prevItems, response.videoRooms])
console.log(currentVideoRoom);
listItems = response.videoRooms;
}catch(e){
console.error(e.message);
}
}
getVideo();
},[]);
return(
<>
<h1>Join the video meetings!</h1>
{currentVideoRoom.map((item)=>{
<Paper elevation={3}>
{item}
</Paper>
})}
</>
)
};
export default VideoConferenceRoom;
在后台控制台记录 getVideoInfoFromSameWorkspaceArr :
[ { id: 1,
video_room_pw: '57e2c460-3e7f-11eb-9c9c-a329bc0bc2e2',
video_room_name: '57e2eb70-3e7f-11eb-9c9c-a329bc0bc2e2',
video_hashed_room_name: null,
video_room_url: 'meet.jit.si/57e2eb70-3e7f-11eb-9c9c-a329bc0bc2e2' },
{ id: 2,
video_room_pw: '13e074c0-3e8d-11eb-8192-4bf84e5d2275',
video_room_name: '13e074c1-3e8d-11eb-8192-4bf84e5d2275',
video_hashed_room_name: null,
video_room_url: 'meet.jit.si/13e074c1-3e8d-11eb-8192-4bf84e5d2275' } ]
我在后端的代码:
const knex = require("../models/knex");
exports.postVideoShowRoom = async(req,res)=>{
const {currentWorkspace} = req.body;
try{
//get users from same workspace , more than 1 user in ws?
let getCurrentWorkspace = await knex('workspace').select().where('workspace_name', currentWorkspace);
console.log(getCurrentWorkspace,'this is getCurrentWorkspace')
let getVideoIdFromSameWorkspace ;
let getVideoInfoFromSameWorkspace ;
let getVideoInfoFromSameWorkspaceArr = [];
for (let item of getCurrentWorkspace){
getVideoIdFromSameWorkspace = await knex('video_workspace').select().where('workspace_id', item.id);
console.log(getVideoIdFromSameWorkspace, 'this is getVideoIdFromSameWorkspace')
}
for (let item of getVideoIdFromSameWorkspace){
getVideoInfoFromSameWorkspace = await knex('video').select().where('id', item.video_id);
getVideoInfoFromSameWorkspaceArr.push(getVideoInfoFromSameWorkspace[0]);
}
console.log(getVideoInfoFromSameWorkspaceArr, 'this is getVideoInfoFromSameWorkspaceArr')
res.json({
videoRooms: getVideoInfoFromSameWorkspaceArr,
})
}catch(e){
console.error(e.message);
}
}
【问题讨论】:
-
忽略控制台日志(因为反应状态更新是异步的)你的渲染真的有效吗?
videoRooms也似乎是一个数组,所以除非你打算嵌套数组,否则我认为你也应该传播它,setCurrentVideoRoom(prevItems => [...prevItems, ...response.videoRooms])。在此之后,您可能会看到 react 无法渲染对象的错误,因为item将是这些房间对象之一。 -
只是日志记录不起作用。更新是异步的。
console.log(currentVideoRoom)将显示闭包中currentVideoRoom的值。 IE。在下一次渲染之前,这个值永远不会改变。除此以外,它没有工作吗? -
console.log(currentVideoRoom);由于状态的异步性质,将显示旧值,但渲染应该可以工作。尝试更新您的代码setCurrentVideoRoom(prevItems => [...prevItems, ...response.videoRooms]) -
渲染不起作用,除了
标题@DrewReese 之外的空白页面
-
有什么错误吗?检查网络选项卡以确保 POST 请求成功。检查 react-dev-tools 以查看 state 的值。
标签: javascript node.js reactjs