插件窝 干货文章 Vue 3中如何构建复杂的多步骤审批表单?

Vue 3中如何构建复杂的多步骤审批表单?

formData const name 表单 121    来源:    2025-03-20

在Vue 3中构建复杂的多步骤审批表单可以通过以下几个步骤来实现。我们将使用Vue 3的组合式API(Composition API)来管理表单的状态和逻辑。

1. 项目初始化

首先,确保你已经创建了一个Vue 3项目。如果还没有,可以使用Vue CLI来创建一个新项目:

vue create multi-step-form

2. 安装依赖

为了简化表单验证和状态管理,我们可以使用vuelidatevuex等库。你可以通过以下命令安装它们:

npm install vuelidate vuex

3. 创建表单组件

我们将创建一个多步骤表单组件,每个步骤对应一个子组件。以下是一个简单的示例:

MultiStepForm.vue

<template>
  <div>
    <div v-if="currentStep === 1">
      <StepOne @next="nextStep" />
    </div>
    <div v-if="currentStep === 2">
      <StepTwo @next="nextStep" @prev="prevStep" />
    </div>
    <div v-if="currentStep === 3">
      <StepThree @submit="submitForm" @prev="prevStep" />
    </div>
  </div>
</template>

<script>
import { ref } from 'vue';
import StepOne from './StepOne.vue';
import StepTwo from './StepTwo.vue';
import StepThree from './StepThree.vue';

export default {
  components: {
    StepOne,
    StepTwo,
    StepThree,
  },
  setup() {
    const currentStep = ref(1);

    const nextStep = () => {
      currentStep.value++;
    };

    const prevStep = () => {
      currentStep.value--;
    };

    const submitForm = () => {
      alert('Form submitted!');
      // 这里可以添加提交表单的逻辑
    };

    return {
      currentStep,
      nextStep,
      prevStep,
      submitForm,
    };
  },
};
</script>

StepOne.vue

<template>
  <div>
    <h2>Step 1: Personal Information</h2>
    <form @submit.prevent="handleNext">
      <label for="name">Name:</label>
      <input id="name" v-model="formData.name" required />
      <button type="submit">Next</button>
    </form>
  </div>
</template>

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

export default {
  emits: ['next'],
  setup(props, { emit }) {
    const formData = ref({
      name: '',
    });

    const handleNext = () => {
      emit('next');
    };

    return {
      formData,
      handleNext,
    };
  },
};
</script>

StepTwo.vue

<template>
  <div>
    <h2>Step 2: Contact Information</h2>
    <form @submit.prevent="handleNext">
      <label for="email">Email:</label>
      <input id="email" v-model="formData.email" required />
      <button type="button" @click="handlePrev">Previous</button>
      <button type="submit">Next</button>
    </form>
  </div>
</template>

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

export default {
  emits: ['next', 'prev'],
  setup(props, { emit }) {
    const formData = ref({
      email: '',
    });

    const handleNext = () => {
      emit('next');
    };

    const handlePrev = () => {
      emit('prev');
    };

    return {
      formData,
      handleNext,
      handlePrev,
    };
  },
};
</script>

StepThree.vue

<template>
  <div>
    <h2>Step 3: Review and Submit</h2>
    <form @submit.prevent="handleSubmit">
      <p>Name: {{ formData.name }}</p>
      <p>Email: {{ formData.email }}</p>
      <button type="button" @click="handlePrev">Previous</button>
      <button type="submit">Submit</button>
    </form>
  </div>
</template>

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

export default {
  emits: ['submit', 'prev'],
  setup(props, { emit }) {
    const formData = ref({
      name: '',
      email: '',
    });

    const handleSubmit = () => {
      emit('submit');
    };

    const handlePrev = () => {
      emit('prev');
    };

    return {
      formData,
      handleSubmit,
      handlePrev,
    };
  },
};
</script>

4. 表单验证

为了确保用户在每个步骤中输入有效的数据,我们可以使用vuelidate来进行表单验证。以下是一个简单的示例:

StepOne.vue with Validation

<template>
  <div>
    <h2>Step 1: Personal Information</h2>
    <form @submit.prevent="handleNext">
      <label for="name">Name:</label>
      <input id="name" v-model="formData.name" />
      <span v-if="!$v.formData.name.required">Name is required.</span>
      <button type="submit">Next</button>
    </form>
  </div>
</template>

<script>
import { ref } from 'vue';
import useVuelidate from '@vuelidate/core';
import { required } from '@vuelidate/validators';

export default {
  emits: ['next'],
  setup(props, { emit }) {
    const formData = ref({
      name: '',
    });

    const rules = {
      formData: {
        name: { required },
      },
    };

    const $v = useVuelidate(rules, { formData });

    const handleNext = () => {
      if ($v.value.$invalid) {
        alert('Please fill out the form correctly.');
        return;
      }
      emit('next');
    };

    return {
      formData,
      handleNext,
      $v,
    };
  },
};
</script>

5. 状态管理

如果表单数据需要在多个组件之间共享,可以使用Vuex来管理全局状态。以下是一个简单的Vuex store示例:

store.js

import { createStore } from 'vuex';

export default createStore({
  state: {
    formData: {
      name: '',
      email: '',
    },
  },
  mutations: {
    updateFormData(state, payload) {
      state.formData = { ...state.formData, ...payload };
    },
  },
  actions: {
    updateFormData({ commit }, payload) {
      commit('updateFormData', payload);
    },
  },
  getters: {
    formData: (state) => state.formData,
  },
});

StepOne.vue with Vuex

<template>
  <div>
    <h2>Step 1: Personal Information</h2>
    <form @submit.prevent="handleNext">
      <label for="name">Name:</label>
      <input id="name" v-model="formData.name" />
      <span v-if="!$v.formData.name.required">Name is required.</span>
      <button type="submit">Next</button>
    </form>
  </div>
</template>

<script>
import { ref, computed } from 'vue';
import { useStore } from 'vuex';
import useVuelidate from '@vuelidate/core';
import { required } from '@vuelidate/validators';

export default {
  emits: ['next'],
  setup(props, { emit }) {
    const store = useStore();
    const formData = computed({
      get: () => store.state.formData,
      set: (value) => store.commit('updateFormData', value),
    });

    const rules = {
      formData: {
        name: { required },
      },
    };

    const $v = useVuelidate(rules, { formData });

    const handleNext = () => {
      if ($v.value.$invalid) {
        alert('Please fill out the form correctly.');
        return;
      }
      emit('next');
    };

    return {
      formData,
      handleNext,
      $v,
    };
  },
};
</script>

6. 总结

通过以上步骤,你可以在Vue 3中构建一个复杂的多步骤审批表单。每个步骤对应一个子组件,使用Vuex来管理全局状态,使用Vuelidate进行表单验证。你可以根据需要扩展和修改这个示例,以满足具体的业务需求。