当前位置: 首页 > article >正文

开源项目低代码表单FormCreate中通过接口加载远程数据选项

在开源项目低代码表单 FormCreate 中,fetch 属性提供了强大的功能,允许从远程 API 加载数据并将其应用到表单组件中。通过灵活的配置,fetch 可以在多种场景下发挥作用,从简单的选项加载到复杂的动态数据处理。

源码地址: Github | Gitee

低代码表单FormCreate

类型

以下是 fetch 属性的详细类型定义:

type Fetch = {
  //接口地址
  action: String;
  //数据插入的位置,例如 'options' 或 'props.options'
  to?: String;
  //解析接口返回的数据,返回最终需要的结果,默认取 `res.data`
  parse?: String | ((body: any, rule:Rule, fapi:fApi) => any);
  //请求方式,默认值为 'GET'
  method?: String;
  //请求时附带的数据
  data?: Object;
  //调用接口附带数据的提交方式,默认为 `formData`
  dataType?: 'json';
  //自定义请求头信息
  headers?: Object;
  //请求失败时的回调函数
  onError?: (e: Error | ProgressEvent) => void;
 }

在请求前,可以通过 options.beforeFetch 方法处理规则,例如设置 token。

自定义请求方法

在一些高级场景中,您可能需要自定义请求方式。通过重写 formCreate.fetch 方法,您可以自由定义请求的逻辑。

formCreate.fetch = (options) => {
    fetch(options.action, {
        headers: options.headers,
        method: options.method,
    }).then(res=>{
        res.json().then(data=>{
            options.onSuccess(data);
        })
    }).catch(e=>{
        options.onError(e);
    })
}

低代码表单FormCreate

示例

通过接口加载数据

<template>
  <div>
    <form-create :rule="rule" v-model:api="fApi" :option="options"/>
  </div>
</template>

<script>
export default {
  data() {
    return {
      fApi: {},
      options: {
        onSubmit: (formData) => {
          alert(JSON.stringify(formData))
        }
      },
      rule: [
        {
          type: 'select',
          field: 'city',
          title: '城市',
          value: '陕西省',
          options: [],
          effect: {
            fetch: {
              action: 'http://datavmap-public.oss-cn-hangzhou.aliyuncs.com/areas/csv/100000_province.json',
              to: 'options',
              method: 'GET',
              parse(res) {
                return res.rows.map(row => {
                  return {
                    label: row.name,
                    value: row.adcode
                  }
                })
              }
            }
          }
        }
      ]
    }

  }
}
</script>

通过自定义方法加载数据

<template>
  <div>
    <form-create :rule="rule" v-model:api="fApi" :option="options"/>
  </div>
</template>

<script>
export default {
  data() {
    return {
      fApi: {},
      options: {
        onSubmit: (formData) => {
          alert(JSON.stringify(formData))
        }
      },
      rule: [
        {
          type: 'cascader',
          field: 'city',
          title: '省市',
          value: ['陕西省', '西安市'],
          props: {
            options: []
          },
          effect: {
            fetch: {
              //自定义请求
              action: () => {
                function tidy(list) {
                  return list.map(val => {
                    return {
                      value: val.name,
                      label: val.name,
                      children: val.children ? tidy(val.children) : undefined
                    }
                  })
                }

                return new Promise((resolve) => {
                  fetch('https://cdn.jsdelivr.net/gh/modood/Administrative-divisions-of-China@2.4.0/dist/pc-code.json').then(res => {
                    console.log(res)
                    res.json().then(res => {
                      resolve(tidy(res));
                    })
                  })
                })
              },
              to: 'props.options',
            }
          }
        }
      ]
    }

  }
}
</script>

自定义请求头信息

const rules = [
    {
        type: 'select',
        field: 'product',
        title: '选择产品',
        fetch: {
            action: '/api/products',
            to: 'options',
            headers: {
                Authorization: 'Bearer your-auth-token'
            },
            parse: (res) => res.data.map(product => ({ label: product.name, value: product.id })),
            onError: (error) => console.error('加载产品数据失败:', error)
        }
    }
]

在请求前设置 Token

在发送 API 请求之前,动态添加 Authorization token 到请求头中。

// 配置表单创建的全局选项
const formOptions = {
    // 在请求发送前的钩子
    beforeFetch: (options) => {
        // 动态设置请求头中的 Authorization token
        const token = 'your-auth-token'; // 这里的 token 可以从任何存储中获取
        options.headers = {
            Authorization: `Bearer ${token}`
        };
    }
};
// 创建表单
const rules = [
    {
        type: 'select',
        field: 'product',
        title: '选择产品',
        fetch: {
            action: '/api/products',
            to: 'options',
            parse: (res) => res.data.map(product => ({ label: product.name, value: product.id })),
            onError: (error) => console.error('加载产品数据失败:', error)
        }
    }
];

详细步骤

  1. 设置全局 formOptions: 通过设置全局的 beforeFetch 方法,可以确保在所有带有 fetch 的组件中,都会执行这个钩子。

  2. 动态获取 token: 在 beforeFetch 中,我们可以从存储、Vuex 或其他来源动态获取 token,然后将其添加到请求头中。

  3. 创建表单并使用 fetch: 表单组件中的 fetch 会自动触发 beforeFetch 方法,附加上设置的 Authorization token。

重写内置请求方法并设置 Token

在表单的所有 API 请求中,自动附加 Authorization token 到请求头中,以确保所有请求都携带有效的身份验证信息。

import formCreate from '@form-create/element-ui'; // 假设使用 Element UI

// 重写 formCreate 的内置 fetch 方法
formCreate.fetch = (options) => {
    // 获取或生成 Token
    const token = 'your-auth-token'; // 这里的 token 可以从 Vuex、localStorage 或其他地方获取

    // 设置请求头,附加 Authorization token
    const headers = {
        ...options.headers,
        Authorization: `Bearer ${token}`,
    };

    // 发起请求
    fetch(options.action, {
        method: options.method || 'GET', // 默认请求方法为 GET
        headers: headers,                 // 包含 Authorization 的请求头
        body: options.method !== 'GET' ? JSON.stringify(options.data) : null, // 如果是 POST 或其他方法,添加请求体
    })
    .then(response => response.json())  // 解析响应为 JSON
    .then(data => {
        if (options.onSuccess) {
            options.onSuccess(data);  // 成功回调
        }
    })
    .catch(error => {
        if (options.onError) {
            options.onError(error);  // 失败回调
        }
    });
};

// 创建表单
const fApi = formCreate.create([
    {
        type: 'select',
        field: 'product',
        title: '选择产品',
        fetch: {
            action: '/api/products',
            to: 'options',
            parse: (res) => res.data.map(product => ({ label: product.name, value: product.id })),
            onError: (error) => console.error('加载产品数据失败:', error),
        },
    },
], {
    // 其他表单配置
});

详细步骤

  1. 重写 fetch 方法: 在初始化时,重写 formCreate.fetch 方法,确保所有请求都使用这个自定义的方法。

  2. 设置 Authorization token: 在每次请求中,从存储中获取或生成 token,并将其附加到 headers 中。

  3. 发起请求并处理响应: 根据 options 中的 method、action、data 等参数,发起请求并处理响应数据。


http://www.kler.cn/news/303627.html

相关文章:

  • MySQL:undo log
  • 吴恩达大神神作经典珍藏版:《LLM大模型通关手册》面面俱到太全了!
  • Ubuntu 下载软件包时,提示 但是它将不会被安装E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。
  • 【网络安全 | 甲方建设】SaaS平台、Jira工具及Jenkins服务器
  • LeetCode之字典树
  • SpringBoot3与SpringBoot2的区别
  • 内存魔术师:精通内存函数的艺术
  • 如何划分类/单一职权原则SRP
  • java重点学习-线程的并发安全(2)
  • 甘特图介绍
  • 解锁生活密码,AI答案之书解决复杂难题
  • 提取蛋白质复合体结构中组装体的变换矩阵
  • gitlab配置统一前缀路径源码版
  • 论文复现--基于LeNet网络结构的数字识别
  • 加密与安全_优雅存储用户密码的最佳实践
  • 处理数据库中长时间运行的事务
  • 浅谈C#之进程
  • 零基础上手WebGIS+智慧校园实例(长期更新#2)【html by js】
  • 【LeetCode】2552. 统计上升四元组
  • C++学习,多态纯虚函数
  • 灵雀云DevOps:加速应用交付,点燃业务创新引擎
  • chapter11 常用类和基础API 知识点总结Note
  • Git常用命令详解
  • uniapp H5 打开地图 并选中标记点
  • sqlguna靶场get shell
  • 高级 Python Web 应用中的身份验证与授权机制解析
  • STM32常用数据采集滤波算法
  • Java重修笔记 第五十四天 坦克大战(三)事件处理机制
  • 上海市计算机学会竞赛平台2024年7月月赛丙组池塘计数
  • SEAFARING靶场漏洞攻略