Как редактировать строку reactjs

Хочу реализовать редактирование строк в todo приложении. Не представляю как сделать не используя prompt и собственное поле для ввода текста. Когда нажимаешь на кнопку, мне убрать текст и поставить инпут с текущем значением? или как сделать...


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

Автор решения: Konstantin Modin

Можно вместо текста показывать input когда пользователь нажимает на кнопку редактировать. Для этого необходимо иметь стейт updatedItem в котором будем хранить ID элемента который редактируется (только 1 в конкретный момент). В компонент элемента списка <ListItem /> передаём функции для обновления списка, обновления updatedItem ну и сам updatedItem. Получается примерно так:

// import React from "react";

const toDoList = [
  { id: 1, title: "Shopping", finished: false },
  { id: 2, title: "Do homework", finished: false },
  { id: 3, title: "Relax", finished: false },
];

const App = () => {
  const [list, setList] = React.useState(toDoList);
  const [updatedItem, setUpdatedItem] = React.useState(null);

  return (
    <div>
      <h3>My todos:</h3>
      <div>
        {list.map((item, idx) => (
          <ListItem
            key={item.id}
            item={item}
            idx={idx}
            setList={setList}
            updatedItem={updatedItem}
            setUpdatedItem={setUpdatedItem}
          />
        ))}
      </div>
    </div>
  );
};

const ListItem = ({
  item: { id, title },
  idx,
  setList,
  updatedItem,
  setUpdatedItem,
}) => {
  const isCurrentBeingUpdated = updatedItem === id;

  const handleInputChange = ({ target: { value } }) => {
    setList((prevList) =>
      prevList.map((item) =>
        item.id === id ? { ...item, title: value } : item
      )
    );
  };

  const renderTitleOrInput = () => {
    return isCurrentBeingUpdated ? (
      <input value={title} onChange={handleInputChange} />
    ) : (
      title
    );
  };

  return (
    <div style={{ border: "1px solid navy", margin: "1rem", padding: "1rem" }}>
      <div>
        {idx + 1}. {renderTitleOrInput()}
      </div>
      <button onClick={() => setUpdatedItem(isCurrentBeingUpdated ? null : id)}>
        {isCurrentBeingUpdated ? "Save" : "Edit"}
      </button>
    </div>
  );
};

// export default App;

ReactDOM.render(<App />, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/17.0.1/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.1/umd/react-dom.production.min.js"></script>
<div id="root"></div>

→ Ссылка