REACTJS Как обновить визуализацию текста по массиву

#javascript #reactjs

Вопрос:

У меня есть массив, и я хочу обновить ответы на вопросы в первом, а также в детях

Это основные данные

 import React, {useState} from 'react';

const data = [
    {
        name: "USA",
        questionsAnswers: [
            {id:1,name:"Validated"},
            {id:2,name:"Non Validate"},
            {id:3,name:"None"}
        ],
        children: [
            {
                name: "ALABAMA",
                questionsAnswers: [
                    {id:1,name:"Validated"},
                    {id:2,name:"Non Validate"},
                    {id:3,name:"None"}
                ],
            },
            {
                name: "FLORIDA",
                questionsAnswers: [
                    {id:1,name:"Validated"},
                    {id:2,name:"Non Validate"},
                    {id:3,name:"None"}
                ],
            }
        ]
    }
];


const DeData = () => {

    const [myData, setMyData] = useState(data);

    const handleInputChanges = (e, index) => {
        const {name, value} = e.target;
        const list = [...myData[0].questionsAnswers];
        list[index][name] = value;
         setMyData({...myData});
    };

    return (
               <>
            <ul>
                {myData[0].questionsAnswers?.map((item, index) => (
                    <input
                        className="InputStyle3"
                        style={{width: 400, height: 40, marginBottom: 13}}
                        onChange={(e) => handleInputChanges(e, index)}
                        type="text"
                        name="name"
                        value={item.name}
                    />
                ))}
            </ul>
            <ul>
                {myData[0].children?.map((item, index) => (
                    <>
                    <label>{item?.name}</label>
                {item?.questionsAnswers?.map((item, index) => (
                    <input
                    className="InputStyle3"
                    style={{width: 400, height: 40, marginBottom: 13}}
                    onChange={(e) => handleInputChanges(e, index)}
                    type="text"
                    name="name"
                    value={item.name}
                    />
                    ))}
                    </>
                ))}
            </ul>
        </>
    );
}

export default DeData;    


 

Я смог изменить его в первом вопросе с помощью приведенного выше кода

Я преобразую индекс во входное имя и слушаю изменения на входе

Но я изо всех сил пытаюсь изменить это в вопросе о детях

Онлайн-код : https://codesandbox.io/s/optimistic-lovelace-gwc4d?file=/src/App.js

Ответ №1:

Проблема в том, что вы пытаетесь повторно использовать изменения ввода как для родителей, так и для детей.

const list = [...myData[0].questionsAnswers]; в обработчике изменений вы всегда будете получать ответы на вопросы родителей, а не на вопросы детей. Потому что mydata-это ваша структура данных. Ваш обработчик дочерних изменений должен использовать myData[0].дочерние элементы и фильтр на основе названия состояний.

Комментарии:

1. Спасибо, я решил проблему, я добавил еще один onChangeHandler для вопросов детей