热门标签 | 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:欢迎转载,转载请标明本文章原文地址。


推荐阅读
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 本文介绍了如何使用 Node.js 和 Express(4.x 及以上版本)构建高效的文件上传功能。通过引入 `multer` 中间件,可以轻松实现文件上传。首先,需要通过 `npm install multer` 安装该中间件。接着,在 Express 应用中配置 `multer`,以处理多部分表单数据。本文详细讲解了 `multer` 的基本用法和高级配置,帮助开发者快速搭建稳定可靠的文件上传服务。 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 解决Only fullscreen opaque activities can request orientation错误的方法
    本文介绍了在使用PictureSelectorLight第三方框架时遇到的Only fullscreen opaque activities can request orientation错误,并提供了一种有效的解决方案。 ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • Ext JS MVC系列一:环境搭建与框架概览
    本文主要介绍了如何在项目中使用Ext JS 4作为前端框架,并详细讲解了Ext JS 4的MVC开发模式。文章将从项目目录结构、相关CSS和JS文件的引用以及MVC框架的整体认识三个方面进行总结。 ... [详细]
  • 检查在所有可能的“?”替换中,给定的二进制字符串中是否出现子字符串“10”带 1 或 0 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
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社区 版权所有