【问题标题】:How to implement a simple form with validation in a Vue app (with Vuetify.js)?如何在 Vue 应用程序(使用 Vuetify.js)中实现带有验证的简单表单?
【发布时间】:2018-06-09 12:32:08
【问题描述】:

我正在尝试使用 Vuetify.js 示例在使用 Vue.js 构建的网站上添加一个简单验证的联系表单。我是新手,所以我不确定它应该如何在 Vue 组件中实现。


我想实现一个简单的客户端表单验证,并使其与https://getform.org/ 表单一起使用。


更新:

代码 |联系.vue

(取自 Vuetify.js 表单 example

<v-form v-model="valid">
      <v-text-field
        label="Name"
        v-model="name"
        :rules="nameRules"
        :counter="10"
        required
        name="Name"
      ></v-text-field>

      <v-text-field
        label="E-mail"
        v-model="email"
        :rules="emailRules"
        required
        name="Email"
      ></v-text-field>

      <v-btn
          @click="submit"
          :disabled="!valid"
      >submit</v-btn>
  </v-form>

  <form method="post" action="https://www.getform.org/f/[MY_ID_HERE]" id="nativeForm"></form>

脚本

<script>
export default {
  name: 'contact',

  data () {
    return {
      snackbar: true, 
      valid: false,
        name: '',
        nameRules: [
          (v) => !!v || 'Name is required',
          (v) => v.length <= 10 || 'Name must be less than 10 characters'
        ],
        email: '',
        emailRules: [
          (v) => !!v || 'E-mail is required',
          (v) => /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(v) || 'E-mail must be valid'
        ]
      }
    },
    methods: {
      submit() {
        nativeForm.submit()
      }
    }
  }
</script>

【问题讨论】:

  • 看来您没有http://localhost:8080/api/submit 路由?你需要服务器端路由。我认为您的端口8080 用于客户端(即vuejs),因此您需要服务器端路由来提交表单
  • @Traxo 是的,但是,我必须创建它才能使表单工作吗?还是没那么简单?
  • 对于表单验证,您不需要路由,但对于提交数据,您可能需要。
  • @Traxo 谢谢,我看过这个例子,但我不明白这是我需要的(更新的问题)。但现在我从 getform API 得到message: null, email: null(问题中更新了代码)。 如果您知道如何将数据传递给第二个表单,这样它就不会发送出去null 请发布答案我会接受的

标签: javascript forms vue.js vuetify.js


【解决方案1】:

仅使用 1 个表单就可以使其工作:

<v-form method="post" action="https://www.getform.org/f/[YOUR-FORM-ID]" id="nativeForm" v-model="valid">

      <v-text-field
        label="Name"
        v-model="name"
        :rules="nameRules"
        :counter="10"
        required
        name="message"
      ></v-text-field>
      <v-text-field
        label="E-mail"
        v-model="email"
        :rules="emailRules"
        required
        name="mail"
      ></v-text-field>

      <v-btn @click="submit" :disabled="!valid">submit</v-btn>
 </v-form>

脚本

 <script>
    export default {
      name: 'contact',

      data () {
         return { 
            valid: false,
            name: '',
            nameRules: [
              (v) => !!v || 'Name is required',
              (v) => v.length <= 10 || 'Name must be less than 10 characters'
            ],
            email: '',
            emailRules: [
              (v) => !!v || 'E-mail is required',
              (v) => /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(v) || 'E-mail must be valid'
            ]
          }
        },
        methods: {
          submit() {
            nativeForm.submit()
          }
        }
      }
  </script>

别忘了:

添加name 属性。 Getform 需要它们。

【讨论】:

    【解决方案2】:

    const app = new Vue({
      el:'#app',
      data:{
        errors:[],
        name:null,
        age:null,
        movie:null
      },
      methods:{
        checkForm:function(e) {
          if(this.name && this.age) return true;
          this.errors = [];
          if(!this.name) this.errors.push("Name required.");
          if(!this.age) this.errors.push("Age required.");
          e.preventDefault();
        }
      }
    })
    input,select {
      margin-left: 10px;
    }
    <script src="https://unpkg.com/vue@2.5.13/dist/vue.js"></script>
    <form id="app" @submit="checkForm" action="/something" method="post">
      
      <p v-if="errors.length">
        <b>Please correct the following error(s):</b>
        <ul>
          <li v-for="error in errors">{{ error }}</li>
        </ul>
      </p>
      
      <p>
        <label for="name">Name<label>
        <input type="text" name="name" id="name" v-model="name">
      </p>
    
      <p>
        <label for="age">Age<label>
        <input type="number" name="age" id="age" v-model="age" min="0">
      </p>
    
      <p>
        <label for="movie">Favorite Movie<label>
        <select name="movie" id="movie" v-model="movie">
          <option>Star Wars</option>
          <option>Vanilla Sky</option>
          <option>Atomic Blonde</option>
        </select>
      </p>
    
      <p>
        <input type="submit" value="Submit">  
      </p>
    
    </form>

    添加一些 CSS 并完成。

    【讨论】:

    • 我已经设法使它工作(请参阅另一个答案),但我会将赏金分配给您的问题和非 Vuetify.js 特定的通用 Vue 方法它。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    相关资源
    最近更新 更多