首页 > 其他分享 >vue-router 4.1.4版本以上,打开新页面并隐式传参

vue-router 4.1.4版本以上,打开新页面并隐式传参

时间:2023-06-02 10:22:45浏览次数:47  
标签:传参 vue const 新页面 window params router 4.1

情景

  1. 框架:Vue3 + Vite4 + VueRouter4.1.6
  2. 需求:现需要实现点击打开新页面,并把一些数据传过去
  3. 限制:
  • 数据量较大,有一定私密性,不适合用query传递;
  • 需要从session中获取token判断访问权限,因此需要用router.resolve携带session打开新页面
  • 使用params传参在4.1.4以上版本被抛弃了--> vue-router 4.1.4 CHANGELOG

尝试

官方推荐的params传参传参替代方案有:

  1. 用pinia等状态管理工具缓存数据 --> 无法跨页面使用
  2. 使用query或 /path/:param 这样的显示传参 --> 上面已经说了不适用于这次的需求
  3. 使用History API设置state --> 使用router-link无法携带session,在js中调用又只是当前页跳转
  4. 在beforeEach里,用to.meta判断,再获取数据 --> 没有接口的情况下难以实现

除此之外,还尝试过
1.router-link。无法携带session,且params依旧无法传递

<router-link :to="{ name: 'thematicMap', params: { item } }" target="_blank"></router-link>
<router-link :to="{ name: 'thematicMap', state: { item } }" target="_blank"></router-link>
  1. 先query传参,再router.push去掉地址栏的参数。不介意地址栏会短暂出现参数可以尝试,下面代码也需要优化参数的获取方式

旧页面:

const routeUrl = router.resolve({
	path: "/index/thematicMap",
	query: { item: JSON.stringify(props.item) },
});
window.open(routeUrl.href, "_blank");

新页面:

const router = useRouter();
const route = useRoute();
router.push({ name: route.name, params: route.query });

目前发现的最佳方案

使用 window.postMessage() 延时传递数据。

参考:window.open() 跳转其他系统,传参不放在URL 上

旧页面:

const router = useRouter();
const origin = window.location.origin;
const toPreview = () => { // 点击触发,打开新页面
	const routeUrl = router.resolve({
		name: "thematicMap",
	});
	const childWindow = window.open(routeUrl.href, "_blank");
	setTimeout(() => {
		childWindow.postMessage(JSON.parse(JSON.stringify(props.item)), origin + routeUrl.href);
	}, 500);
};

新页面:

const params = ref({});
const myOrigin = window.location.origin;
const initMessageListener = () => {
	window.addEventListener("message", function (e) {
		if (e.origin !== myOrigin) return; // 检测数据来源,这里是同源跳转的判断
		const data = e.data;
		params.value = data;
		console.log("params", params.value);
	});
};
initMessageListener();

标签:传参,vue,const,新页面,window,params,router,4.1
From: https://www.cnblogs.com/cosmicbison/p/17451020.html

相关文章

  • Vue-自定义icon实现
    在项目中引入了element-ui之后,发现其内置的icon有限,无法满足项目的需求,因此需自定义icon来实现需求。在vue项目的components下新建SvgIcon目录,在SvgIcon目录下新建index.vue插入代码:<template><svgclass="svg-icon"aria-hidden="true"><use:xlink:href="ic......
  • vue基础用法-内容渲染指令
    1.指令的概念指令(Directives)是vue为开发者提供的模板语法,用于辅助开发者渲染页面的基本结构。vue中的指令按照不同的用途可以分为如下6大类:内容渲染指令属性绑定指令事件绑定指令双向绑定指令条件渲染指令列表渲染指令注意:指令是vue开发中最基础、最常用、最简单的知识......
  • 前端页面之间url传参
    functiongetUrlParam(name){varreg=newRegExp("(^|&)"+name+"=([^&]*)(&|$)");varr=window.location.search.substr(1).match(reg);//ECMAScriptv3已从标准中删除了unescape()函数,并反对使用它,因此应该用decodeURI......
  • 基于JAVA的springboot+vue财务管理系统,附源码+数据库+论文+PPT
    1、项目介绍随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代,财务管理系统就是信息时代变革中的产物之一。任何系统都要遵循系统设计的基......
  • vue系列---【vue 使用decimal.js 解决小数相加合计精确度丢失问题】
    使用npm安装decimal.js库npminstalldecimal.js2.在Vue组件中引入该库importDecimalfrom'decimal.js';3.使用示例footerMethod({columns,data}){letsumArr=[];columns.map((column,columnIndex)=>{if(columnIndex===0){su......
  • 在Vue中实现扫码枪读取条形码数据
    1.创建扫码枪输入组件首先,我们需要创建一个Vue组件来处理扫码枪的输入。在组件中,我们使用一个input元素来接收扫码枪的输入,并将输入的值绑定到组件的scanEntry属性上。<template><divclass="BarCodeScannerDiv"><inputclass="input"v-model="scanEntry":placehold......
  • vue2响应式原理
    一、初识响应式原理如果我们在Vue实例中声明过的数据发生了改变,那么所有用到这份数据的视图都会更新重新渲染,我们称这些数据就是响应式数据。响应式概括来说就是数据驱动视图的自动更新。<divid="app">{{obj.message}}</div>letdata={obj:{message:'Hel......
  • ant design vue 下的a-input 使用v-decorator(修改数据)回显
    a-input使用v-decorator回显不应该用v-model,可以使用this.form.setFieldsValue来动态改变表单值。定义form:<template><divclass="main"><a-formid="formLogin"class="user-layout-login"ref="formLogin"......
  • 初识Vue
    前端的发展史#1HTML(5)、CSS(3)、JavaScript(ES5、ES6):编写一个个的页面->给后端(PHP、Python、Go、Java)->后端嵌入模板语法->后端渲染完数据->返回数据给前端->在浏览器中查看 -javascript=ECMAScript(5,6,13)+Dom+Bom#2Ajax的出现->后台发送异步请求,Re......
  • antd的upload组件的各种上传、下载操作(vue)
    作为前端小白刚刚接触上传、下载文件的操作也让我很头疼,所以利用时间记录一下方便巩固,希望能够帮到大家。我将情况分为以下几种:一、点击按钮上传单个文件//html<a-upload:action="baseUrl+'/api/uploadSingleFile'":headers="headers"......