禁止弹窗再使用disabled时出现了问题,写死成true或者false测试一波可以实现,但增加后端接口判断,动态赋值时出现问题了,disabled绑定的值确实是可以动态改变(console.log()查看),但是窗口却一直可以打开。当时就怀疑是异步的问题,就在使用async和await,也还是一样

Google解决

Google对应方案,目前只看到两种,一是disabled禁用(已证实不可行),二是通过e.stopPropagation()来阻止事件传播,第二个方案也不行,因为阻止后,没有对应的启用方法,打个比方Java中的try/catch,我捕获了异常,我处理完成后不能再往上抛出去了。对于第二种方式,去查了下相关资料,了解到js中的冒泡事件机制,它有点像栈,捕获的时候,从最外层到最内层,传播时从最内层到最外层。以如下代码为例,每个div上都有click事件,最内层时一个button按钮,也有对应的click事件,当js去捕获这些事件时,是从外层的f4到f1的顺序,当我们点击这个button时,button的click事件后,他会继续向上传递,所有的click执行顺序时f1->f2->f3->f4。

<div @ click = "f4" > <div @ click = "f3" > <div @ click = "f2" > <a-button @ click = "f1" >test</a-button>

再了解js冒泡事件机制后,当时就想到了那可不可以先阻止事件,再通过模拟点击的方式将点击事件向上传播,经过一番调式,功能完美实现,如下所示(代码下面只展示了重要部分),html中再button的外层增加一个div,并绑定一个唯一id(我这里时流程code)点击上传按钮时,先默认阻止事件传播,再去判断,通过后使用 document.getElementById(record.processDefinitionCode).click() 模拟点击button父级的div,这样继续将事件向上传递,又不会触发button的click事件导致死循环

<a-card :bordered="false">
        <a-table
          ref="table"
          size="middle"
          rowKey="id"
          :columns="columns"
          :dataSource="dataSourceUpload"
          :loading="loading"
          class="j-table-force-nowrap"
          @change="handleTableChange"
          <span slot="url" slot-scope="text, record">
            <a :href="record.downloadurl"> {{ record.datatype }}下载链接 </a>
          </span>
          <span slot="type" slot-scope="text, record">
            <a-upload
              name="file"
              :showUploadList="false"
              v-has="'srbmp_business:import'"
              :multiple="false"
              :headers="tokenHeader"
              :action="record.action | formatAction"
              @change="handleImportExcel"
              <div :id="record.processDefinitionCode">
                <a-button type="primary" icon="import" @click="(e) => openProcessDefinition(e, record)"
                  >导入{{ record.datatype }}</a-button
            </a-upload>
          </span>
        </a-table>
    </a-card>
    async openProcessDefinition(e, record) {
      // 利用js冒泡事件机制和模拟点击事件来实现a-upload组件的弹出框限制
      // 点击上传button按钮默认阻止冒泡事件传递
      e.stopPropagation() // 阻止事件冒泡到父元素
      this.processDefinitionCode = record.processDefinitionCode
      const ref = await getAction(`/scheduler/get/task/${record.processDefinitionCode}`)
      if (ref.code != 200) {
        this.$message.error(ref.message)
      } else {
        if (!ref.result || ref.result.state !== 1) {
          // 校验通过,模拟点击button按钮的上级div,将点击事件冒泡传递到a-upload上打开选择文件窗口
          document.getElementById(record.processDefinitionCode).click()
        } else {
          this.$message.warning(`${record.datatype}流程正在进行中,请稍后再试!`)
    12345芝麻糖葫芦
        Java开发
       
粉丝