Как изменить порядок динамических входов в реакции?

Я новичок в React и пока научился программировать только с помощью хуков.

Я сделал динамические входы, где пользователь может добавить столько входов, сколько захочет. Я хотел бы позволить пользователю изменить порядок входов.

Я попробовал некоторый код (см. Ниже), но это закончилось предупреждением.

Предупреждение: компонент изменяет управляемый вход на неуправляемый.

Как я могу изменить порядок входов?

const Questions = ({ questionsData, setQuestionsData, title, id }) => {
  console.info(questionsData);
  const handleSave = async () => {
    if (id) {
      try {
        const response = await axios.post("http://localhost:3001/update", {
          id: id,
          title: title,
          questions: questionsData,
        });
        alert(response.data);
      } catch (error) {
        console.info(error.message);
      }
    } else if (!id && title !== "") {
      try {
        const response = await axios.post("http://localhost:3001/create", {
          title: title,
          questions: questionsData,
        });
        alert(response.data.message);
      } catch (error) {
        console.info(error.message);
      }
    } else {
      alert("Le Formulaire doit avoir un titre.");
    }
  };

  return (
    <>
      {questionsData.map((question, index) => {
        return (
          <div key = {question + index} className = "questions">
            <div className = {question.type === "texte" ? "orange" : "red"}>
              <span>{question.type === "texte" ? "1" : "2"}</span>
              <img src = {Minus} alt = "" />
              <img
                src = {question.type === "texte" ? FileWhite : StarWhite}
                alt = ""
              />
            </div>
            <input
              type = "text"
              placeholder = "Ecrivez votre question"
              value = {question.title}
              onChange = {(event) => {
                let tab = [...questionsData];
                tab[index].title = event.target.value;
                tab[index].index = index;
                setQuestionsData(tab);
              }}
            ></input>
            <div>
              <img
                src = {ChevronUp}
                alt = "move up"
                onClick = {() => {
                  let tab = [...questionsData];
                  let item = tab.splice(index, 1);
                  tab.splice(index + 1, 0, item);
                  setQuestionsData(tab);
                }}
              />
              <img src = {ChevronDown} alt = "move down" />
              <img
                src = {SmallTrash}
                alt = "delete question"
                onClick = {() => {
                  let tab = [...questionsData];
                  tab.splice(index, 1);
                  setQuestionsData(tab);
                }}
              />
            </div>
          </div>
        );
      })}
      <div className = "questionType">
        <div
          className = "addText"
          onClick = {() => {
            let tab = [...questionsData];
            tab.push({ type: "texte", title: "", index: "" });
            setQuestionsData(tab);
          }}
        >
          <img src = {File} alt = "" />
          <p>Ajouter une question "Texte"</p>
        </div>
        <div
          className = "addNote"
          onClick = {() => {
            let tab = [...questionsData];
            tab.push({ type: "note", title: "", index: "" });
            setQuestionsData(tab);
          }}
        >
          <img src = {Star} alt = "" />
          <p>Ajouter une question "Note"</p>
        </div>
      </div>
      <div className = "save">
        <button onClick = {handleSave}>Sauvegarder</button>
      </div>
    </>
  );
};

export default Questions;
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
0
409
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша логика перемещения вверх добавляет к индексу, который должен быть index-1, также обязательно проверяйте границы массива, если index+1 меньше или равно questions.length и index-1 больше 0. Я исправил проблему с перемещением вверх в песочнице. Проверьте ниже.

https://codesandbox.io/s/eager-chatelet-ryo41?file=/src/Questions.js

Да, извините, я изменил движение вверх после того, как вставил код сюда. Я просто забыл в моем onclick двигаться вверх и вниз, чтобы добавить [0] к элементу. Я написал tab.splice(index + 1, 0, item); вместо tab.splice(index + 1, 0, item[0]); Теперь он работает отлично. Большое вам спасибо за вашу помощь !

Florie Anstett 16.12.2020 11:31

@FlorieAnstett отметьте ответ как одобренный, если он правильный.

Anuja 16.12.2020 13:45

Другие вопросы по теме