当前位置:首页 > VUE

vue实现表单页

2026-01-18 13:31:14VUE

基础表单实现

在Vue中创建表单需要使用v-model指令实现双向数据绑定。以下是一个基础表单示例:

<template>
  <form @submit.prevent="handleSubmit">
    <label for="username">用户名:</label>
    <input 
      id="username" 
      type="text" 
      v-model="form.username"
    >

    <label for="password">密码:</label>
    <input 
      id="password" 
      type="password" 
      v-model="form.password"
    >

    <button type="submit">提交</button>
  </form>
</template>

<script>
export default {
  data() {
    return {
      form: {
        username: '',
        password: ''
      }
    }
  },
  methods: {
    handleSubmit() {
      console.log('提交的数据:', this.form)
      // 这里可以添加表单验证和提交逻辑
    }
  }
}
</script>

表单验证

Vue表单验证可以通过Vuelidate或自定义验证方法实现。以下是自定义验证示例:

<template>
  <form @submit.prevent="handleSubmit">
    <div>
      <label>邮箱:</label>
      <input 
        type="email" 
        v-model="form.email"
        @blur="validateEmail"
      >
      <span v-if="errors.email">{{ errors.email }}</span>
    </div>

    <button type="submit" :disabled="!isValid">提交</button>
  </form>
</template>

<script>
export default {
  data() {
    return {
      form: {
        email: ''
      },
      errors: {
        email: ''
      }
    }
  },
  computed: {
    isValid() {
      return !this.errors.email && this.form.email
    }
  },
  methods: {
    validateEmail() {
      const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
      this.errors.email = regex.test(this.form.email) 
        ? '' 
        : '请输入有效的邮箱地址'
    },
    handleSubmit() {
      if(this.isValid) {
        // 提交逻辑
      }
    }
  }
}
</script>

动态表单字段

对于需要动态增减的表单字段,可以使用数组管理:

<template>
  <form @submit.prevent="handleSubmit">
    <div v-for="(field, index) in form.fields" :key="index">
      <input 
        v-model="field.value"
        :placeholder="field.placeholder"
      >
      <button @click="removeField(index)">删除</button>
    </div>

    <button @click="addField">添加字段</button>
    <button type="submit">提交</button>
  </form>
</template>

<script>
export default {
  data() {
    return {
      form: {
        fields: [
          { value: '', placeholder: '字段1' }
        ]
      }
    }
  },
  methods: {
    addField() {
      this.form.fields.push({
        value: '',
        placeholder: `字段${this.form.fields.length + 1}`
      })
    },
    removeField(index) {
      this.form.fields.splice(index, 1)
    },
    handleSubmit() {
      console.log('提交数据:', this.form.fields)
    }
  }
}
</script>

表单组件化

将表单字段封装为可复用组件:

<!-- TextInput.vue -->
<template>
  <div>
    <label v-if="label">{{ label }}</label>
    <input
      :type="type"
      :value="value"
      @input="$emit('input', $event.target.value)"
    >
    <span v-if="error" class="error">{{ error }}</span>
  </div>
</template>

<script>
export default {
  props: {
    value: [String, Number],
    label: String,
    type: {
      type: String,
      default: 'text'
    },
    error: String
  }
}
</script>

使用表单组件:

<template>
  <form @submit.prevent="handleSubmit">
    <text-input 
      label="用户名"
      v-model="form.username"
      :error="errors.username"
    ></text-input>

    <text-input 
      label="密码"
      type="password"
      v-model="form.password"
      :error="errors.password"
    ></text-input>

    <button type="submit">提交</button>
  </form>
</template>

<script>
import TextInput from './TextInput.vue'

export default {
  components: { TextInput },
  data() {
    return {
      form: {
        username: '',
        password: ''
      },
      errors: {}
    }
  },
  methods: {
    handleSubmit() {
      // 验证和提交逻辑
    }
  }
}
</script>

表单提交与API集成

集成Axios进行表单提交:

vue实现表单页

<template>
  <form @submit.prevent="submitForm">
    <!-- 表单字段 -->
    <button type="submit" :disabled="isSubmitting">
      {{ isSubmitting ? '提交中...' : '提交' }}
    </button>
  </form>
</template>

<script>
import axios from 'axios'

export default {
  data() {
    return {
      form: {
        /* 表单数据 */
      },
      isSubmitting: false,
      submitError: null
    }
  },
  methods: {
    async submitForm() {
      this.isSubmitting = true
      this.submitError = null

      try {
        const response = await axios.post('/api/submit', this.form)
        console.log('提交成功:', response.data)
        // 处理成功逻辑
      } catch (error) {
        this.submitError = error.response?.data?.message || '提交失败'
      } finally {
        this.isSubmitting = false
      }
    }
  }
}
</script>

标签: 表单vue
分享给朋友:

相关文章

vue实现继承语法糖

vue实现继承语法糖

在Vue中实现继承可以通过多种方式模拟类继承的效果,以下是常见的几种方法: 使用mixins实现逻辑复用 通过Vue的mixins机制共享组件选项,达到类似继承的效果: const BaseCom…

vue实现语音

vue实现语音

Vue 实现语音功能的方法 使用 Web Speech API Vue 可以结合 Web Speech API 实现语音识别和合成功能。Web Speech API 包含 SpeechRecognit…

vue实现方法

vue实现方法

Vue 实现方法 Vue 是一种流行的前端框架,用于构建用户界面和单页应用。以下是几种常见的 Vue 实现方法: 创建 Vue 实例 通过 new Vue() 创建一个 Vue 实例,传入配置对象,…

vue el 实现

vue el 实现

Vue 中使用 Element UI (el) 的实现方法 Element UI 是一个基于 Vue 的组件库,提供丰富的 UI 组件,常用于快速构建企业级中后台产品。以下介绍 Vue 项目中集成和使…

vue实现逻辑

vue实现逻辑

Vue 实现逻辑的核心概念 Vue.js 是一个渐进式 JavaScript 框架,其核心逻辑围绕数据驱动和组件化开发。通过响应式系统、虚拟 DOM 和组件生命周期等机制,Vue 实现了高效的前端开发…

vue实现flvvideo

vue实现flvvideo

vue-flv-player 实现 FLV 视频播放 安装依赖包 npm install flv.js vue-flv-player 基础组件引入 <template> <v…