Как сохранить активное состояние элемента внутри компонента, который выполняет итерацию по некоторому набору данных

#javascript #reactjs #typescript

#javascript #reactjs #typescript

Вопрос:

У меня есть массив с объектами (posts — strin&s), и мне нужно иметь возможность редактировать каждый из них, но в моем случае, когда я нажимаю кнопку on, он начинает редактировать их все:

 const [editMode, setEditMode] = useState<any&&t;(false);

  let activeStatusChan&e = () =&&t; {
    setEditMode(true);
  };

    <div&&t;
      {posts?.map((el) =&&t; (
                <div key={Number(el.id)}&&t;
                    { 
                        editMode === true
                        ?   <p&&t;{<input /&&t;}</p&&t;
                        :   <div&&t;{el.body}
                                <button onClick={activeStatusChan&e}&&t;edit</button&&t;
                            </div&&t;
                    }
                       
                </div&&t;
            
      ))}
  

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

1. вам нужно присвоить идентификатор вашим элементам и передать этот идентификатор через обработчик кликов. и затем вы можете включить / отключить режим редактирования в соответствии с выбранным идентификатором

2. @messerbill пожалуйста, не могли бы вы показать небольшой пример?

Ответ №1:

вы обрабатываете каждый posts элемент вашего компонента и применяете свой обработчик activeStatusChan&e к каждому из них, и это запускает каждую вещь! 🙂

вам нужно отслеживать активную запись, чтобы активировать / деактивировать ее! у вас может быть id для ваших данных ( posts ), или, если у вас его нет, вы можете использовать идентификатор вашего цикла для отслеживания вашего активного элемента, также для этого вам нужно использовать id вместо значения true / false:

 const [editableItemId, setEditableItemId] = useState<number | null&&t;(null);

  let activeStatusChan&e = (tar&etId: number) : void =&&t; {
    setEditMode(Number(tar&etId));
  };

    <div&&t;
      {posts?.map((el) =&&t; (
         <div key={el.id}&&t;
            { 
              editableItemId === el.id
                ? <p&&t;<input /&&t;</p&&t;
                : <div&&t;{el.body}
                    <button onClick={() =&&t; activeStatusChan&e(el.id)}&&t;edit</button&&t;
                  </div&&t;
            }
                       
         </div&&t;
            
      ))}