Prime React – Как я могу сделать вновь добавленные строки мгновенно редактируемыми?

Я использую таблицу Prime React для отображения динамических данных в реакции. Я создал свой компонент с помощью документации datatable.

Когда я нажимаю кнопку «Добавить строку», я бы хотел, чтобы новая добавленная строка могла мгновенно редактироваться пользователем (желательно с фокусом клавиатуры, который я добавлю позже), без использования кнопки редактирования для редактирования пустой новой строки. Это возможно?

import { DataTable } from "primereact/datatable";
import { Column } from "primereact/column";
import { data } from "../data";
import { useState } from "react";
import { InputText } from "primereact/inputtext";

export const Table = () => {
  const [users, setUsers] = useState(data);

  const handleAddRow = (): void => {
    const newRow: any = {
      firstName: "",
      lastName: "",
      email: "",
      phone: "",
      freeTextField: "",
    };
    setUsers((prevList: any) => [newRow, ...prevList]);
  };

  const onRowEditComplete = (e: any) => {
    const _users = [...users];
    const { newData, index } = e;

    _users[index] = newData;

    setUsers(_users);
  };

  const textEditor = (options: any) => {
    return (
      <InputText
        type = "text"
        value = {options.value}
        onChange = {(e) => options.editorCallback(e.target.value)}
      />
    );
  };

  return (
    <div className = "table-wrapper">
      <h2 className = "table-name">PrimeReact data table</h2>
      <button onClick = {handleAddRow}>add row</button>

      <DataTable
        value = {users}
        tableStyle = {{ minWidth: "50rem" }}
        editMode = "row"
        onRowEditComplete = {onRowEditComplete}
      >
        <Column
          field = "firstName"
          header = "firstName"
          editor = {(options) => textEditor(options)}
        ></Column>
        <Column
          field = "lastName"
          header = "lastName"
          editor = {(options) => textEditor(options)}
        ></Column>
        <Column
          field = "email"
          header = "email"
          editor = {(options) => textEditor(options)}
        ></Column>
        <Column
          field = "phone"
          header = "phone"
          editor = {(options) => textEditor(options)}
        ></Column>
        <Column style = {{ maxWidth: "15%" }} rowEditor>
          edit
        </Column>
      </DataTable>
    </div>
  );
};
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
2
0
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это возможно с некоторыми изменениями в приведенном выше коде.

  1. Вам нужно ввести свойство dataKey в DataTable, это должно быть что-то уникальное для ваших данных и что-то, что вы можете добавить к данным при создании строки, я использовал id для демонстрационных целей.
  2. Вам необходимо ввести реквизит onRowEditChange, чтобы таблица могла обрабатывать программную активацию.
  3. Вам нужно ввести реквизит editingRows, который вы передадите в состоянии, которое будет указывать, какая строка находится в режиме редактирования. Это обрабатывается внутри таблицы с помощью реквизита dataKey, упомянутого в шаге 1.

См. приведенный ниже код, который поможет лучше понять вышеизложенные пункты.

* Я использовал некоторые жестко запрограммированные значения для состояния users, чтобы код мог работать. Не забудьте изменить значение ваших данных

export const Table = () => {
    const [users, setUsers] = useState([
        { id: 'john1', firstName: "John1", lastName: "Doe1", email: "[email protected]", phone: "1234567890", freeTextField: "Random1" },
        { id: '2', firstName: "John2", lastName: "Doe2", email: "[email protected]", phone: "2345678901", freeTextField: "Random2" },
        { id: '3', firstName: "John3", lastName: "Doe3", email: "[email protected]", phone: "3456789012", freeTextField: "Random3" },
        { id: '4', firstName: "John4", lastName: "Doe4", email: "[email protected]", phone: "4567890123", freeTextField: "Random4" },
        { id: '5', firstName: "John5", lastName: "Doe5", email: "[email protected]", phone: "5678901234", freeTextField: "Random5" },
    ]);
    const [editingRows, setEditingRows] = useState({});


    const handleAddRow = (): void => {
        const newRow: any = {
            id: users.length + 1,
            firstName: "",
            lastName: "",
            email: "",
            phone: "",
            freeTextField: "",
        };
        setUsers((prevList: any) => [newRow, ...prevList]);
        const val = {...{ [`${users.length + 1}`]: true }  }
        setEditingRows(val);
    };

    const onRowEditComplete = (e: any) => {
        const _users = [...users];
        const { newData, index } = e;

        _users[index] = newData;

        setUsers(_users);
    };

    const textEditor = (options: any) => {
        return (
            <InputText
                type = "text"
                value = {options.value}
                onChange = {(e) => options.editorCallback(e.target.value)}
            />
        );
    };

    const onRowEditChange = (e:any) => {
        setEditingRows(e.data);
    }

    return (
        <div className = "table-wrapper">
            <h2 className = "table-name">PrimeReact data table</h2>
            <button onClick = {handleAddRow}>add row</button>

            <DataTable
                value = {users}
                tableStyle = {{ minWidth: "50rem" }}
                editMode = "row"
                editingRows = {editingRows}
                dataKey = "id"
                onRowEditChange = {onRowEditChange}
                onRowEditComplete = {onRowEditComplete}
            >
                <Column
                    field = "firstName"
                    header = "firstName"
                    editor = {(options) => textEditor(options)}
                ></Column>
                <Column
                    field = "lastName"
                    header = "lastName"
                    editor = {(options) => textEditor(options)}
                ></Column>
                <Column
                    field = "email"
                    header = "email"
                    editor = {(options) => textEditor(options)}
                ></Column>
                <Column
                    field = "phone"
                    header = "phone"
                    editor = {(options) => textEditor(options)}
                ></Column>
                <Column style = {{ maxWidth: "15%" }} rowEditor>
                    edit
                </Column>
            </DataTable>
        </div>
    );
};

Другие вопросы по теме

Похожие вопросы