使用Vue hooks封装表单操作方法

470 阅读1分钟

在上一篇文章中我们介绍了如何封装一个表格操作hooks,这次介绍表单的操作。在业务开发中,经常会有各种各样的表单,而表单最基础的功能就是数据的添加和修改,同样的,它们的逻辑也都相似,传递参数->请求接口。因此,我们可以把这两个方法单独抽离出来。

src目录下新建useFormRequest.js文件

import { ref } from 'vue';
import { ElMessage } from 'element-plus';

/**
 * @description Form 表单操作方法封装
 * @param {Function} emits 向父组件触发事件(必传)
 * @param {String} tip 提示内容(非必传)
 */
export const useFormRequest = (emits, tip = {}) => {

  const loading = ref(false);
  const visible = ref(false);

  /**
   * @description Form 表单添加操作方法
   * @param {Function} api 请求接口 api 方法(必传)
   * @param {Object} params 表单数据(必传,默认为{})
   */
  const add = async (api, params = {}) => {

    loading.value = true;
    const {
      resultCode, msg,
    } = await api(params).catch((e) => e);
    loading.value = false;
    if (resultCode === 0) {

      ElMessage.success(`添加${tip}成功`);
      visible.value = false;
      emits('update');

    } else if (msg) {

      ElMessage.error(msg);

    }

  };

  /**
   * @description Form 表单修改操作方法
   * @param {Function} api 请求接口 api 方法(必传)
   * @param {Object} params 表单数据(必传,默认为{})
   */
  const modify = async (api, params = {}) => {

    loading.value = true;
    const {
      resultCode, msg,
    } = await api(params).catch((e) => e);
    loading.value = false;
    if (resultCode === 0) {

      ElMessage.success(`修改${tip}成功`);
      emits('update');
      visible.value = false;

    } else if (msg) {

      ElMessage.error(msg);

    }

  };

  return {
    loading,
    visible,
    add,
    modify,
  };

};

文件中我们定义了一个useFormRequest方法,传递两个参数,分别是事件触发器emits请求提示(tip)useFormRequest中定义了loadingvisible变量,这让我们能直接在hooks中控制表单的显示关闭与按钮加载状态。addmodify分别对应表单的添加与修改功能,都是传入api和请求参数。

使用时,在对应的页面引入useFormRequest.js

import {
  addCus, modifyCus
} from '@/api/modules/customer';
import { useFormRequest } from '@/hooks/useFormRequest';

const emits = defineEmits(['update']);

// 使用自定义表单hooks
const {
  loading, visible, add, modify,
} = useFormRequest(emits, '客户');

在表单提交时,我们只需要几行代码代码就能搞定了

const submit = async () => {

  formRef.value.validate((vali) => {

    if (vali) {

      id.value
        ? modify(modifyCus, {
          id: id.value,
          ...model.value,
        })
        : add(addCus, model.value);

    }

  });

};

当然,我们还可以将获取表单详情的方法集成到hooks中,也是类似的逻辑,这里就不阐述了。