Проблема с обновлением данных с запросом POST на React

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

Я думаю, что мне нужно передать состояние из App.js 'characters'. Возможно ошибаюсь. Если и правда нужно состояние передать, то как его передать в стейт?

Подскажите пожалуйста, в чем мои ошибки? Прилагаю пример данных json на сервере, Table.js, App.js

class Table extends Component {
    state = {
        isEdit: false,
    }

    onChange = (event) => {
        const { name, value } = event.target;

        this.setState(state => ({
            data: {
                ...state.data,
                [name]: value,
            }
        }));
    }

    saveChange = async (_id) => {

        const data = {
            data: {
                name: this.state.data.name,
                email: this.state.data.email,
                age: this.state.data.age,
            },
        };

        await fetch('http://178.128.196.163:3000/api/records/' + _id, {
            method: 'POST',
            body: JSON.stringify(data),
        })
            .then(() => {console.log(data)})
            .then(() => console.log(_id));
        this.state.isEdit = false;
    }

    onEdit(_id) {
        window.localStorage.setItem("personaId", _id);
        this.state.isEdit = true;
        this.state._id = _id;
    }

    cancelChange() {
        this.state.isEdit = false;
    }


    render() {
        const {characterData, removeCharacter} = this.props;
        const isChange = this.state.isEdit;
        const {name, email, age} = this.state;

        return(
            <table>
                <thead>
                <tr>
                    <th>Name</th>
                    <th>Email</th>
                    <th>Age</th>
                    <th>Actions</th>
                </tr>
                </thead>
                <tbody>
                {characterData.map((row, _id) => {
                    return (
                        <tr key={row._id}>
                            {isChange && window.localStorage.getItem("personaId") === row._id ?
                                <td><input type='text'
                                           name='name'
                                           id='name'
                                           defaultValue={row.data.name}
                                           value={name}
                                           onChange={this.onChange} />
                                </td> : <td>{row.data.name}</td>}
                            {isChange && window.localStorage.getItem("personaId") === row._id ?
                                <td><input type='text'
                                           name='email'
                                           id='email'
                                           defaultValue={row.data.email}
                                           value={email}
                                           onChange={this.onChange} />
                                </td> : <td>{row.data.email}</td>}
                            {isChange && window.localStorage.getItem("personaId") === row._id ?
                                <td><input type='text'
                                           name='age'
                                           id='age'
                                           defaultValue={row.data.age}
                                           value={age}
                                           onChange={this.onChange} />
                                </td> : <td>{row.data.age}</td>}
                            {isChange && window.localStorage.getItem("personaId") === row._id ?
                                <td>
                                    <button onClick={() => this.saveChange(row._id)}>Save</button>
                                    <button onClick={() => this.cancelChange()}>Cancel</button>
                                </td> :
                                <td>
                                    <button onClick={() => this.onEdit(row._id)}>Edit</button>
                                    <button onClick={() => removeCharacter(row._id)}>Delete</button>
                                </td>
                            }
                        </tr>
                    )
                })}
                </tbody>
            </table>
        )
    }
}
export default Table;

import React, { Component } from 'react';
import './App.css';
import Table from './Table';
import Form from './Form'

class App extends Component {
    state = {
        characters: [],
        isUpdate: false,
    }

    async componentDidMount() {
        await this.getPeople();
    }

    async componentDidUpdate() {
        await this.getPeople();
    }

    async getPeople() {
        await fetch ("http://178.128.196.163:3000/api/records")
            .then((result) => result.json())
            .then((result) => this.setState({characters: result,}))
            .catch(error => console.log(error));
    }


    removeCharacter = (_id) => {
        const {characters} = this.state;

        this.setState({
            characters: characters.filter((character, i) => {
                return i !== _id;
            })
        })

        fetch('http://178.128.196.163:3000/api/records/' + _id, {
            method: 'DELETE',
        })
            .then((result) => {
                return result.json();
            })
            .catch((error) => console.log(error))
    }

    render() {
        const {characters} = this.state;
        return (
            <div className='container'>
                <h1>React Table</h1>
                <p>Add a character with a name, an email and an age to the table.</p>
                <Table
                    characterData={characters}
                    removeCharacter={this.removeCharacter} />
                    <h3>Add New</h3>
                <Form />
            </div>
        )
    }
}

export default App;


Ответы (0 шт):