I’m certain there has to be something painfully simple and obvious that I’m just not seeing here… The following component pulls data through RTK Query and then maps out a table. The table is displaying correctly in terms of structure, and the values make it to the child Row component (the table expands to show additional fields, and I followed the Mui example for a collapsible table: https://mui.com/material-ui/react-table/#collapsible-table) as logged in the console. But the actual render of the data is showing undefined. I’ve used this approach so many times without issue, and I just cannot find anything off, but again, I’m sure it’s super obvious and its just my being lost in the weeds. Any help would be greatly appreciated.
function Row(data) { console.log("data ", data) //data successfully makes it here... const visitId = data.id; const [open, setOpen] = useState(false); const [deleteVisit] = useDeleteVisitMutation(); const formatDate = (visitStart) => { const date = new Date(visitStart); let options = { year: "numeric", month: "numeric", day: "numeric", }; return date.toLocaleDateString("en-US", options); }; return ( <> <TableRow sx={{ "& > *": { borderBottom: "unset" } }}> <TableCell> <IconButton aria-label="expand row" size="small" onClick={() => setOpen(!open)} > {open ? <KeyboardArrowUpIcon /> : <KeyboardArrowDownIcon />} </IconButton> </TableCell> <TableCell component="th" scope="row"> {data?.user?.fullName} {console.log("user in data", data?.user?.fullName)} //undefined here (and all data values) </TableCell> <TableCell align="center">{formatDate(data?.visitStart)}</TableCell> <TableCell align="center"> <span display='inline-flex'> <DirectEditVisit visitId={visitId} visit={data} /> <IconButton onClick={() => deleteVisit(visitId)}> <DeleteIcon /> </IconButton> </span> </TableCell> </TableRow> <TableRow> <TableCell style={{ paddingBottom: 0, paddingTop: 0 }} colSpan={6}> <Collapse in={open} timeout="auto" unmountOnExit> <Box sx={{ margin: 1 }}> <Typography variant="h6" gutterBottom component="div"> Progress Notes </Typography> <Table size="small" aria-label="notes"> <TableHead> <TableRow> <TableCell>Goal</TableCell> <TableCell>Notes</TableCell> </TableRow> </TableHead> <TableBody> {data?.goals?.map((goal) => ( <TableRow key={goal._id}> <TableCell component="th" scope="row"> {goal.title} </TableCell> <TableCell>{goal.note}</TableCell> </TableRow> ))} </TableBody> </Table> </Box> </Collapse> </TableCell> </TableRow> </> ); } const ProgNotesTab = () => { const { clientId } = useParams(); const { data, isLoading, isSuccess } = useGetVisitsByClientIdQuery(clientId); let content; if (isLoading) { content = <CircularProgress />; } else if (isSuccess) { content = ( <div> <Box sx={{ display: "flex", height: "100%", width: "100%" }}> <TableContainer component={Paper}> <Table aria-label="Progress Notes"> <TableHead> <TableRow> <TableCell /> <TableCell>Staff</TableCell> <TableCell>Date</TableCell> <TableCell>Edit/Delete</TableCell> </TableRow> </TableHead> <TableBody> {data && data.map((i) => ( <Row key={i._id} data={i} /> ))} </TableBody> </Table> </TableContainer> </Box> </div> ); } return ( <div> <div>{content}</div> </div> ); }; export default ProgNotesTab;
The data in the console:
data: Object { client: "6205a8313fe12d6b4ec354c4", location: "Los Angeles Court", visitStart: "2022-04-13T18:00:53.000Z", … } client: "6205a8313fe12d6b4ec354c4" createdAt: "2022-04-13T18:23:15.712Z" goals: Array(3) [ {…}, {…}, {…} ] 0: Object { title: "Cook", note: "Cook stuff", marked: true, _id: "631f6a7de4c79fe85dc94c3a" } 1: Object { title: "Budget", note: "Budget finances", marked: true, … } 2: Object { title: "Clean", note: "Clean stuff", marked: true, _id: "631f6a7de4c79fe85dc94c3c" } length: 3 <prototype>: Array [] id: "62571513ec41c091181dd828" location: "Los Angeles Court" totalHours: 1 updatedAt: "2022-09-12T17:21:01.917Z" user: Object { _id: "62194175bcd77d7f4bfa97ea", fullName: "Danny Trejo" } visitEnd: "2022-04-13T19:00:00.000Z" visitStart: "2022-04-13T18:00:53.000Z"
Advertisement
Answer
Since you pass prop name as data
in line <Row key={i._id} data={i} />
, you need to replace this line:
function Row(data) {
with:
function Row({ data }) {
You can take a look at this sandbox for a live working example of your case.