Как создать редактируемую таблицу React с компонентом таблицы NextUI

Я построил таблицу с компонентом таблицы NextUI, и хотя я определил onChange для своих элементов ввода, в них невозможно ввести значение.

Я пробовал различные элементы, и если я заменю таблицу NextUI стандартной таблицей HTML, этот компонент React будет работать без проблем.

Это код компонента React, который должен возвращать редактируемую таблицу на основе компонента таблицы NextUI. Что не так с кодом этого компонента?

import { useState } from 'react'
//import './index.css'
import { Table, Row, Col, Tooltip, User, Text } from "@nextui-org/react";
import { Input, Spacer } from "@nextui-org/react";

const data = [
    {
        employeeId: '01',
        name: 'John Doe',
        email: '[email protected]',
        position: 'Frontend Developer',
    },
    {
        employeeId: '02',
        name: 'Sara',
        email: '[email protected]',
        position: 'HR Executive',
    },
    {
        employeeId: '03',
        name: 'Mike',
        email: '[email protected]',
        position: 'Backend Developer',
    },
]

const EditableTable = () => {
    const [employeeData, setEmployeeData] = useState(data)

    const onChangeInput = (e, employeeId) => {
        const { name, value } = e.target

        const editData = employeeData.map((item) =>
            item.employeeId === employeeId && name ? { ...item, [name]: value } : item
        )

        setEmployeeData(editData)
    }

    return (
        <div className = "container">


            <h1 className = "title">ReactJS Editable Table with NextUI Table</h1>
            <Table
                aria-label = "Example table with static content"
                css = {{
                    height: "auto",
                    minWidth: "100%",
                }}
            >
                <Table.Header>
                    <Table.Column>NAME</Table.Column>
                    <Table.Column>ROLE</Table.Column>
                    <Table.Column>STATUS</Table.Column>
                </Table.Header>
                <Table.Body>
                    {employeeData.map(({ employeeId, name, email, position }) => (
                        <Table.Row key = {employeeId}>
                            <Table.Cell>
                                <Input
                                    aria-label = "test"
                                    name = "name"
                                    value = {name}
                                    type = "text"
                                    onChange = {(e) => onChangeInput(e, employeeId)}

                                />
                            </Table.Cell>
                            <Table.Cell>
                                <Input
                                    aria-label = "test"
                                    name = "name"
                                    value = {position}
                                    type = "text"
                                    onChange = {(e) => onChangeInput(e, employeeId)}
                                />
                            </Table.Cell>
                            <Table.Cell>
                                <Input
                                    aria-label = "test"
                                    name = "name"
                                    value = {email}
                                    type = "text"
                                    onChange = {(e) => onChangeInput(e, employeeId)}

                                />

                            </Table.Cell>
                        </Table.Row>
                    ))}
                </Table.Body>
            </Table>



        </div>
    )
}

export default EditableTable
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
115
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

На самом деле кажется, что проблема возникла из-за того, что фокус не был на элементе ввода.

Мне удалось решить эту проблему, создав настраиваемый компонент ввода, в котором я обрабатываю фокус с помощью события onClick. Вот код этого компонента:

import React from "react";
import { Input } from "@nextui-org/react";


class TextInput extends React.Component {
 constructor(props) {
  super(props);
  this.textInput = React.createRef();
  this.focusTextInput = this.focusTextInput.bind(this);
}

focusTextInput() {
 this.textInput.current.focus();
}

render() {
 return (
   <div>
    <Input
      type = "text"
      ref = {this.textInput}
      onClick = {this.focusTextInput}
      size = "xs"
      aria-label = "Default msg"
    />
  </div>
  );
 }
}
export default TextInput;

Затем просто импортируйте этот компонент в код, использующий табличный компонент NextUI, и используйте его в качестве входных данных для ячеек таблицы.

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