热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

window.open()弹框页面交互+表格数据回显以及跨页回显

直接上效果:情景描述:(vue+element-ui)前面显示,显示数据来源来之后面按钮,点击按钮弹出一个新的页面,弹出新的弹框使用的是window.open();如果使用嵌套组件

直接上效果:

《window.open()弹框页面交互+表格数据回显以及跨页回显》

情景描述: (vue+element-ui)
《window.open()弹框页面交互+表格数据回显以及跨页回显》
前面显示,显示数据来源来之后面按钮,点击按钮弹出一个新的页面,弹出新的弹框使用的是window.open();如果使用嵌套组件化思想,此父子组件相互传参就比较简单,没有技术难度,实现起来也比较简单。使用window.open()弹出新页面,难度在于父子间的通信,研究了很久,子组件使用h5中的postMessage方法,通过父组件监听方法,实现通信,在用父组件向子组件通信时使用同样的方法时,遇到了问题,暂时没有解决,用了一个简单的方法获取父组件的值。
原始的用意想在父子组件通过固定的方法获取父组件传递的数据和子组件触发固定方法,能把值传给父组件。

子组件向父组件通信:

confirm:function()
{
debugger; // type 用来
var json = { type:'echoInfo',data:[]};
json.data = this.selected ;
// var jsOnStr= JSON.stringify(json);
// 使用 h5中的postMessage 能解决页面跨域问题 第一个参数表示 需要回传的数据,第二个参数时url * 表示不限制
window.opener.postMessage(json,'*');
window.close();
},

父组件监听:

//生命周期 - 挂载完成(可以访问DOM元素)
mounted() {
var that = this ;
window.addEventListener('message', function(e){
if(e.data !=undefined && e.data !='' ){
debugger
if(e.data ==undefined || e.data ==''){
return ;
}
// var json = JSON.parse(e.data);e.data;
var json = e.data;
if(json.type =="echoInfo")
{
that.echoData = json.data ;// 传递过来的值
that.receiveMessage(json.data);
}
}
});
},

父组件—>子组件的通信 (以下方案 不具有通用性,不建议使用,只是提供一种思路

<el-input id="parentValue" v-model="echo" placeholder="能确定回显内容的唯一值,如id" disabled ></el-input>

window.open(BaseUrl+"/#/elementTable", 'newwindow', 'parentValue").value;

el-table表格回显的key point code:

if (this.selected !=undefined && this.selected !='') {
for(var i=0;i<this.pagination.resultList.length;i++){
for(var j=0;j<this.selected.length;j++){
if(this.pagination.resultList[i].name===this.selected[j].name){
this.$refs.multipleTable.toggleRowSelection(this.pagination.resultList[i]);// 回显选中默认数据的关键点
}
}
}

} else
{
this.$refs.multipleTable.clearSelection();
}

<el-table
ref="multipleTable"
:data="pagination.resultList"
@select="onSelect"
@select-all="onSelectALL"
style="width: 100%"> <!-- :selectable="selectable" -->
<el-table-column type="selection" :reserve-selection="true"></el-table-column>
<el-table-column label="日期" width="180">
<template slot-scope="scope">
<i class="el-icon-time"></i>
<span style="margin-left: 10px">{ { scope.row.date }}</span>
</template>
</el-table-column>
<el-table-column label="姓名" width="180">
<template slot-scope="scope">
<el-popover trigger="hover" placement="top">
<p>姓名: { { scope.row.name }}</p>
<p>住址: { { scope.row.address }}</p>
<div slot="reference" class="name-wrapper">
<el-tag size="medium">{ { scope.row.name }}</el-tag>
</div>
</el-popover>
</template>
</el-table-column>
<el-table-column
prop="address"
label="地址"
:formatter="formatter">
</el-table-column>
<el-table-column
prop="tag"
label="标签"
width="100"
:filters="[{ text: '同学', value: '同学' }, { text: '老师', value: '老师' }]"
:filter-method="filterTag"
filter-placement="bottom-end">
<template slot-scope="scope">
<el-tag
:type="scope.row.tag === '家' ? 'primary' : 'success'"
disable-transitions>{ { scope.row.tag}}</el-tag>
</template>
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button
size="mini"
@click="handleEdit(scope.$index, scope.row)">编辑</el-button>
<el-button
size="mini"
type="danger"
@click="handleDelete(scope.$index, scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>

涉及跨页回显时的处理,监听表格数据的变化

selected:[],// 实时选中数据,用于回显 记录需要回显的数据 实时更新
falseList:[],// 记录取消的数据
trueList:[],// 记录选中的数据

监听数据的变化: selectedd的数据就是需要默认选中的数据,此字段是实时更新的。

watch:{
pagination:function(op)
{
debugger;
this.resultList = op.resultList ;
},
falseList:function(value)
{

if(this.trueList.length == 0)
{
var totalArray = this.mergeArrayRelaseSame(this.selected,this.trueList);
if(this.falseList !='' && this.falseList.length !=0)
{
// 总数据中删除 取消的数据

var len = this.falseList.length ;
for(var i=0;i<len;i++)
{
var totalLen = totalArray.length ;
for(var j=totalLen -1 ;j>=0;j--)
{

if(totalArray[j].id == this.falseList[i].id){
totalArray.splice(j,1);
break
}
}
}
}
this.selected = totalArray ;
console.log(this.selected);
}

},
trueList:function(value)
{
// 开始回显的数据+进入页面选中的数据-清除选中的数据
// selected+trueList-falseList
var totalArray = this.mergeArrayRelaseSame(this.selected,this.trueList);
if(this.falseList !='' && this.falseList.length !=0)
{
// 总数据中删除 取消的数据
var totalLen = totalArray.length ;
var len = this.falseList.length ;
for(var i=0;i<len;i++)
{
for(var j=totalLen -1 ;j>=0;j--)
{

if(totalArray[j].id == this.falseList[i].id) // 判断数据是否需要删除的依据
{
totalArray.splice(j,1);
break
}
}
}
}
this.selected = totalArray ;
console.log(this.selected);

},
},

关键处理代码:

思路:实时监听选中和取消的数据,并实时计算需要回显的数据并实时更新selected,保证准确性。完全具备通用性。

此处参考文档地址:https://juejin.im/post/5d0091236fb9a07eec59c265

**项目中需要需要实时更新回显,跨页回显,此博文给我本人很好的解决思路,完美的解决了当时遇到的问题,本人结合原作者文章给予的思路和参考处理方案,部分引用原作者代码。完美解决问题,在此。对作者表示感谢。
**

//表格当前页全选出发函数
onSelectALL:function(rows)
{
this.indeterminate = true ;
var lenNow = this.resultList.length;
// 判断勾选全选本页是选中 还是取消
if(rows.indexOf(this.resultList[0]) !== -1)
{
debugger
//选中
for(var i=0; i<lenNow ;i++)
{
// 记录撤销数组 选中后删除数据操作
for(var n = 0;n<this.falseList.length;n++)
{
if(this.falseList[n].id== this.resultList[i].id)
{
this.falseList.splice(n,1)
}
}
// 记录选中数据数据 选中部分操作
if(this.trueList.length !== 0)
{
if(this.trueList.indexOf(this.resultList[i]) === -1)
{
this.trueList.push(this.resultList[i]);
}
}
else
{
if(this.trueList.indexOf(this.resultList[i])=== -1)
{
this.trueList.push(this.resultList[i]);
}
}
}
}
else
{
debugger
// 取消操作
for(var j=0;j<lenNow;j++)
{
// 记录撤销的操作 往记录撤销数组中添加数据
if(this.falseList.length !== 0)
{
if(this.falseList.indexOf(this.resultList[i])=== -1)
{
this.falseList.push(this.resultList[j]);
}
}
if(this.falseList.length === 0)
{
this.falseList.push(this.resultList[j]);
}
// 记录选中的相关操作 撤销时,删除已选中的数组中的取消的数据的删除
if(this.trueList.length !==0)
{
for(var n = 0; n<this.trueList.length;n++)
{
if(this.trueList[n].id === this.resultList[j].id)
{
this.trueList.splice(n,1);
}
}
}
}
}

},
// 选中数据操作
onSelect:function(rows,row)
{
this.indeterminate = true ;
var selected = rows.length && rows.indexOf(row) !== -1
var lenFalse = this.falseList.length
var lenTrue = this.trueList.length
if(selected)
{
// 选中
// 对记录撤销选中的计算 falseList
if(lenFalse !== 0)
{
for(var i=0;i<lenFalse;i++)
{
if(this.falseList[i].id === row.id)
{
this.falseList.splice(i,1);
break
}
}
}
// 对记录选中的数据的计算 trueList
if( lenTrue !=0)
{
if(this.trueList.indexOf(row.id) === -1)
{
this.trueList.push(row);
}
}
if(lenTrue ==0)
{
this.trueList.push(row);
}
}
else
{
// 取消 falseList
this.falseList.push(row);
// trueList 操作
for(var i=0;i<lenTrue;i++)
{
if(this.trueList[i].id===row.id)
{
this.trueList.splice(i,1);
break
}
}
}
},
// 数据合并并去重 arr [{id:'',value:''},...]
mergeArrayRelaseSame: function(arr1,arr2)
{
var mergeArray = arr1.concat(arr2);
var newArray = [] ; //存放去重后的数据的新数组
for(var i=0;i<mergeArray.length;i++)
{
var item1 = mergeArray[i];
var flag = true ;
for(var j=0;j<newArray.length;j++)
{
var item2 = newArray[j];
if(item1.id == item2.id)
{
flag = false ;
}
}
if(flag)
{
newArray.push(item1);
}
}
return newArray ;
},

以上仅仅为关键点的代码。源码代码路径为:

https://github.com/zhao0215/echotable

ps:欢迎转载,转载请标明本文章原文地址。


推荐阅读
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 修复安装win10失败并提示“磁盘布局不受UEFI固件支持”的方法
    本文介绍了修复安装win10失败并提示“磁盘布局不受UEFI固件支持”的方法。首先解释了UEFI的概念和作用,然后提供了两种解决方法。第一种方法是在bios界面中将Boot Mode设置为Legacy Support,Boot Priority设置为Legacy First,并关闭UEFI。第二种方法是使用U盘启动盘进入PE系统,运行磁盘分区工具DiskGenius,将硬盘的分区表设置为gpt格式,并留出288MB的内存。最后,通过运行界面输入命令cmd来完成设置。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了brain的意思、读音、翻译、用法、发音、词组、同反义词等内容,以及脑新东方在线英语词典的相关信息。还包括了brain的词汇搭配、形容词和名词的用法,以及与brain相关的短语和词组。此外,还介绍了与brain相关的医学术语和智囊团等相关内容。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
author-avatar
鄙人灵魔世界
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有