复杂JSON转FormData

项目迁移后使用axios发送ajax请求,但它的默认数据格式是payload,之前老项目使用使用jquery数据格式是FormData,项目服务端只能接收FormData格式的,所以只能想办法修改axios的数据格式,查了一些资料没发现通过配置解决的办法 ,有的人说加下面一段代码即可:

axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

测试多次无效果,又有人说直接把 数据改为FormData,于是继续找 json转FormData的方法,找到了好多,不过都是只支持一层json,复杂些的不支持,于是自己动手写一个转换的方法:

/*
 复杂json转为FormData
 parent:key值,data:数据值,form:FormData实例
 使用:JsonToFormData("", a, null);
 */
function JsonToFormData(parent, data, form) {
    form = form || new FormData();
    //循环传入的值转换formData
    let index = 0;
    Object.keys(data).forEach((key) => {
        let val = data[key];
        // console.log(key, typeof val, val.length);
            if (val == null) {
                    let pk = parent ? `${parent}[${key}]` : key;
                    form.append(pk, NVL(val, ""));
            }
            else if (typeof val === "object") {
            if (val.length == 0) { }
            else if (val.length >= 1) {
                //数组
                let pk = parent ? `${parent}[${key}]` : key;
                JsonToFormData(pk, val, form);
            } else {
                //纯对象
                let pk = parent ? `${parent}[${key}]` : key;
                JsonToFormData(pk, val, form);
            }
        } else {
            let pk = parent ? `${parent}[${key}]` : key;
            form.append(pk, NVL(val, ""));
        }
        index++;
    });
    if (parent == "") return form;
}


function NVL(obj, newValue) {
  return (obj === null || obj === undefined) ?
      (newValue ? newValue : "") : obj;
}

使用方法:

var params = {
a: 1, b: "", c: [1, 2, 4, {c1:"c111"}], d: { e: 5 }, f: [{ f1: "11" }, { f1: "22" }]
};

//使用
var r = JsonToFormData("",params, null);

//打印转换后的结果
for (var [key, value] of r) {
   console.log(key, value);
}

结果:

a 1
b
c[0] 1
c[1] 2
c[2] 4
c[3][c1] c111
d[e] 5
f[0][f1] 11
f[1][f1] 22

如果您有更好的办法把axios的数据格式转为FormData,请共享一下,谢谢!邮箱:31705252@qq.com

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
请问您是希望使用 Vue 来实现对表单数据的检查并防止未保存数据的丢失吗? 如果是的话,Vue 提供了许多有用的组件和方法来应对这种需求。下面是一些代码示例,供您参考: 1. 使用 watch 监听数据的变化,在数据变化时触发保存数据的逻辑: ```javascript <template> <div> <input v-model="formData.name"/> <input v-model="formData.age"/> <button @click="save">保存</button> </div> </template> <script> export default { data() { return { formData: { name: '', age: '' }, savedData: {} // 保存已经保存的数据 } }, watch: { formData: { handler: function (newValue, oldValue) { let isEqual = JSON.stringify(newValue) === JSON.stringify(oldValue) if (!isEqual) { // 数据发生了变化,保存数据 this.saveData(newValue) } }, deep: true // 监听子对象的变化 } }, methods: { saveData(formData) { // 保存数据的逻辑 this.savedData = {...formData} }, save() { // 手动保存数据 this.saveData(this.formData) } } } </script> ``` 2. 使用 Vue-router 来管理页面的跳,并使用 beforeRouteLeave 钩子函数来判断是否有未保存的数据: ```javascript <template> <div> <input v-model="formData.name"/> <input v-model="formData.age"/> <button @click="save">保存</button> </div> </template> <script> export default { data() { return { formData: { name: '', age: '' }, savedData: {} // 保存已经保存的数据 } }, methods: { save() { // 保存数据的逻辑 this.savedData = {...this.formData} this.$router.push('/') } }, beforeRouteLeave(to, from, next) { let isEqual = JSON.stringify(this.formData) === JSON.stringify(this.savedData) if (!isEqual) { let result = window.confirm('您有未保存的数据,确定要离开吗?') if (result) { next() } else { next(false) } } else { next() } } } </script> ``` 这些代码示例只是给您一个大致的思路,根据您的具体业务需求和页面实现来具体实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值