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

  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. vivado/FPGA 使用小纪

    1.使用FPGA做为外部控制器的总线译码时,将总线时钟接在全局时钟脚上(MRCC),就算接在了局部时钟(SRCC)上,也要通过BUFG转为全局时钟走线,否则会因为local clk到各部分的时延较大引 ...

  2. Codeforces 431C - k-Tree - [树形DP]

    题目链接:https://codeforces.com/problemset/problem/431/C 题意: 定义一个 $k$ 树,即所有节点都有 $k$ 个儿子节点,相应的这 $k$ 条边的权重 ...

  3. Rob Pike

    罗布·派克_百度百科 https://baike.baidu.com/item/罗布·派克   1. 你无法断定程序会在什么地方耗费运行时间.瓶颈经常出现在想不到的地方,所以别急于胡乱找个地方改代码, ...

  4. springboot 2.0部署到Tomat8.5上

    1.改jar为war 2.改下打包的名字 3.删掉tomcat的webapps下面的所有文件夹.将打好的jar包放入到webapps下 4.运行tomcat,双击shutdown.bat 注意: sp ...

  5. bootstrap 中关于 HTML5 aria-* and role的用法

    HTML5 aria-* and role 在bootstrap中看到role和aria-*,不知道干嘛的.google一下,发现aria的意思是Accessible Rich Internet Ap ...

  6. Redis入门到高可用(十五)—— GEO

    一.简介 二.应用场景 三.API 1.geoadd 2.geopos 3.geodist 4.georadius 四.相关说明

  7. ZooKeeper之service discovery

    Zookeeper整体介绍 ZooKeeper is a centralized service for maintaining configuration information, naming, ...

  8. 退出unity运行

    public void GetExit()//退出运行 { #if UNITY_EDITOR UnityEditor.EditorApplication.isPlaying = false;//用于退 ...

  9. java之高效操作文件

    代码: import java.io.IOException; import java.nio.file.FileVisitOption; import java.nio.file.FileVisit ...

  10. Zeu.js

    一个生成各种 GIF 动画的 JavaScript 类库,非常适合用于让你的数据展示变得更加地生动.使用起来也非常简单,有数据展示需求的同学可以尝试一下.https://shzlw.github.io ...