The HeatMap component returns a blank screen, with the error occuring in the webpage console.
import React, { useState, useEffect } from "react";
import ClinicalRoom from '../images/ClinicalRoom.jpg'
import data3 from "../data.json"
import green from "../images/green.png"
import red from "../images/red.png"
export default function HeatMapTable({ list, colNames, room, height='auto'}) {
const [count, setCount] = useState(0)
const [backendData, setBackendData] = useState([{}])
colNames = ["", "", "",""]
useEffect(() => {
fetch("/heatmapapi").then(
response => response.json()
).then(
data => {
setBackendData(data)
}
)
}, [count] )
list = backendData[count].mapped
room = backendData[count].room
console.log(list)
return (
<div className="theme1">
<h1>Heat Map</h1>
<p1 >Room: {room}</p1>
<button onClick={() => setCount(count - 1)}>Prev</button>
<button onClick={() => setCount(count === 9 ? console.log("no more"): count 1)}>Next</button>
<div className="layer">
{list.length > 0 && (
<table cellSpacing="0" style={{ height: height}}>
<thead>
<tr>
{colNames.map((headerItem, index) => (
<th key={index}>
{headerItem.toUpperCase()}
</th>
))}
</tr>
</thead>
<tbody>
{Object.values(list).map((obj, index) => (
<tr key={index}>
{Object.values(obj).map((value, index2) => (
<td key={index2}>
{value === 0 ? <img className="map"src={green}/> : <img className="map" src={red}/>}
</td>
))}
</tr>
))}
</tbody>
</table>
)}
<img className="room" src={ClinicalRoom}></img>
</div>
</div>
)
}
The component is being rendered in App.js like this:
<Route path ="/heatmap" element={< HeatMap />} />
The component is grabbing the data from server.js using express like this:
const data2 = require("../client/src/data.json")
app.get("/heatmapapi", (req, res) => {
res.json(data2)})
The data inside the data.json file is inside of an array and looks like this:
{"room": "101",
"mapped":
[{"1":0, "2":1 ,"3":0, "4":1},
{"1":0, "2":0, "3":0, "4":0},
{"1":0, "2":0, "3":0, "4":0},
{"1":0, "2":1, "3":0, "4":0},
{"1":0, "2":0, "3":0, "4":0}],
"staffnum": 1}
I have no idea why but the program runs perfectly with no errors if I do the following:
run the program
set list and room to:
list = backendData room = backendData.room
save and refresh
set list and room back to:
list = backendData[count].mapped room = backendData[count].room
save and refresh
CodePudding user response:
Here's a representation of the initial (relevant) state of the component:
1- backenData = [{}]
2- count = 0
3- list = backendData[count].mapped
From 1- and 2- we can deduct that the derived state list is undefined.
When you're accessing list.length i.e undefined.length it throws an error. To manage the case where list would be undefined, you could use the optional chaining operator like this: list?.length
import React, { useState, useEffect } from "react";
...
export default function HeatMapTable({ list, colNames, room, height='auto'}) {
...
return (
...
<div className="layer">
{list?.length > 0 && (
....
)}
}
