在 vuejs 中提交表单,我应该使用表单标签吗?

Posted

技术标签:

【中文标题】在 vuejs 中提交表单,我应该使用表单标签吗?【英文标题】:submitting forms in vuejs, should I use the form tag? 【发布时间】:2020-01-07 14:55:53 【问题描述】:

我很困惑如何在 vuejs 中提交和处理编辑表单。

我现在的做法是我有一个名为 TreeForm.vue 的组件:

<template>
  <div>
    <v-text-field v-model="cloned_tree.root" />
    <v-text-field v-model="cloned_tree.root" />
    <v-file-input type="number" v-model="cloned_tree.fruits" />
    <v-btn @click="$emit('save', idx: tree_idx, tree: cloned_tree)">Save</v-btn>
  </div>
</template>

<script>
  export default 
    props: tree_idx: Number,
    data() 
      return 
        cloned_tree: JSON.parse(JSON.stringify(this.$store.state.trees[this.tree_idx])),
      ;
    ,
  ;
</script>

在父组件中我这样做:

<template>
  <div>
    ...
    <TreeForm tree_idx="0" @save="submitTreeForm" />
    ...
  </div>
</template>

<script>
  import mapActions from 'vuex';
  export default 
    methods: 
      ...mapActions(['submitTreeForm']),
    ,
  ;
</script>

在我的 vuex 中我会这样做:

import Vue from 'vue';
import Vuex from 'vuex';
import axios from 'axios';

const api = axios.create(
  baseURL: 'https://api.mydomain.com/api',
  timeout: 10000,
  withCredentials: true,
);
Vue.use(Vuex);
export default new Vuex.Store(
  strict: process.env.NODE_ENV !== 'production',
  state: 
    trees: [
      
        root: 'hello',
        imageFile: require('some/picture'),
        fruits: 5,
      ,
    ],
  ,
  mutations: 
    updateTree(state, payload) 
      state.trees[payload.idx] = payload.tree;
    ,
  ,
  actions: 
    submitVideoForm(commit, payload) 
      api
        .post('/trees/update/', payload)
        .then(response => 
          if (response.data.success == 1) 
            commit('updateTree', payload);
           else 
            console.log(response.data.success);
          
        )
        .catch(function(error) 
          console.log(error);
        );
    ,
  ,
);

但我觉得这不是专门做这件事的正确方法,因为我没有使用&lt;v-form&gt;&lt;form&gt; 标签。我还没有合并验证,我正在考虑使用 vuelidate。所以请给我一个提交和处理编辑表单的最佳实践,而验证是由 vuelidate 完成的。

【问题讨论】:

Vue Material 页面有一个Form的例子,我想可以帮助你:vuematerial.io/components/form。你可以看看实现。 【参考方案1】:

基本上,form 标签不是强制性的。除非使用某种 CSS 框架,否则无论有没有 form 标签,UI 看起来都一样。但是,它仍然有一些优点:

Ben Nadel 在他的博客post 中说得最好:

...似乎使用 FORM 标签确实有一些好处,具体取决于 根据您的具体情况:

如果您想执行传统(即非 AJAX)表单,则需要它 邮政。 您需要它来捕获“提交”事件 以编程方式。 您需要它才能让移动版 Safari 显示 键盘上的“开始”按钮。 如果你想的话,你需要它 以编程方式“重置”表单(即调用 reset())。 它使通用 表单序列化更容易(因为它对输入字段进行分组)。 如果您想在没有现代文件 API 的情况下发布文件,则需要它。 如果您必须分隔具有相同名称的字段,则需要它。

Vue.js 几乎可以让您应对所有这些情况。但如果没有 - 使用表单。

【讨论】:

如果你想按书行事,那就加上form标签吧。

以上是关于在 vuejs 中提交表单,我应该使用表单标签吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 5.1 中使用 VueJs 和 AJAX 提交表单

Vuejs - 如何在单个表单中仅提交可见元素(使用 Vuelidate)

Vuejs表单未在“输入”时提交

html 表单一定要用submit提交吗

引导标签输入标签值未与表单一起提交

即使我有错误Vuejs,提交表单后模态也会关闭