yylib-quick-mobile
Version:
yylib-quick-mobile
173 lines (169 loc) • 7.26 kB
JavaScript
/**
* Created by gaoly on 2018/05/17. 用于生产环境打包的时候 会将按需加载的组件传递进来
* 在调试和预览时 使用YYCreatePage
*/
import React from 'react'
//import sa from 'superagent';
window._yylib_global_cache_={};
import { Toast } from 'antd-mobile';
var YYCreateView = require('./YYCreateView');
var {MODULE_URL,ADDR} = require('./../../common/RestUrl');
var {deepClone}=require('../../utils/FunctionUtil')
import UrlUtils from '../../utils/UrlUtils';
var CACHE_KEY = "YYCreatePage_";//缓存的键值前缀
class YYCreatePageProd extends React.Component {
constructor(props){
super(props);
this.state={
appCode:props.appCode,
pageCode:props.pageCode,
billTypeCode:null,
uiMeta:undefined,
uiParser:props.uiParser,
uiEvent:props.uiEvent,
uiParams:props.uiParams,
uiMeta:props.uiMeta,
pluginUrl:null
}
}
componentWillReceiveProps(nextProps){
if ('uiMeta' in nextProps) {
this.setState({
uiMeta: nextProps.uiMeta
});
}
if ('uiParams' in nextProps) {
this.setState({
uiParser: nextProps.uiParams
});
}
if ('uiParser' in nextProps) {
this.setState({
uiParser: nextProps.uiParser
});
}
if ('uiEvent' in nextProps) {
this.setState({
uiEvent: nextProps.uiEvent
});
}
if('appCode' in nextProps && 'pageCode' in nextProps){
//当应用编码或页面编码变更时重新加载刷新页面
if(this.props.appCode !== nextProps.appCode || this.props.pageCode !== nextProps.pageCode){
this.refreshPage(nextProps.appCode,nextProps.pageCode,null,null);
}
}
if('location'in nextProps){
var query= this.props.location?this.props.location.query:{};
var nextQuery= nextProps.location?nextProps.location.query:{};
if(query.appCode!==nextQuery.appCode||query.pageCode!==nextQuery.pageCode){
this.refreshPage(nextProps.appCode,nextProps.pageCode,nextProps.location,null);
}
}
if('routeParams' in nextProps){
var query= this.props.routeParams?this.props.routeParams:{};
var nextQuery= nextProps.routeParams?nextProps.routeParams:{};
if(query.appCode!==nextQuery.appCode||query.pageCode!==nextQuery.pageCode){
this.refreshPage(nextProps.appCode,nextProps.pageCode,null,nextProps.routeParams);
}
}
}
refreshPage(appCode,pageCode,location,routeParams){
var query= location?location.query:{};
if(routeParams)query = routeParams;
//如果属性不存在则取路由URL参数
var _appCode = appCode?appCode:query.appCode;
var _pageCode = pageCode?pageCode:query.pageCode;
this.setState({appCode:_appCode,pageCode:_pageCode}); //更新appCode|pageCode
this._loadPageData(_appCode,_pageCode);
}
_loadPageData(appCode,pageCode){
var ajax=window.YYUtils.Ajax;
var self = this;
if(!appCode||!pageCode)return;
var {serverUrl,enableOrg,mode,enableCache} = this.props;
var params = {
appCode:appCode,
pageCode:pageCode,
mode:mode
};
//是否启用自动获取当前组织
if (enableOrg) {
params.orgId = window.YYUtils.AuthToken.getOrgaId();
params.tenantId = window.YYUtils.AuthToken.getTenantId();
}
//读取缓存(内存级)
var metaData = enableCache===false?null:this.getCache(CACHE_KEY+appCode+"_"+pageCode);
if(metaData){
self.setState({uiMeta: deepClone(metaData), billTypeCode:metaData.billTypeCode});
}else{
ajax.getJSONOffLine(serverUrl, params, function (result) {
var data = null;
if (result.success && result.backData && result.backData.data) {
data = JSON.parse(result.backData.data);
if(data.files){
self.filePath=data.files;//赋值给当前对象
}
if(result.backData.orgId){
console.info('[加载页面]'+result.backData.orgId.name+'('+result.backData.id+')/'+appCode+'/'+pageCode);
}
var path=(result.backData.files&&result.backData.files!="")?ADDR+"/"+result.backData.files:null
self.setState({pluginUrl:path,uiMeta: (data&&data!="")?data:null, billTypeCode:result.backData.billTypeCode});
self.setCache(CACHE_KEY+appCode+"_"+pageCode, (data&&data!="")?null:deepClone(data));//存入缓存(内存级)
}else{
console.warn('[加载页面]'+appCode+'/'+pageCode+'/空页面');
}
});
}
}
componentWillUpdate(nextProps,nextState){
if(nextState.uiMeta){
Toast.hide();
}
}
componentWillMount(){
Toast.loading('加载中',0);
}
getCache(key) {
return window._yylib_global_cache_[key]
}
// 保存数据到内存存储
setCache(key, value) {
window._yylib_global_cache_[key] = value
}
componentDidMount() {
var {appCode,pageCode,location,routeParams,localCode} = this.props;
(!localCode)&& this.refreshPage(appCode,pageCode,location,routeParams);
}
render() {
//parserControl为编译时传递过来的动态组件集合
var {router,location,params,route,routeParams,routes,enableLoading,parserControl}=this.props;
var {appCode,pageCode,billTypeCode,pluginUrl} = this.state;
var _props = {router,location,params,route,routeParams,routes};
_props.uiParams = this.state.uiParams;
_props.uiMeta = this.state.uiMeta;
_props.uiParser = this.state.uiParser;
_props.uiEvent = this.state.uiEvent;
var returnDom=null;
if(this.state.uiMeta){
returnDom=(<YYCreateView {..._props} pluginUrl={pluginUrl} parserControl={parserControl} appCode={appCode} pageCode={pageCode} billTypeCode={billTypeCode}/>);
}else if(enableLoading){
returnDom=(<p></p>);
}
return returnDom;
}
}
YYCreatePageProd.defaultProps={
uiMeta:null,//本地存储数据
appCode:null,//应用编码
pageCode:null,//页面编码
uiParser:null,//UI组件解析器
uiEvent:null,//UI事件处理器
uiParams:null,//UI参数处理器
mode:null, // publish:发布状态 debug:调试状态(默认)
serverUrl:MODULE_URL.GET_PAGE_DATA,
enableOrg:true,//是否获取当前组织
enableCache:false,//是否启用缓存
enableLoading:true//是否启用加载中
}
module.exports = YYCreatePageProd;