vue.js 如何等待点击按钮继续功能

x6h2sr28  于 2022-11-17  发布在  Vue.js
关注(0)|答案(1)|浏览(264)

我有一个带有按钮的弹出对话框的函数。我想等待按钮被单击后再执行函数的其余部分。我尝试使用Promise和AddEventListener,但无法找到它不工作的原因。有人能帮助我吗?(我使用Vue 3和Quasar)我有一个“const confirm”错误-对象可能是“null”。ts(2531)谢谢您的建议。
以下是我的模板的一部分:

<q-dialog persistent v-model="phoneDialogBank">
    <q-card>
        <q-card-section>
          <div class="items" v-for="formField in dynamicDialogFieldsVisible" :key="formField?.Key">
            <dynamic-form-field :form-field="formField"></dynamic-form-field>
          </div>
          <div class="row items-center justify-center">
            <q-btn color="primary" class="confirm-phone-dialog" v-close-popup>
              {{ t('signing-table.phoneDialogBank.ok') }}
            </q-btn>
          </div>
        </q-card-section>
    </q-card>
  </q-dialog>

下面是我的函数:

async function dynamicDialogBeforeSubmit() {
  const params = getParamsFromAdvisorDeviceBoolean();
  if (params && params.hasOwnProperty('dialogBeforeSubmit') && params.dialogBeforeSubmit) {
    phoneDialogBank.value = true;
    const confirm = document.querySelector('.confirm-phone-dialog');
    const waitForButtonClick = new Promise((resolve) => { confirm.addEventListener('click', resolve); });
    await waitForButtonClick.then(() => {
      dynamicDialogSave();
    });
    return;
  }
  dynamicDialogSave();
}
sdnqo3pr

sdnqo3pr1#

这个错误是因为你的按钮在一个有条件呈现的对话框中。所以如果没有对话框,那个DOM元素就不存在。我很好奇为什么你没有使用Vue的一些伟大的特性?比如把点击处理程序放在元素上,使用引用来定位DOM,而不是使用查询选择器和事件监听器。

<q-btn color="primary" class="confirm-phone-dialog" @click.prevent="dynamicDialogBeforeSubmit" v-close-popup>
   {{ t('signing-table.phoneDialogBank.ok') }}
</q-btn>

你的函数有点混淆了async和Promises。async / await只是一个Promise的语法糖。你现在写它的方式,你是在另一个Promise中 Package 一个Promise。

async function dynamicDialogBeforeSubmit() {
  const params = getParamsFromAdvisorDeviceBoolean();
  if (params && params.hasOwnProperty('dialogBeforeSubmit') && params.dialogBeforeSubmit) {
    phoneDialogBank.value = true;
    await dynamicDialogSave();
  } else {
   console.log('There was a problem')
  }
}

我应该注意到,您可能需要将一个对象传递给dynamicDialogSave(someObject),以便它实际保存一些内容。
事件监听器不是异步的,你也不想把它们 Package 在一个promise中。如果你想写它,最好把click监听器声明为一个单独的函数,在onMounted上触发,然后从任何异步函数中调用它。你还应该分离本机事件监听器onUnmounted,以避免Vue的内存泄漏。

相关问题