很多时候,我们会遇到这种情况,组件加载需要请求后台数据,然后填充组件。那么我们一般会这样处理:如【使用异步请求的方式】代码;

  1. 加载组价的时候,未获得数据,render一个空的div;
  2. 然后异步请求数据,获得数据后再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页面刷新问题的更多相关文章

  1. 页面刷新vuex数据消失问题解决方案 之 vuex中间件

    之前我写了一篇用ES6 Proxy方案解决数据同步的文章 页面刷新vuex数据消失问题解决方案. 今天和同事沟通这个vuex数据还原问题,我说我的方法很奇异.聊着聊着,同事咋不用  store.sub ...

  2. react+antd分页 实现分页及页面刷新时回到刷新前的page

    antd框架地址:https://ant.design/index-cn 利用antdUI框架做了个分页,其他功能都没问题,但是页面跳转后刷新会回到第一页,经过学习,在组件里增加了hash值,详情请看 ...

  3. react项目中登陆注册验证码的倒计时,页面刷新不会重置

    目前很多的网站和app在做登陆注册时都会用到手机验证码,为了防止验证码轰炸,也就是随意的点击验证码,一般我们需要对获取验证码进行一些限制,最常用到的是在规定时间内不得重复发送. 实现倒计时很简单,可以 ...

  4. 页面刷新vuex数据消失问题解决方案

    VBox持续进行中,哀家苦啊,有没有谁给个star. vuex是vue用于数据存储的,和redux充当同样的角色. 最近在VBox开发的时候遇到的问题,页面刷新或者关闭浏览器再次打开的时候数据归零.这 ...

  5. VUE的一个数据绑定与页面刷新相关的bug

    1.场景: N层嵌套的循环查询业务场景,框架是vue.其中在最后一层查完之后,还需要查其中每一项的两个属性,类型都是列表.查完之后将其赋值给一个变量用于页面展示.代码如下: (1)异常代码: getS ...

  6. Vuex数据页面刷新丢失问题解决方案

    用Vue做项目开发很久了,对于vuex能用.会用,但是因为状态脱离页面和刷新丢失两个原因,一直都有种抵触,特别是一些简单的数据都是通过query或者本地存储就解决了,然而对于一些复杂内容,不可避免的还 ...

  7. 使用sessionStorage解决vuex在页面刷新后数据被清除的问题

    https://www.jb51.net/article/138218.htm 1.原因 2.解决方法 localStorage没有时间期限,除非将它移除,sessionStorage即会话,当浏览器 ...

  8. vue 项目中如何在页面刷新的状态下保留数据

    1.问题:在vue项目中,刷新页面之后,我当前打开的所有菜单,都消失,我如何实现刷新之后页面仍然是刷新之前的状态 效果图: 解决方法: 使用vuex作状态管理: 将vuex里面的数据同步更新到loca ...

  9. flex页面刷新实现

    页面刷新:navigateToURL(new URLRequest("javascript:location.reload();"),"_self"); 关闭浏 ...

随机推荐

  1. transition:all .2s

    all属性实际上是所有CSS属性的缩写,表示,所有的CSS属性都怎样怎样.

  2. MySQL优化小结

    数据库的配置是基础.SQL优化最重要(贯穿始终,每日必做),由图可知,越往上优化的面越小,最基本的SQL优化是最重要的,往上各个参数也没太多调的,也不可能说调一个innodb参数性能就会好多少,而动不 ...

  3. [redis] hiredis-vip 简单使用

    redis的C语言client,有几个:https://redis.io/clients#c 支持cluster的只有一个唯品会的版本:https://github.com/vipshop/hired ...

  4. scala-创建泛型数组(T: Manifest)

    def arrayT[T: Manifest](ary: T*): Array[T] = {//接受多个参数 val arys = new Array[T](ary.length) //初始化一个数组 ...

  5. 20190412 T-SQL语言一

    -- T-SQL ------------------------------------------------------ 例如1 什么是注释符 单行注释select *from kc /*sel ...

  6. PyQt5的安装及基本配置

    安装PyQt5 注:Pyqt5只支持python3.5以上版本 Mac安装 Mac上使用编译安装的话,后面使用pyinstaller打包可能会出问题,推荐使用命令行一键安装,Linux如果包管理没有的 ...

  7. java框架之SpringBoot(13)-检索及整合Elasticsearch

    ElasticSearch介绍 简介 我们的应用经常需要使用检索功能,开源的 Elasticsearch 是目前全文搜索引擎的首选.它可以快速的存储.搜索和分析海量数据.SpringBoot 通过整合 ...

  8. CentOS 7 keepalived+LVS

    LVS架构中 , 不管是NAT模式还是DR模式 , 当后端的RS宕机了 , 调度器还是会把请求转发到宕掉的RS上 , 然而keepalived可以解决该问题 , 它不仅仅有高可用的功能 , 还有负载均 ...

  9. 关于var、let、const的故事

    对于一门编程语言来说,变量与常量是再正常不过的两种,JavaScript是一直解释型的弱类型语言. JavaScript中变量或者常量可以用var.let.const(后两者是ES6的新特性). 1. ...

  10. 记录Js 文本框验证 与 IE兼容性

    最近的日常就是将测试小姐姐提交的bug进行修改,想来这种事情还是比较好开展的,毕竟此项目已上线一年多,现在只是一些前端的问题需要改正.实际上手的时候并不是这样,原项目是在谷歌上运行,后来由于要新增一个 ...