javascript 无法防止表单提交时出现默认值|第3集

kcwpcxri  于 2023-02-28  发布在  Java
关注(0)|答案(5)|浏览(179)
  • 使用Vue 3.0.5*

我有一张表格:

<form id="app" @submit="onSubmit">
    <input type="text">
    <input type="text">
    <button type="submit">submit</button>
</form>

和Vue组件:

Vue.createApp({
    data() {
        return {}
    },
    methods: {
        onSubmit(e) {
            e.preventDefault();
        }
    }
}).mount('#app');

并且似乎不能阻止页面在表单提交时重新加载。在上面的版本中,我在方法中使用了e.preventDefault()。我还尝试了:

  • @submit.prevent而不是手动调用e.preventDefault()
  • 调用e.preventDefault()时出现v-on:submit
  • v-on:submit.prevent,无需调用
  • @submit.prevent/v-on:submit.prevent,同时手动调用

除了恢复到Vue 2,似乎什么都不起作用。也许是Vue 3的问题,或者是我错过的一些怪癖?

8e2ybdfx

8e2ybdfx1#

一种解决方法是将form Package 在另一个元素(如div)中,并将其用作挂载点:

<script src="https://unpkg.com/vue@3.0.5"></script>

<div id="app">
  <form @submit.prevent="onSubmit">
      <input type="text">
      <input type="text">
      <button type="submit">submit</button>
  </form>
</div>

<script>
Vue.createApp({
  methods: {
    onSubmit() {
      console.log('submit')
    }
  }
}).mount('#app')
</script>
os8fio9y

os8fio9y2#

你可以让按钮类型为button,然后只做一个点击事件来做你想做的事情。这应该可以防止它重新加载
比如:

<form id="app">
    <input type="text">
    <input type="text">
    <button type="button" @click="yourFunction">submit</button>
</form>

问题出在您的按钮类型上。如果您愿意,您也可以在按钮上而不是窗体上防止默认值。

j2qf4p5b

j2qf4p5b3#

<template>
    <form id="app" @submit.prevent="onSubmit">
        <input type="text" />
        <input type="text" />
        <button type="submit">submit</button>
    </form>
</template>

<script>
    export default {
        name: "App",
        data() {
            return {};
        },
        methods: {
            onSubmit(e) {
                console.log(e);
            }
        }
    };
</script>

这可以正常工作。默认设置是这样阻止@submit.prevent="onSubmit"
在vue3应用程序上测试。

a8jjtwal

a8jjtwal4#

使用@submit.prevent而不使用e.preventDefault() ..vue2和3,两个版本都将自动处理事件传播。
由于这是一个Comman事件,调用vue会为我们处理这个问题,而且还因为methods()假设用于数据逻辑而不是DOM操作
参考-链接

e4eetjau

e4eetjau5#

以下是使用Vue 3Composition API的解决方案。请注意,此示例使用<script setup>和node。

<script setup>
import {ref} from 'vue';

const formName = ref('');
const formEmail = ref('');
const formMessage = ref('');

function submitForm(){
    console.log(formName.value);
    console.log(formEmail.value);
    console.log(formMessage.value);
}
</script>

<template>
  <form @submit.prevent="submitForm">
     <input v-model="formName" type="text" >
     <input v-model="formEmail" type="text">
     <textarea v-model="formMessage" cols="30" rows="10"></textarea>
     <button type="submit">Submit</button>
  </form>
</template>

相关问题