#14vue3生成表单并跳转到外部地址的方式

1、背景

后端返回的json数据中包含一个json数组,此数组中是目标跳转地址所需要的form表单的数据。

2、跳转前的页面

javascript 复制代码
const goto = () => {
	finish.value = true;
  request.post('/xxx/yyy',
      {zzz: zzz.value}).then(res => {
    const url = res.data.submitUrl
    const params = JSON.stringify(res.data.params);
    const resolve = router.resolve({name:'outForm',query:{url,params}});
    window.open(resolve.href, "_blank");
  })
}

params在后端是一个Map<String,Object>,传递到前端后先将其序列化为字符串。

使用router.resolve通过query上送的方式把参数传递到outForm.vue。

3、outForm.vue

javascript 复制代码
<template>
<form ref="formRef" method="post">
    <input v-for="(value, key) in params" :key="key" type="hidden" :name="key" :value="value" />
  </form>
</template>
<script setup>
import {onMounted, ref} from "vue";
import {toReactive, useUrlSearchParams} from "@vueuse/core";
import {lowerCaseJSONObj2UpperCaseUnderlineObj} from "../../utils/common";

const formRef=ref();
const urlSearchParams=useUrlSearchParams()
const url = ref(decodeURIComponent(urlSearchParams.url));
const parse = JSON.parse(decodeURIComponent(urlSearchParams.params));
const params = toReactive(lowerCaseJSONObj2UpperCaseUnderlineObj(parse));

onMounted(() => {
  formRef.value.action=url.value;
  formRef.value.submit();
})
</script>

通过v-for将params遍历为对应的input,注意value在前key在后。

此处注意需将params字符串反序列化之后再转化为一个响应式的对象,其中根据业务需求要将参数改为大写加分隔下划线的形式。

然后通过onMounted在form表单挂载完成后立即提交表单,将内容提交到目标url并实现跳转。

附上参数转化函数:

javascript 复制代码
export const lowerCaseJSONObj2UpperCaseUnderlineObj =
(obj) => {
    if(typeof obj !== 'object') return;
    const transformedArray = [];
    for (const key in obj) {
        const transformedKey = key.replace(/([a-z])([A-Z])/g, '$1_$2').toUpperCase();
        const transformedObj = { [transformedKey]: obj[key] };
        transformedArray.push(transformedObj);
    }
    return transformedArray.reduce((acc, obj) => {
        const key = Object.keys(obj)[0];
        acc[key] = obj[key];
        return acc;
    }, {});
}

如果对你有帮助,点赞、收藏、关注是我更新的动力!

#13Maven打包生成MD5校验文件的两种方式_mvn 打war包,显示md5和大小-CSDN博客文章浏览阅读1.9k次,点赞57次,收藏13次。Maven打包生成MD5校验文件的两种方式_mvn 打war包,显示md5和大小https://blog.csdn.net/weixin_42718399/article/details/136375811?spm=1001.2014.3001.5502#12解决request中getReader()和getInputStream()只能调用一次的问题-CSDN博客文章浏览阅读2.1k次,点赞64次,收藏30次。getInputStream() has already been called for this request,解决request中getReader()和getInputStream()只能调用一次的问题https://blog.csdn.net/weixin_42718399/article/details/136237084?spm=1001.2014.3001.5502#11vue3中使用el-dialog展示与关闭交由父组件控制的写法_vue dailog 固定关闭按钮-CSDN博客文章浏览阅读1.1k次,点赞40次,收藏28次。vue3中使用elementplus的el-dialog展示与关闭交由父组件控制的写法,分两种方法,使用difineExpose或者defineEmits实现_vue dailog 固定关闭按钮https://blog.csdn.net/weixin_42718399/article/details/136155379?spm=1001.2014.3001.5502#3Jenkins(Windows环境)版本升级、迁移、负载均衡、双机器同步与备份_windows下的jenkins的job备份-CSDN博客文章浏览阅读1.1k次,点赞28次,收藏17次。Jenkins(Windows环境)版本升级、迁移、负载均衡、双机器同步与备份_windows下的jenkins的job备份https://blog.csdn.net/weixin_42718399/article/details/135404525?spm=1001.2014.3001.5502#2Vite+Vue3+SpringMVC前后端分离 解决跨域问题和session每次请求不一致问题_vue3 每次请求sessionid都不一样-CSDN博客文章浏览阅读1.1k次,点赞37次,收藏16次。Vite+Vue3+SpringMVC前后端分离通过vite/nginx解决跨域问题和session一致性问题_vue3 每次请求sessionid都不一样https://blog.csdn.net/weixin_42718399/article/details/135388463?spm=1001.2014.3001.5502

相关推荐
哀木16 分钟前
一个简单的套壳方案,就能让你的 Agent 少做重复初始化
前端
问心无愧051327 分钟前
ctf show web入门27
前端
小村儿41 分钟前
给 AI Agent 装上"长期记忆":Karpathy 的 LLM Wiki 思想,我做成了工具
前端·后端·ai编程
竹林8181 小时前
用ethers.js连接MetaMask实现Web3钱包登录:从踩坑到稳定运行的完整记录
前端·javascript
heyCHEEMS1 小时前
如何用 Recast 实现静态配置文件源码级读写
前端·node.js
心连欣1 小时前
从零开始,学习所有指令!
前端·javascript·vue.js
review445431 小时前
大模型和function calling分别是如何工作的
前端
东东同学1 小时前
耗时一个月,我把 Nuxt 首屏性能排障经验做成了一个 AI Skill
前端·agent
冴羽2 小时前
超越 Vibe Coding —— AI 辅助编程指南
前端·ai编程·vibecoding
梦想的颜色2 小时前
一天一个SKILL——前端最佳自动化测试 webapp-testing
前端·web app