Редактирование определенной ячейки в таблице

#reactjs

#reactjs

Вопрос:

Пожалуйста, помогите, Есть следующий код, пожалуйста, объясните, как я могу отредактировать конкретную ячейку, то есть показать ввод вместо td для редактируемой ячейки, пытаюсь реализовать это, но вместо этого получаю редактирование всего столбца, мне нужно показывать пользовательский ввод в TableCell вместо ячейки таблицы, когда они нажимают значок редактирования здесь ссылка на CodeSandboxhttps://codesandbox.io/s/busy-keller-331p2?file=/src/App.js

  import React from "react";
    
    export default class CatalogReviewerComponent extends React.Component {
      constructor(props) {
        super(props);
    
        this.state = {
          data: {
            content: [
              {
                id: 1,
                "test 1": "11",
                "test 2": "22",
                formId: "5f36674f5d45f33adcf75115"
              },
              {
                id: 2,
                "test 1": "test",
                "test 2": " test 242",
                formId: "5f36674f5d45f33adcf75115"
              }
            ]
          }
        };
      }
    
      onBlurAndUpdate = (e) => {
        console.log(e.target);
      };
    
      render() {
        return !!this.state.data ? (
          <>
            <TableTemplate
              onBlurAndUpdate={this.onBlurAndUpdate}
              data={this.state.data}
            />
          </>
        ) : (
          ""
        );
      }
    }
    
    const TableTemplate = ({ data, onBlurAndUpdate }) => {
      let head = data.content.map((el) => Object.keys(el))[0];
      let body = data.content.map((el) => Object.values(el));
    
      return (
        <table className="table table-bordered">
          <TableHead head={head} />
          <tbody>
            {body.map((el, i) => (
              <TableRow
                key={i}
                onBlurAndUpdate={onBlurAndUpdate}
                head={head}
                body={el}
              />
            ))}
          </tbody>
        </table>
      );
    };
    
    const TableHead = ({ head }) => {
      return (
        <thead>
          <tr>
            {head.map((el, i) => (
              <th key={i} scope="col" style={{ border: "2px solid red" }}>
                {el}
              </th>
            ))}
          </tr>
        </thead>
      );
    };
    
    const TableRow = ({ body, head, onBlurAndUpdate }) => {
      return (
        <tr>
          {body.map((el, i) => (
            <TableCell
              key={i}
              onBlurAndUpdate={onBlurAndUpdate}
              data={el}
              index={i}
              head={head}
            />
          ))}
        </tr>
      );
    };
    
    const TableCell = ({ data, index, head, onBlurAndUpdate }) => {
      return (
        <>
          {head[index] !== "id" amp;amp; head[index] !== "formId" ? (
            <td
              key={index}
              style={{ position: "relative", border: "2px solid green" }}
              onClick={(e) => onBlurAndUpdate(e)}
            >
              {data}
              <i
                className={"fas fa-pencil-alt"}
                style={{
                  position: "absolute",
                  right: "10px",
                  border: "2px solid green"
                }}
              />
            </td>
          ) : (
            <td key={index} style={{ border: "2px solid green" }}>
              {data}
            </td>
          )}
        </>
      );
    };
  

Может быть, есть какой-нибудь хороший способ сделать это

Ответ №1:

Я думаю, вы можете просто добавить идентификатор в td, идентификатор будет равен

 id=`cell_${index}` 
  

например, чтобы вы были уверены, что каждый идентификатор уникален, и тогда вы можете получить доступ к каждой ячейке без проблем, выполнив getElementById (идентификатор), а затем изменить все, что вы хотите в td или его дочерних элементах