79301677

Date: 2024-12-22 20:33:39
Score: 1.5
Natty:
Report link

I believe the text field is losing focus because the entire table is being re-rendered when the state updates. I’ve updated the code below, adding a key to maintain focus and optimising the state update:

import TableContainer from "@mui/material/TableContainer";
import Table from "@mui/material/Table";
import TableBody from "@mui/material/TableBody";
import TableRow from "@mui/material/TableRow";
import TableCell from "@mui/material/TableCell";
import TextField from "@mui/material/TextField";
import { styled } from "@mui/system";
import { useState } from "react";

export default function TableTextFieldTest() {
    const [questions, setQuestions] = useState([
        {
            index: 0,
            question: "Do you have any feedback on your manager or team that you'd like to share?",
        },
        {
            index: 1,
            question: "What suggestions do you have for improving the company culture or work environment?",
        },
        {   
            index: 2,
            question: "How was your experience working here?",
        }
    ]);

    const TableBodyCell = styled(TableCell)({
        paddingLeft: "24px",
        paddingRight: "24px",
        paddingTop: "16px",
        paddingBottom: "16px"
    });

    function handleEditTextfield(e, index) {
        setQuestions(prevQuestions => 
            prevQuestions.map(q => 
                q.index === index ? { ...q, question: e.target.value } : q
            )
        );
    };

    return (
        <TableContainer>
            <Table>
                <TableBody>
                    {questions
                        .sort((q1, q2) => q1.index - q2.index)
                        .map((q) => (
                            <TableRow key={q.index}>
                                <TableBodyCell>
                                    <TextField 
                                        value={q.question}
                                        onChange={(e) => handleEditTextfield(e, q.index)}
                                        sx={{ width: "100%" }}
                                    />
                                </TableBodyCell>
                            </TableRow>
                    ))}
                </TableBody>
            </Table>
        </TableContainer>
    );
};

Changes made are:

The above changes should maintain focus on the text field while editing. The problems with the original code were:

This should, hopefully, resolve the issue.

Reasons:
  • RegEx Blacklisted phrase (2.5): Do you have any
  • Long answer (-1):
  • Has code block (-0.5):
  • Low reputation (0.5):
Posted by: Zeros-N-Ones