Как дождаться данных из модала, чтобы продолжить функцию?

Я использую модальный ответ, если пользователь хочет удалить некоторые данные. Мне нужен его ответ, чтобы продолжить функцию и удалить или нет, в зависимости от того, что было выбрано. Вот мой код: Я использую imagem для вызова функции:

<img src = {deletes} width = "25" height = "25" alt = "Edit" onClick = {(e)=>deleteHandler()} className = "imagemEnter"/>

Это функция называется:

const [modal, setModal] = useState({
    isOpen: false,
    type: "",
    frase: "",
    confirm: ""
  });

function deleteHandler(){
    setModal({ isOpen: true, type: "sure?", frase:"Are you sure that you want to remove this data?", confirm:false });
console.info(modal.confirm);
}

Это мой модальный:

function ModalConfirm(props) {
  const { modal, setModal } = props;

  function closeModal() {
    setModal({ ...modal, isOpen: false });
  }

  function backPage(){
    setModal({ ...modal, isOpen: false, confirm true});
  }

return (
    <div> 
      if (props.modal.tipo === "sure?") {
          return (
            <div>
              <Modal
                ariaHideApp = {false}
                isOpen = {modal.isOpen}
                onRequestClose = {closeModal}
                style = {{
                  overlay: {
                    position: "fixed",
                    top: 0,
                    left: 0,
                    right: 0,
                    bottom: 0,
                    opacity: 1,
                  },
                  content: {
                    textAlign: "center",
                    position: "absolute",
                    width: "500px",
                    height: "360px",
                    top: "130px",
                    left: "550px",
                    right: "500px",
                    bottom: "200px",
                    border: "1px solid #ccc",
                    overflow: "auto",
                    WebkitOverflowScrolling: "touch",
                    borderRadius: "10px",
                    outline: "none",
                    padding: "20px",
                  },
                }}
              >
                  <img src = {question} width = "150" height = "150" alt = "Question" />
                  <p></p>
                  <p className = "title">{props.modal.frase}</p>
                  <div>
                    <button
                      onClick = {closeModal}
                      titulo = "Cancel"
                    ></button>
                    <button
                      onClick = {backPage}
                      titulo = "Confirm"
                    ></button>
                  </div>
              </Modal>
            </div>
          );
        }
      })()}
    </div>
  );

При первом нажатии на удаление изображения сначала работает console.info(modal.confirm), затем закрывается модальное окно, и поэтому оно печатается пустым. Если я закрою модальное окно, нажав кнопку подтверждения, и снова попытаюсь щелкнуть «Удалить изображение», оно покажет «истина». Как я могу сделать остальную часть функции в зависимости от того, что возвращает модальное окно?

Разрешение:

Модальный:

const { confirmDelete, modal, setModal } = props;
function backPage(){
    confirmDelete(true);
    setModal({ ...modal, isOpen: false});
  }

Основной:

const [confirmDelete, setConfirmDelete] = useState(false);
const [modal, setModal] = useState({
    isOpen: false,
    type: "",
    frase: ""
  });
function delete(valor) {
    if (valor) {
//delete fetch
}
function deleteHandler() {
    setModal({
      isOpen: true,
      tipo: "sure?",
      frase: "Are you sure that you want to remove this data?",
    });
  }
return(
....
<Modal
        confirmDelete = {confirmDelete}
        modal = {modal}
        setModal = {setModal}
      />
)
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Вы можете сделать это, поместив фактическое удаление данных («остальная часть функции») в другую функцию, которую вы передаете в реквизитах модального окна.

В модальном режиме вы вызываете эту функцию внутри backPage. Таким образом, удаление будет вызвано только в том случае, если пользователь подтвердит.

Таким образом, modal.confirm не нужен.

Вы должны предоставить информацию, например, где находится ваш модальный компонент в дереве компонентов.

Но что вам нужно сделать, так это передать данные из вашего компонента Modal. Это вы можете сделать двумя способами:

1. Если вы используете локальное состояние

Вам нужно иметь Modal в качестве дочернего компонента компонента, из которого вы хотите удалить.

Добавьте это туда, где вы хотите выполнить удаление:

const [confirmDelete, setConfirmDelete] = useState(false)

function handleConfirmDelete(value) {
  confirmDelete(value)
}

useEffect(() => {
  if (confirmDelete) {
    // delete 
    setConfirmDelete(false)
  }
}, [confirmDelete, setConfirmDelete])

Передайте handleConfirmDelete в качестве поддержки Modal:

<Modal handleConfirmDelete = {handleConfirmDelete} modal = {modal} setModal = {setModal} />

Вызов дескриптораConfirmDelete from backPage()

function backPage(){
    handleConfirmDelete(true)
    setModal({ ...modal, isOpen: false, confirm true});
}

2. Если вы используете какую-либо библиотеку управления состоянием, например Redux

Создайте состояние в редуксе, например confirmDelete как boolean, и отправьте действие, чтобы установить его в значение true внутри функции backPage. Затем используйте это значение в компоненте, где вы хотите выполнить удаление внутри useEffect, как указано выше.

пожалуйста, исправьте ошибки в коде.

drdrej 24.11.2022 21:43

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