【问题标题】:VueJs - preventDefault() on form submissionVueJs - 表单提交时的 preventDefault()
【发布时间】:2018-08-07 17:07:39
【问题描述】:

我需要以编程方式提交表单,但我也需要将其发送到preventDefault

现在我有以下内容:

submit() {
  this.$refs.form.submit()
}

它工作正常,但我不能阻止默认提交,最终刷新页面。

【问题讨论】:

  • 如何调用submit() 函数?不是$refs,而是外部函数?
  • 我将其称为@click="submit"。我知道我为什么这样做听起来很奇怪,但这是因为我正在为我的表单创建一个包装器,我不想提交表单。所以我有类似的东西:。所以基本上我需要按钮来提交表单,如果我可以让表单以编程方式正确提交,这可以通过表单中的一个插槽来完成。
  • 您需要 preventDefault 因为您想在提交表单之前“做某事”?当这个“事情”完成后,你想以编程方式提交它吗?

标签: vue.js preventdefault


【解决方案1】:

简答

您可以将.prevent 修饰符添加到@submit(或您正在使用的任何其他v-on),如下所示:

<form @submit.prevent="myMethod">
  <button type="submit"></button>
</form>

在提交表单的情况下,这将阻止刷新页面的默认行为。

长答案

有几种方法可以修改事件。

From the Vue 3 docs:

拨打event.preventDefault()event.stopPropagation() 内部事件处理程序。虽然我们可以做到这一点 很容易在方法中,如果方法可以是纯粹的就更好了 关于数据逻辑,而不必处理 DOM 事件细节。

为了解决这个问题,Vue 为 v-on 提供了事件修饰符。记起 修饰符是用点表示的指令后缀。

<!-- the click event's propagation will be stopped -->
<a @click.stop="doThis"></a>

<!-- the submit event will no longer reload the page -->
<form @submit.prevent="onSubmit"></form>

<!-- modifiers can be chained -->
<a @click.stop.prevent="doThat"></a>

<!-- just the modifier -->
<form @submit.prevent></form>

<!-- use capture mode when adding the event listener -->
<!-- i.e. an event targeting an inner element is handled here before being handled by that element -->
<div @click.capture="doThis">...</div>

<!-- only trigger handler if event.target is the element itself -->
<!-- i.e. not from a child element -->
<div @click.self="doThat">...</div>

Another option:

有时我们还需要在内联语句处理程序中访问原始 DOM 事件。您可以使用特殊的 $event 变量将其传递给方法:

<button @click="warn('Form cannot be submitted yet.', $event)">
  Submit
</button>
// ...
methods: {
  warn: function (message, event) {
    // now we have access to the native event
    if (event) {
      event.preventDefault()
    }
    alert(message)
  }
}

干杯:)

【讨论】:

    【解决方案2】:

    不太明白@Armin Ayari 的回答,例如为什么代码必须在methods 对象中?无论如何,在 Vue 中,这对我有用:

    <form ref="form" @submit.prevent="myMethod">
      <button type="submit"></button>
    </form>
    

    这阻止了页面刷新并改为调用myMethod

    您甚至不需要ref。明白这是一个老问题,但我在调试后发现自己在这里,发现我的表单标签根本放错了位置。

    【讨论】:

      【解决方案3】:

      我不知道我是否正确理解了您的问题,但您可以像这样阻止表单的默认行为:

      this.$refs.form.addEventListener("submit", (event) => {
          event.preventDefault()
      });
      

      也许这可以帮助你:

      new Vue({
        el: '#app',
        data: {},
        methods: {
          submit () {
            this.$refs.form.addEventListener('submit', event => {
              event.preventDefault()
            })
          },
          alert () {
            alert('hello')
          }
        }
      })
      <body>
        <script src="https://cdn.jsdelivr.net/npm/vue@2.5.17/dist/vue.js"></script>
        <div id='app'>
          <div class="form-wrapper" @click='submit'>
            <form ref='form' @submit='alert'>
              <input type="text">
              <button type='submit'>Submit</button>
            </form>
          </div>
        </div>
      </body>

      【讨论】:

      • 阿明谢谢!这就是我要去的地方。我需要提交表单,但不需要刷新页面,就像我正常提交表单时一样。我需要此功能,因为我需要发出一个事件,该表单已提交并且我不需要验证的浏览器功能(例如,必需)。
      • @MaltheBjerregaardPetersen 那么您正在寻找这个答案吗?
      【解决方案4】:

      我认为这是多纳帮助!

      <form method="POST" action="http::localhost:8080/" @submit.prevent="submit_login($event)">
          // enter yours inputs here
      </form>
      
      
      submit_login(e) {
          if (true) {
              e.target.submit();
          },
      },
      

      【讨论】:

        【解决方案5】:

        首先,不要使用 preventDefault 方法。我将在 jQuery 上说明这个问题:

        $('#myForm').on('submit', function (event) {
          // step 1.
          // stop current action, prevent submitting 
          event.preventDefault()
        
          // step 2.
          // validate inputs
          // some validation code
        
          // step 3.
          // everything ok, submit it
          this.submit()
        })
        

        这段代码哪里出了问题?当您在第 3 步中以编程方式提交此表单时,它将再次被捕获并再次在第 1 步停止。因此,您将永远无法提交此表格。解决方案:

        $('#myForm').on('submit', function (event) {
          // step 1.
          // validate inputs
          // some validation code
          // this code will be always executed
          // before this form will be submitted
        
          // step 2.
          // then do something like this
          // continue submitting form and exit
          // this callback with returning true
          if (inputsAre === 'ok') return true
          // if inputs are not ok, program continues
          // with following line, which ends this
          // callback with false and form will be not submitted
          return false
        })
        

        我希望你明白了。所以,我认为你需要的不是 preventDefault 方法,而是在 @submit 事件调用的 doSomething 方法中返回 true 或 return false。

        【讨论】:

        • 嗨弗拉迪斯拉夫。我知道你要去哪里,但是当表单最后提交时,它会刷新页面,对吧?
        • 是的。成功的表单提交涉及页面刷新。所以,真正的解决方案是使用普通按钮,而不是提交类型,添加一个@click处理程序,并在这个处理程序中获取formData并使用ajax进行发布请求。
        猜你喜欢
        • 2020-09-23
        • 1970-01-01
        • 2013-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-26
        • 1970-01-01
        相关资源
        最近更新 更多