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

  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. python-----python简介

    一.python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,Guido开始写Python语言的编译器.Python这个名字,来自Guido所 ...

  2. Nginx之使用nginx搭建简单的文件服务器

    使用nginx可以搭建简单文件服务器 安装nginx(不详述) 修改配置文件 /usr/local/nginx/conf/nginx.conf user root; /usr/local/nginx/ ...

  3. 1.7Oob 方法重载和成员变量,局部变量,构造方法

    1:方法调用,如果值有参方法,必须传递实际参数. 2:方法定义了多少个参数,传递的实际参数就 必须有多少个, 方法的作用:1:描述某个类的作用,2:软件的复用 这个复用率低,作用小,价值很低: 3:

  4. 【模拟与阅读理解】Gym - 101954C Rullete

    http://codeforces.com/gym/101954/problem/C 题意:14行伪代码让你翻译. 坑得yibi #include<stdio.h> #include< ...

  5. Java ee第五周作业

    Applet: Applet是采用Java编程语言编写的小应用程序,该程序可以包含在 HTML(标准通用标记语言的一个应用)页中,与在页中包含图像的方式大致相同. 含有Applet的网页的HTML文件 ...

  6. MAC OSX 开启/禁用SafeSleep功能

    如果想要禁用,我们需要在终端中输入下面的命令: 然后定位到/private/var/vm/删除已经存在的sleepimage文件 cd /private/var/vm/ 使用下面的命令删除该文件 su ...

  7. ubuntu12.04下编译Linux tina 2.1/android经验

    用的是osboxes下的vdi. 编译Linux 1. 不能在root用户下操作 2. 执行 make kernel_menuconfig 报错,需要 apt-get install zlib1g z ...

  8. Cocos Creator 鼠标事件

    鼠标事件// 使用枚举类型来注册node.on(cc.Node.EventType.MOUSE_DOWN, function (event) {console.log('Mouse down');}, ...

  9. 监听器&上传下载&I18N

    监听器(Listener) 监听Java对象 的方法调用和属性改变() web的一个组件 事件驱动编程:事件源,事件名称,事件响应函数,事件对象 以后在Spring中的配置 WEB中有哪些监听器?  ...

  10. js跨域交互之jsonp - 看完就能让你了解jsonp原理 (原)

    跨域? 跨域的安全限制都是对浏览器端来说的,服务器端是不存在跨域安全限制的. 同源策略? 一般来说 a.com 的网页无法直接与 b.com的服务器沟通, 浏览器的同源策略限制从一个源加载的文档或脚本 ...