巧用同步请求处理react页面刷新问题
很多时候,我们会遇到这种情况,组件加载需要请求后台数据,然后填充组件。那么我们一般会这样处理:如【使用异步请求的方式】代码;
- 加载组价的时候,未获得数据,render一个空的div;
- 然后异步请求数据,获得数据后再forceupdate,刷新组件,将数据显示出来;
分析这种方式,首先刷新了两次,浪费资源;其次,在用户体验上,页面会有刷新的感觉,用户体验不好。
/*
档案详细信息查看panel
@param data 档案对象
@param archiveType 档案类型
@param attachs 附件列表
*/
var ArchiveDetailPanel=React.createClass({
getDefaultProps:function(){ },
getArchiveInfoTable:function(p_data,p_type){// 根据档案类型,生成档案类型
switch(p_type){
case "贷款档案":
return <InfoForm data={this.props.data}>
<LoanArchiveBaseInfo/>
</InfoForm>;
break;
case "归集档案":
return <InfoForm data={this.props.data}>
<PoolArchiveBaseInfo/>
</InfoForm>;
break;
case "会计档案":
return <InfoForm data={this.props.data}>
<AccountingArchiveBaseInfo/>
</InfoForm>;
break;
case "执法档案":
return <InfoForm data={this.props.data}>
<EnforceArchiveBaseInfo/>
</InfoForm>; break;
case "提取档案":
return <InfoForm data={this.props.data}>
<ExtractArchiveBaseInfo/>
</InfoForm>;
break;
}
}, print:function() {
var _url=CTX+"/web/print/printFileList.jsp?id="+this.props.data["id"]+"&type="+this.props.archiveType;
window.open(_url);
},
getAttachs:function(){
var _obj=this;
var _attachments=[];
var _attachUrl=CTX+"/attachments/getAttachByAID_Type";
var _params={};
_params["type"]=this.props.archiveType;
_params["id"]=this.props.data["id"]; $.ajax({
url : _attachUrl,
data:_params,
cache : false,
async : true,
type : "POST",
dataType : 'json',
success : function(p_res){
$.each(p_res,function(p_index){
p_res[p_index]["resId"]=this["资源id"]==-1? undefined:this["资源id"];
}); _obj.props["attachs"]=p_res;
_obj.forceUpdate();
}
});
},
render:function(){
var _obj=this;
var _style = {width:"100%",textAlign:"center"};
for (var i in this.props.style) {
// 方便增加新的style属性,而不用每次配置
_style[i] = this.props.style[i];
} // 同步获取附件信息
this.getAttachs();
if(this.props["attachs"])
return <div>
<InfoPanel>
<div className={"panel " + "panel-default"}>
<TitleText text={"档案详细信息-"+this.props["archiveType"]}/>
{this.getArchiveInfoTable(this.props["data"],this.props["archiveType"])}
</div>
<div className={"panel " + "panel-default"}>
<TitleText text="卷内资料"/><a style={{cursor:"pointer",position:"absolute",right:"40px",marginTop:"-30px"}} onClick={this.print}>打印</a>
<AttachmentTable canRemoveItem={false} className="attachTable" data={this.props["attachs"]}/>
</div>
</InfoPanel>
</div>;
else
return <div/>;
}
});
使用异步请求的方式
那么怎么解决呢?可以使用同步请求的方式。虽然很多时候不用同步请求了,但是在这种环境下,还是很有用的。如下代码
/*
档案详细信息查看panel
@param data 档案对象
@param archiveType 档案类型
@param attachs 附件列表
*/
var ArchiveDetailPanel=React.createClass({
getDefaultProps:function(){ },
getArchiveInfoTable:function(p_data,p_type){// 根据档案类型,生成档案类型
switch(p_type){
case "贷款档案":
return <InfoForm data={this.props.data}>
<LoanArchiveBaseInfo/>
</InfoForm>;
break;
case "归集档案":
return <InfoForm data={this.props.data}>
<PoolArchiveBaseInfo/>
</InfoForm>;
break;
case "会计档案":
return <InfoForm data={this.props.data}>
<AccountingArchiveBaseInfo/>
</InfoForm>;
break;
case "执法档案":
return <InfoForm data={this.props.data}>
<EnforceArchiveBaseInfo/>
</InfoForm>; break;
case "提取档案":
return <InfoForm data={this.props.data}>
<ExtractArchiveBaseInfo/>
</InfoForm>;
break;
}
}, print:function() {
var _url=CTX+"/web/print/printFileList.jsp?id="+this.props.data["id"]+"&type="+this.props.archiveType;
window.open(_url);
},
getAttachs:function(){
var _obj=this;
var _attachments=[];
var _attachUrl=CTX+"/attachments/getAttachByAID_Type";
var _params={};
_params["type"]=this.props.archiveType;
_params["id"]=this.props.data["id"]; $.ajax({
url : _attachUrl,
data:_params,
cache : false,
async : false,
type : "POST",
dataType : 'json',
success : function(p_res){
$.each(p_res,function(p_index){
p_res[p_index]["resId"]=this["资源id"]==-1? undefined:this["资源id"];
}); _obj.props["attachs"]=p_res;
}
});
},
render:function(){
var _obj=this;
var _style = {width:"100%",textAlign:"center"};
for (var i in this.props.style) {
// 方便增加新的style属性,而不用每次配置
_style[i] = this.props.style[i];
} // 同步获取附件信息
//this.getAttachs(); return <div>
<InfoPanel>
<div className={"panel " + "panel-default"}>
<TitleText text={"档案详细信息-"+this.props["archiveType"]}/>
{this.getArchiveInfoTable(this.props["data"],this.props["archiveType"])}
</div>
<div className={"panel " + "panel-default"}>
<TitleText text="卷内资料"/><a style={{cursor:"pointer",position:"absolute",right:"40px",marginTop:"-30px"}} onClick={this.print}>打印</a>
<AttachmentTable canRemoveItem={false} className="attachTable" data={this.props["attachs"]}/>
</div>
</InfoPanel>
</div>;
}
});
使用同步请求的方式
使用同步请求的方式,再获得数据以后,才会执行完render操作,只刷新一次,也不会让用户体验到刷新的感觉,完美解决问题!!
这样在组件的封装上有大用处,可以将一些通用的,不用关注的代码,封装到组件中,方便很多很多!
巧用同步请求处理react页面刷新问题的更多相关文章
- 页面刷新vuex数据消失问题解决方案 之 vuex中间件
之前我写了一篇用ES6 Proxy方案解决数据同步的文章 页面刷新vuex数据消失问题解决方案. 今天和同事沟通这个vuex数据还原问题,我说我的方法很奇异.聊着聊着,同事咋不用 store.sub ...
- react+antd分页 实现分页及页面刷新时回到刷新前的page
antd框架地址:https://ant.design/index-cn 利用antdUI框架做了个分页,其他功能都没问题,但是页面跳转后刷新会回到第一页,经过学习,在组件里增加了hash值,详情请看 ...
- react项目中登陆注册验证码的倒计时,页面刷新不会重置
目前很多的网站和app在做登陆注册时都会用到手机验证码,为了防止验证码轰炸,也就是随意的点击验证码,一般我们需要对获取验证码进行一些限制,最常用到的是在规定时间内不得重复发送. 实现倒计时很简单,可以 ...
- 页面刷新vuex数据消失问题解决方案
VBox持续进行中,哀家苦啊,有没有谁给个star. vuex是vue用于数据存储的,和redux充当同样的角色. 最近在VBox开发的时候遇到的问题,页面刷新或者关闭浏览器再次打开的时候数据归零.这 ...
- VUE的一个数据绑定与页面刷新相关的bug
1.场景: N层嵌套的循环查询业务场景,框架是vue.其中在最后一层查完之后,还需要查其中每一项的两个属性,类型都是列表.查完之后将其赋值给一个变量用于页面展示.代码如下: (1)异常代码: getS ...
- Vuex数据页面刷新丢失问题解决方案
用Vue做项目开发很久了,对于vuex能用.会用,但是因为状态脱离页面和刷新丢失两个原因,一直都有种抵触,特别是一些简单的数据都是通过query或者本地存储就解决了,然而对于一些复杂内容,不可避免的还 ...
- 使用sessionStorage解决vuex在页面刷新后数据被清除的问题
https://www.jb51.net/article/138218.htm 1.原因 2.解决方法 localStorage没有时间期限,除非将它移除,sessionStorage即会话,当浏览器 ...
- vue 项目中如何在页面刷新的状态下保留数据
1.问题:在vue项目中,刷新页面之后,我当前打开的所有菜单,都消失,我如何实现刷新之后页面仍然是刷新之前的状态 效果图: 解决方法: 使用vuex作状态管理: 将vuex里面的数据同步更新到loca ...
- flex页面刷新实现
页面刷新:navigateToURL(new URLRequest("javascript:location.reload();"),"_self"); 关闭浏 ...
随机推荐
- ASP.NET Core 2.1 中 ViewResultExecutor 的变化
之前在 ASP.NET Core 2.0 中可以正常运行的代码: var services = HttpContext.RequestServices; var executor = services ...
- git的简单玩法
本篇笔记参考廖雪峰的git教程,为方便查看将命令部分提取并记录下来. 无意对原作的版权侵犯,如需要学习请到廖雪峰网站学习git 创建git仓库 # mkdir learngit && ...
- PTA地下迷宫探索
地道战是在抗日战争时期,在华北平原上抗日军民利用地道打击日本侵略者的作战方式.地道网是房连房.街连街.村连村的地下工事,如下图所示. 我们在回顾前辈们艰苦卓绝的战争生活的同时,真心钦佩他们的聪明才智. ...
- Linux Input子系统
先贴代码: //input.c int input_register_handler(struct input_handler *handler) { //此处省略很多代码 list_for_each ...
- CentOS 6.8 安装TigerVNC 实现 Linux 远程桌面并安装火狐浏览器
CentOS 6.8 安装TigerVNC 实现 Linux 远程桌面并安装火狐浏览器 vnc客户端地址:https://files.cnblogs.com/files/MYSQLZOUQI/vnc- ...
- java框架之SpringBoot(1)-入门
简介 Spring Boot 用来简化 Spring 应用开发,约定大于配置,去繁从简,just run 就能创建一个独立的.产品级别的应用. 背景: J2EE 笨重的开发.繁多的配置.低下的开发效率 ...
- java中equals()和==的区别
java中的数据类型 基础数据类型 基础数据类型有byte.short.char.int.long.float.double.bool.String.除了 String 会比较地址,其它的基础类型的比 ...
- CSS-对于IE的兼容问题处理
css兼容问题 兼容问题 1.文字本身的大小不兼容.同样是font-size:14px的宋体文字,在不同浏览器下占的空间是不一样的,ie下实际占高16px,下留白3px,ff下实际占高17px,上留白 ...
- jsp一些使用技巧
1.web.xml中配置error页面 一.<error-page> <error-code>500</error-code> <location>50 ...
- Oracle 24角色管理
了解什么是角色 Oracle角色(role)就是一组权限(或者说是权限的集合). 用户可以给角色赋予指定的权限,然后将角色赋给相应的用户. 三种标准的角色 connect(连接角色) 拥有connec ...