Как я могу использовать асинхронную функцию для ожидания события onClick () (Выбор между 2 кнопками в модальном режиме)

#javascript #reactjs #async-await #onclick #return

Вопрос:

Некоторый контекст: мне нужна функция асинхронного ожидания или Обещание/Решение вернуть выбранную пользователем кнопку выбора. Причина, по которой мне это нужно, заключается в том, что я вызываю функцию deletePost из определенного дочернего компонента Post, и мне нужен модал, существующий на уровне родительского компонента, чтобы предложить пользователю подтвердить удаление или Отменить. Затем мне нужно, чтобы это решение было возвращено компоненту дочерней записи, чтобы продолжить процесс удаления или отменить его в зависимости от того, какую кнопку пользователь нажимает в режиме.

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

 import React, { useState } from "react";

const Example = async () => {
  const [modalOpen, setModalOpen] = useState(false);

  const toggleModal = async () => {
    // Opens Modal
    setModalOpen(!modalOpen);

    let decision = null;  // should be "delete" or "cancel" for return

    /*
        This toggleModal() function will be called from within a child 
        component's deletePost() function to prompt a user for confirmation 
        of deletion or cancellation. Once the modal opens up, I believe I 
        need some kind of async await function HERE to wait on a click 
        decision from the user and then return that selected value all the 
        way back to the deletePost() function that was called from within 
        the child Post component.
    */

    return decision;
  };

  const modalStyle = {
    display: modalOpen ? "block" : "hidden",
  };

  return (
    <div>
      <button onClick={toggleModal}>Open Modal</button>
      <Modal style={modalStyle}>
        
        {/* How to link these buttons to the async await function above */}
        <button>Delete</button>
        <button>Cancel</button>
      </Modal>
      {posts.map((post, index) => (
          <Post
            key={post.id}
            post={post}
            toggleModal={toggleModal}
          />
      ))}
    </div>
  );
};

export default Example;
 

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

1. Ваши кнопки помечены как » Удалить » и » Отменить «, а не » Подтвердить » и » Отменить » в соответствии с вашим комментарием. Это немного отвлекает меня.

Ответ №1:

Я не уверен в вашем точном варианте использования, но если вы хотите знать , выбрал ли пользователь Cancel или Confirm , вы можете сделать это, прикрепив отдельное onClick событие к этим двум кнопкам.

 import React, { useState } from "react";

const Example = async () => {
  const [modalOpen, setModalOpen] = useState(false);

  const toggleModal = () => {
    // Opens Modal
    setModalOpen(!modalOpen);
  };
 
  const handleConfirm = () => { //confirm logic }
  const handleCancel = () => { //cancel logic }



  const modalStyle = {
    display: modalOpen ? "block" : "hidden",
  };

  return (
    <div>
      <button onClick={toggleModal}>Open Modal</button>
      <Modal style={modalStyle}>
        <button onClick={handleConfirm}>Confirm</button>
        <button onClick={handleCancel}>Cancel</button>
      </Modal>
    </div>
  );
};

export default Example;
 

Таким образом, вы сохраняете все методы отдельно, и вам даже не нужно использовать асинхронное ожидание, т. Е. Использовать для пользователя либо одну из этих кнопок.

Редактировать: Добавил этот код и поле, основываясь на моем понимании комментария op.

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

1. Нет, это не то, что я ищу. Позвольте мне объяснить. Мне нужна функция асинхронного ожидания, чтобы вернуть значение, содержащее кнопку выбора, выбранную пользователем. Причина, по которой мне это нужно, заключается в том, что я вызываю эту функцию из другого компонента, чтобы подтвердить удаление записи. Таким образом, решение продолжить этот вызов API для удаления сообщения должно быть подтверждено с помощью модального, и мне нужно дождаться решения пользователя

2. Тем не менее, я не понимаю, почему вам нужно ждать выбора пользователей. Даже если вы вызываете модальный компонент из другого компонента и в вызывающем компоненте есть логика удаления, вы все равно можете использовать этот подход привязки кнопок к функции обратного вызова, а затем продолжить на основе ввода пользователя, а не ждать ввода пользователя. Я добавил ссылку codesandbox в ответ, если я правильно понял, это то, что вы хотите. Дайте мне знать, если все будет иначе. Кроме того, я не уверен, существует ли что-то подобное или насколько это сложно с React.

3. Эй, я обновил вопрос и код, чтобы быть очень конкретным. Пожалуйста, также прочитайте комментарий в коде, чтобы полностью понять

4. Всегда ли виден ваш модальный компонент (содержащий кнопки удаления и отмены) или зависит от модального состояния? Кроме того, не удалось найти ссылку на метод deletePost, на который ссылается комментарий к коду : «затем верните выбранное значение обратно в функцию deletePost (), которая была вызвана из дочернего компонента Post».

5. Если возможно, можете ли вы создать песочницу с необходимыми компонентами и всем остальным?