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

  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. php 延迟静态绑定: static关键字

    abstract class DomainObject { public static function create() { return new self(); } } class User ex ...

  2. 关于矩阵快速幂的用法总结QwQ

    umm首先矩阵快速幂的板子就不港了比较简单的还是?就结合二进制地理解一下就好了,代码可以翻蒟蒻の考前续命这里面放了我记得? 主要是说下应用趴? 目前我会的似乎就是个矩阵加速?简单来说就是个给一个递推式 ...

  3. Spring Boot 2.0 新特性和发展方向

    以Java 8 为基准 Spring Boot 2.0 要求Java 版本必须8以上, Java 6 和 7 不再支持. 内嵌容器包结构调整 为了支持reactive使用场景,内嵌的容器包结构被重构了 ...

  4. zabbix3.2使用自带模板监控MySql

    一.zabbix自带MySql模板监控项 Zabbix3.0之后已经有MySql监控模板了,所以我们只要引用ZabbixServer自带的模板即可.zabbix默认有14个监控项 我们只需获取监控项需 ...

  5. [LeetCode] 236. Lowest Common Ancestor of a Binary Tree_ Medium tag: DFS, Divide and conquer

    Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree. According ...

  6. oracle 死锁

    oracle 死锁 --查用户名,查客户端机器 SELECT distinct s.username,s.MACHINE, s.sid||','||s.serial# FROM gv$session ...

  7. 51nod 1101 换零钱 (完全背包)

    N元钱换为零钱,有多少不同的换法?币值包括1 2 5分,1 2 5角,1 2 5 10 20 50 100元. 例如:5分钱换为零钱,有以下4种换法: 1.5个1分 2.1个2分3个1分 3.2个2分 ...

  8. 使用Python在自己博客上进行自动翻页

    先上一张代码及代码运行后的输出结果的图! 下面上代码: # coding=utf-8 import os import time from selenium import webdriver #打开火 ...

  9. springMVC学习路线3-整合spring(annotion方式)

    个人认为使用框架并不是很难,关键要理解其思想,这对于我们提高编程水平很有帮助.不过,如果用都不会,谈思想就变成纸上谈兵了!!!先技术,再思想.实践出真知. 1.基本概念 1.1 Spring   Sp ...

  10. 使用shiro框架,解决跳转页面出现404的问题

    shiro框架是一个安全框架,在进行登录的时候,如果没有配置路径,它会跳到shiro的默认配置的路径“/”下面,所以总是会出现404的错误,因为它的路径是保存在session中 所以需要我们把sess ...