Реагирование, визуализация и редактирование объекта JSON. Заполнение данных на входных данных

#javascript #arrays #json #reactjs #forms

#javascript #массивы #json #reactjs #формы

Вопрос:

У меня есть такого рода предметы

 {
  asignaturaId: 1,
  content: {
    [question_var]: {
      elements: {
        text: 'text1',
        image: 'img1.jpg'
      }
    }
    [question_var]: {
      text: 'text2',
      image: 'image2.jpg'
    }
  }
}
 

единственное, что меняется, — это [question_var] часть и количество объектов content , которые включает в себя ключ.

Я хочу иметь возможность динамически записывать все данные на входных данных и иметь возможность заменять необходимые данные.

пока я понял это:

 [...]
<FormControl>
  <InputLabel htmlFor="modulo">Asignatura ID:</InputLabel>
  <Input id="asignaturaId" name="asignaturaId" value={arrayData[0]} onChange={(e) => setAsignaturaId(e.target.value)} />
</FormControl>
  
{arrayData.map(pregunta => {
  console.log(pregunta)
  return (
    <>
    <FormControl>
       <InputLabel htmlFor="texto">Texto:</InputLabel>
       <Input id="texto" name="texto" onLoad={() => setTexto(pregunta[1].elements.text)} value={pregunta[1].elements} onChange={(e) => setText(e.target.value)} />
    </FormControl>
[...]
 

что я опустил, так это то, что я взял объект, сделал Object.entries(myObject) и присвоил его arrayData массиву. asignaturaId будет только один ключ для каждого объекта, который я получаю, поэтому я могу легко передать это значение и изменить его при вводе. Проблема content в том, что, поскольку он динамичен и слишком сильно меняется, мне трудно использовать useEffect() hook для заполнения моего ввода данными, которые я получаю, и манипулирования ими в том же вводе без изменения других значений с помощью тех же ключей или прямо вперед, не имея возможности редактировать их вообще.

У меня есть 4 дня на решение этой проблемы. пожалуйста, помогите!

Редактировать: прошу прощения за мой английский, если я не ясно выразился, я хочу перезаписать объект, сохранив данные, которые пользователь не обновляет во внешнем интерфейсе.

Ответ №1:

Сначала очистите свой массив json в компоненте React hook и убедитесь, что каждый объект должен иметь уникальный ключ

 const [yourJson,setYourJson] = useState({
  asignaturaId: 1,
  content: {
    [question_var1]: {
      elements: {
        text: 'text1',
        image: 'img1.jpg'
      }
    },
    [question_var2]: {
      text: 'text2',
      image: 'image2.jpg'
    }
  }
});
 

Добавьте сеттер для добавления нового объекта в ваш json-контент

   const addNewData = (text, imgSrc) =>{
    let newIndex = Object.keys(yourJson.content).length   1;
    let newJson = yourJson;
    newJson.content[`question_var${newIndex}`] = {
      'text': text,
      'image': imgSrc
    }
    setYourJson({...newJson})
  }
 

И в обратном вызове рендеринга используйте это сопоставление

 <FormControl>
 {Object.keys(yourJson.content).map(key => (
       <InputLabel htmlFor="texto">{yourJson.content[key].text}</InputLabel>
       // <Input id="texto" name="texto" ....
      ))}
</FormControl>
 

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

1. Спасибо! Но я не имею в виду создавать новый объект, а перезаписывать уже существующие объекты, прошу прощения, если я недостаточно ясно выразился; я не являюсь носителем английского языка.

2. Кроме того, я выяснил с вашей помощью, как это сделать, я забыл поместить контролируемый var в функцию обратного вызова. Большое вам спасибо.

3. weclome;) кстати, я собирался предоставить вам это решение для вашего требования. если вам нужна какая-либо помощь, не стесняйтесь спрашивать