跳转至

七 业务绑定


title: ecode文档 - 七、业务绑定 created: 2026-04-19 updated: 2026-04-19 type: reference tags: [oa, ecode, weaver, frontend] related: [oa/ecode-guide.md] source: https://e-cloudstore.com/doc.html


ecode, weaver, frontend] related: [oa/ecode-guide.md] source: https://e-cloudstore.com/doc.html ---#### 七、业务绑定

ecode除了可以在针对所有界面动态复写和动态注入组件之外,我们还提供了针对特殊业务绑定的sdk

ecode除了可以在针对所有界面动态复写和动态注入组件之外,我们还提供了针对特殊业务绑定的sdk

1、PC门户主题注册

ecodeSDK.rewritePortalThemeQueue.push(option) ecology版本要求:1906及1906+

ecodeSDK.rewritePortalThemeQueue.push(option) ecology版本要求:1906及1906+

ecode的主题开发方案,解决传统主题开发的几大问题:主题通常都需要二次修改,用了ecode只需复制一下即可开始二次修改,不用安装配置脚手架,甚至一些小修改项目人员即可处理;主题的复用问题,使用ecode开发的主题完全无侵入,可拔插方便的在不同环境之间共享;解决以往难以让客户维护主题源码的问题,主题交付客户之后,可让客户自行维护;此方案开发进行标准页面跳转,直接支持single page模式,可以用react-router进行路由快速切换

ecode的主题开发方案,解决传统主题开发的几大问题:主题通常都需要二次修改,用了ecode只需复制一下即可开始二次修改,不用安装配置脚手架,甚至一些小修改项目人员即可处理;主题的复用问题,使用ecode开发的主题完全无侵入,可拔插方便的在不同环境之间共享;解决以往难以让客户维护主题源码的问题,主题交付客户之后,可让客户自行维护;此方案开发进行标准页面跳转,直接支持single page模式,可以用react-router进行路由快速切换

(1)参数说明
参数 说明 类型 可选 默认 备注
option 复写配置 object 必填 {}
option.fn 复写钩子函数 function 必填 (params)=>{} params 参数请看下一个表格
option.order 复写排序 integer 选填 0
option.desc 复写说明 string 选填 ‘’

参数 说明 类型 可选 默认 备注

参数 说明 类型 可选 默认 备注 参数说明类型可选默认备注

option 复写配置 object 必填 {}

option.fn 复写钩子函数 function 必填 (params)=>{} params 参数请看下一个表格

option.order 复写排序 integer 选填 0

option.desc 复写说明 string 选填 ‘’ 无

option 复写配置 object 必填 {}

option复写配置object必填{} option.fn 复写钩子函数 function 必填 (params)=>{} params 参数请看下一个表格 option.fn复写钩子函数function必填(params)=>{}params 参数请看下一个表格 option.order 复写排序 integer 选填 0

option.order复写排序integer选填0 option.desc 复写说明 string 选填 ‘’ 无 option.desc复写说明string选填‘’无

integer 选填 0

option.order复写排序integer选填0 option.desc 复写说明 string 选填 ‘’ 无 option.desc复写说明string选填‘’无> params 数据

params 数据

参数 说明 类型 备注
props 主题父组件参数 object
options 业务信息 object
options.id 主题ID string 主题定义完成后生成的ID

参数 说明 类型 备注

参数 说明 类型 备注 参数说明类型备注

props 主题父组件参数 object

options 业务信息 object 无

options.id 主题ID string 主题定义完成后生成的ID

props 主题父组件参数 object

props主题父组件参数object options 业务信息 object 无 options业务信息object无 options.id 主题ID string 主题定义完成后生成的ID options.id主题IDstring主题定义完成后生成的ID

(2)基本例子

register.js:需要前置加载,注册了主题即可关联到标准

//注册和绑定门户主题前端实现接口
ecodeSDK.rewritePortalThemeQueue.push({
  fn:(params)=>{
    const {props,options} = params;
    //异步加载模块${appId}下的子模块NewTheme
    if(options&&options.id==='d89d986c812a4f038740e3f824999de1') {
      const acParams = {
        appId:'${appId}',
        name:'NewTheme', //模块名称
        props:props,
        isPage:false, //是否是路由页面
        noCss:true //是否禁止单独加载css,通常为了减少css数量,css默认前置加载
      }
      return ecodeSDK.getAsyncCom(acParams);
    }
    return null;
  },
  order:1,
  desc:'这是一个主题界面的参考案例'
});

index.js:不需要前置加载,用来实现主题代码,也可以使用mobx开发

register.js:需要前置加载,注册了主题即可关联到标准 题界面的参考案例'

}); ```

index.js:不需要前置加载,用来实现主题代码,也可以使用mobx开发

register.js:需要前置加载,注册了主题即可关联到标准```javascript //注册和绑定门户主题前端实现接口 ecodeSDK.rewritePortalThemeQueue.push({ fn:(params)=>{ const {props,options} = params; //异步加载模块${appId}下的子模块NewTheme if(options&&options.id==='d89d986c812a4f038740e3f824999de1') { const acParams = { appId:'${appId}', name:'NewTheme', //模块名称 props:props, isPage:false, //是否是路由页面 noCss:true //是否禁止单独加载css,通常为了减少css数量,css默认前置加载 } return ecodeSDK.getAsyncCom(acParams); } return null; }, order:1, desc:'这是一个主题界面的参考案例' });

codeSDK.getAsyncCom(acParams);
    }
    return null;
  },
  order:1,
  desc:'这是一个主题界面的参考案例'
});
```1. `//注册和绑定门户主题前端实现接口`
2. `ecodeSDK.rewritePortalThemeQueue.push({`
3. `  fn:(params)=>{`
4. `    const {props,options} = params;`
5. `    //异步加载模块${appId}下的子模块NewTheme`
6. `    if(options&&options.id==='d89d986c812a4f038740e3f824999de1') {`
7. `      const acParams = {`
8. `        appId:'${appId}',`
9. `        name:'NewTheme', //模块名称`
10. `        props:props,`
11. `        isPage:false, //是否是路由页面`
12. `        noCss:true //是否禁止单独加载css,通常为了减少css数量,css默认前置加载`
13. `      }`
14. `      return ecodeSDK.getAsyncCom(acParams);`
15. `    }`
16. `    return null;`
17. `  },`
18. `  order:1,`
19. `  desc:'这是一个主题界面的参考案例'`
20. `});`
`//注册和绑定门户主题前端实现接口``//注册和绑定门户主题前端实现接口`//注册和绑定门户主题前端实现接口`ecodeSDK.rewritePortalThemeQueue.push({``ecodeSDK.rewritePortalThemeQueue.push({`ecodeSDK.rewritePortalThemeQueue.push({`  fn:(params)=>{``  fn:(params)=>{` fn:(params)=>{`    const {props,options} = params;``    const {props,options} = params;` const {props,options} = params;`    //异步加载模块${appId}下的子模块NewTheme``    //异步加载模块${appId}下的子模块NewTheme` //异步加载模块${appId}下的子模块NewTheme`    if(options&&options.id==='d89d986c812a4f038740e3f824999de1') {``    if(options&&options.id==='d89d986c812a4f038740e3f824999de1') {` if(options&&options.id==='d89d986c812a4f038740e3f824999de1') {`      const acParams = {``      const acParams = {` const acParams = {`        appId:'${appId}',``        appId:'${appId}',` appId:'${appId}',`        name:'NewTheme', //模块名称``        name:'NewTheme', //模块名称` name:'NewTheme', //模块名称` 
appId}',`        name:'NewTheme', //模块名称``        name:'NewTheme', //模块名称` name:'NewTheme', //模块名称` appId}',`        name:'NewTheme', //模块名称``        name:'NewTheme', //模块名称` name:'NewTheme', //模块名称`        props:props,``        props:props,` props:props,`        isPage:false, //是否是路由页面``        isPage:false, //是否是路由页面` isPage:false, //是否是路由页面`        noCss:true //是否禁止单独加载css,通常为了减少css数量,css默认前置加载``        noCss:true //是否禁止单独加载css,通常为了减少css数量,css默认前置加载` noCss:true //是否禁止单独加载css,通常为了减少css数量,css默认前置加载`      }``      }` }`      return ecodeSDK.getAsyncCom(acParams);``      return ecodeSDK.getAsyncCom(acParams);` return ecodeSDK.getAsyncCom(acParams);`    }``    }` }`    return null;``    return null;` return null;`  },``  },` },`  order:1,``  order:1,` order:1,`  desc:'这是一个主题界面的参考案例'``  desc:'这是一个主题界面的参考案例'` desc:'这是一个主题界面的参考案例'`});``});`});
order:1,` order:1,`  desc:'这是一个主题界面的参考案例'``  desc:'这是一个主题界面的参考案例'` desc:'这是一个主题界面的参考案例'`});``});`});index.js:不需要前置加载,用来实现主题代码,也可以使用mobx开发

```javascript
const Top = ecodeSDK.imp(Top);

const {WeaPopoverHrm} = ecCom;

class NewTheme extends React.Component {
  render() {
    return (
      <div className="newtheme">
        {!window.pointerXY && (<WeaPopoverHrm />)}
        <Top {...this.props} />
        <div className='newtheme-container'>{this.props.children}</div>
      </div>
    )
  }
}

//发布模块NewTheme,作为模块${appId}的子模块
ecodeSDK.setCom('${appId}','NewTheme',NewTheme);
v> ) } }

//发布模块NewTheme,作为模块${appId}的子模块 ecodeSDK.setCom('${appId}','NewTheme',NewTheme); `1. `const Top = ecodeSDK.imp(Top);` 2. 3. const {WeaPopoverHrm} = ecCom; 4. 5. `class NewTheme extends React.Component {` 6. ` render() {` 7. ` return (` 8. ` <div className="newtheme">` 9. ` {!window.pointerXY && (<WeaPopoverHrm />)}` 10. ` <Top {...this.props} />` 11. ` <div className='newtheme-container'>{this.props.children}</div>` 12. ` </div>` 13. ` )` 14. ` }` 15. `}` 16. 17. //发布模块NewTheme,作为模块${appId}的子模块 18. ecodeSDK.setCom('${appId}','NewTheme',NewTheme); const Top = ecodeSDK.imp(Top);``const Top = ecodeSDK.imp(Top);const Top = ecodeSDK.imp(Top);const {WeaPopoverHrm} = ecCom;``const {WeaPopoverHrm} = ecCom;`const {WeaPopoverHrm} = ecCom;class NewTheme extends React.Component {class NewTheme extends React.Component {`class NewTheme extends React.Component {` render() { render() {render() { return (return (` return (` <div className="newtheme">

<div className="newtheme"> {!window.pointerXY && ()}{!window.pointerXY && (<WeaPopoverHrm />)}` {!window.pointerXY && (<WeaPopoverHrm />)}` <Top {...this.props} /> <Top {...this.props} />
{this.props.children}
<div className='newtheme-container'>{this.props.children}</div>` <div className='newtheme-container'>{this.props.children}</div>` </div>
</div>

{this.props.children}

</div>`` </div>

`
{this.props.children}

</div>`` </div>

)`` ) )}`` } }}``}}```//发布模块NewTheme,作为模块${appId}的子模块//发布模块NewTheme,作为模块${appId}的子模块//发布模块NewTheme,作为模块${appId}的子模块ecodeSDK.setCom('${appId}','NewTheme',NewTheme);ecodeSDK.setCom('${appId}','NewTheme',NewTheme);`ecodeSDK.setCom('${appId}','NewTheme',NewTheme); ;ecodeSDK.setCom('${appId}','NewTheme',NewTheme);`ecodeSDK.setCom('${appId}','NewTheme',NewTheme);###### (3)如何配置主题

到后台门户引擎,特色门户中新建主题

到后台门户引擎,特色门户中新建主题

新建成功后,配置好主题共享权限,然后选择自定义模式,可以获取到主题id

新建成功后,配置好主题共享权限,然后选择自定义模式,可以获取到主题id

在主题注册代码中关联这个id

在主题注册代码中关联这个id

配置完后即可自由开发主题

配置完后即可自由开发主题

2、PC门户元素注册

ecodeSDK.rewritePortalCusEleQueue.push(option) ecology版本要求:1906及1906+

ecodeSDK.rewritePortalCusEleQueue.push(option) ecology版本要求:1906及1906+

此方案开发的元素,客户端性能可达到最优,避免门户内存泄漏,另外复用性也比较强,可方便进行二次修改

此方案开发的元素,客户端性能可达到最优,避免门户内存泄漏,另外复用性也比较强,可方便进行二次修改

(1)参数说明
参数 说明 类型 可选 默认 备注
option 复写配置 object 必填 {}
option.fn 复写钩子函数 function 必填 (params)=>{} params 参数请看下一个表格
option.order 复写排序 integer 选填 0
option.desc 复写说明 string 选填 ‘’

参数 说明 类型 可选 默认 备注

参数 说明 类型 可选 默认 备注 参数说明类型可选默认备注

option 复写配置 object 必填 {}

option.fn 复写钩子函数 function 必填 (params)=>{} params 参数请看下一个表格

option.order 复写排序 integer 选填 0

option.desc 复写说明 string 选填 ‘’ 无

option 复写配置 object 必填 {}

option复写配置object必填{} option.fn 复写钩子函数 function 必填 (params)=>{} params 参数请看下一个表格 option.fn复写钩子函数function必填(params)=>{}params 参数请看下一个表格 option.order 复写排序 integer 选填 0 arams 参数请看下一个表格 option.fn复写钩子函数function必填(params)=>{}params 参数请看下一个表格 option.order 复写排序 integer 选填 0option.order复写排序integer选填0 option.desc 复写说明 string 选填 ‘’ 无 option.desc复写说明string选填‘’无

params 数据

params 数据

参数 说明 类型 备注
props 主题父组件参数 object
options 业务信息 object
options.ebaseid 元素ID string 元素定义完成后生成的ID

参数 说明 类型 备注

参数 说明 类型 备注 参数说明类型备注

props 主题父组件参数 object

options 业务信息 object 无

options.ebaseid 元素ID string 元素定义完成后生成的ID

props 主题父组件参数 object

props主题父组件参数object options 业务信息 object 无 options业务信息object无 options.ebaseid 元素ID string 元素定义完成后生成的ID options.ebaseid元素IDstring元素定义完成后生成的ID

(2)基本例子

register.js:需要前置加载,注册了元素即可关联到标准

register.js:需要前置加载,注册了元素即可关联到标准

//注册和绑定门户元素前端实现接口
ecodeSDK.rewritePortalCusEleQueue.push({
  fn:(params)=>{
    // console.log('params:',params);
    const {props,options} = params;
    if(options.ebaseid==='Custom_1562992730957') {
      const acParams = {
        appId:'${appId}',
        name:'CusEle', //模块名称
        params, //参数
        isPage:false, //是否是路由页面
        noCss:true //是否禁止单独加载css,通常为了减少css数量,css默认前置加载
      }
      //异步加载模块${appId}下的子模块CusEle
      return ecodeSDK.getAsyncCom(acParams);
    }
    return null;
  },
  order:1,
  desc:'这是一个元素界面的参考案例'
});
codeSDK.getAsyncCom(acParams); } return null; }, order:1, desc:'这是一个元素界面的参考案例' }); `1. `//注册和绑定门户元素前端实现接口` 2. `ecodeSDK.rewritePortalCusEleQueue.push({` 3. ` fn:(params)=>{` 4. ` // console.log('params:',params);` 5. ` const {props,options} = params;` 6. ` if(options.ebaseid==='Custom_1562992730957') {` 7. ` const acParams = {` 8. ` appId:'${appId}',` 9. ` name:'CusEle', //模块名称` 10. ` params, //参数` 11. ` isPage:false, //是否是路由页面` 12. ` noCss:true //是否禁止单独加载css,通常为了减少css数量,css默认前置加载` 13. ` }` 14. ` //异步加载模块${appId}下的子模块CusEle` 15. ` return ecodeSDK.getAsyncCom(acParams);` 16. ` }` 17. ` return null;` 18. ` },` 19. ` order:1,` 20. ` desc:'这是一个元素界面的参考案例'` 21. `});` `//注册和绑定门户元素前端实现接口//注册和绑定门户元素前端实现接口//注册和绑定门户元素前端实现接口ecodeSDK.rewritePortalCusEleQueue.push({ecodeSDK.rewritePortalCusEleQueue.push({`ecodeSDK.rewritePortalCusEleQueue.push({` fn:(params)=>{ fn:(params)=>{fn:(params)=>{ // console.log('params:',params);// console.log('params:',params);` // console.log('params:',params);` const {props,options} = params; const {props,options} = params;const {props,options} = params; if(options.ebaseid==='Custom_1562992730957') {if(options.ebaseid==='Custom_1562992730957') {` if(options.ebaseid==='Custom_1562992730957') {` const acParams = { const acParams = {const acParams = { appId:'${appId}',appId:'${appId}',` appId:'${appId}',` name:'CusEle', //模块名称 name:'CusEle', //模块名称name:'CusEle', //模块名称 param ',name:'CusEle', //模块名称`` name:'CusEle', //模块名称 name:'CusEle', //模块名称param', name:'CusEle', //模块名称name:'CusEle', //模块名称` name:'CusEle', //模块名称` params, //参数 params, //参数params, //参数 isPage:false, //是否是路由页面isPage:false, //是否是路由页面` isPage:false, //是否是路由页面` noCss:true //是否禁止单独加载css,通常为了减少css数量,css默认前置加载 noCss:true //是否禁止单独加载css,通常为了减少css数量,css默认前置加载noCss:true //是否禁止单独加载css,通常为了减少css数量,css默认前置加载 }}` }` //异步加载模块${appId}下的子模块CusEle //异步加载模块${appId}下的子模块CusEle//异步加载模块${appId}下的子模块CusEle return ecodeSDK.getAsyncCom(acParams);return ecodeSDK.getAsyncCom(acParams);` return ecodeSDK.getAsyncCom(acParams);` } }} return null;return null;` return null;` }, },}, order:1,order:1,` order:1,` desc:'这是一个元素界面的参考案例' desc:'这是一个元素界面的参考案例'desc:'这是一个元素界面的参考案例'});});`}); order:1,` order:1,` desc:'这是一个元素界面的参考案例' desc:'这是一个元素界面的参考案例'desc:'这是一个元素界面的参考案例'});`});});> index.js:不需要前置加载,元素也可以用mobx实现

index.js:不需要前置加载,元素也可以用mobx实现

const {Button} = antd;

class CusEle extends React.Component {
  render() {
    // console.log(this.props);
    return (
      <div style={{padding:10}}>
        <Button>我是一个动态加载的元素界面</Button>
      </div>
    )
  }
}

//发布模块CusEle,作为模块${appId}的子模块
ecodeSDK.setCom('${appId}','CusEle',CusEle);
) } }

//发布模块CusEle,作为模块${appId}的子模块 ecodeSDK.setCom('${appId}','CusEle',CusEle); `1. `const {Button} = antd;` 2. 3. class CusEle extends React.Component { 4. render() { 5. // console.log(this.props); 6. return ( 7. <div style={{padding:10}}> 8. <Button>我是一个动态加载的元素界面</Button> 9. </div> 10. ) 11. } 12. } 13. 14. `//发布模块CusEle,作为模块${appId}的子模块` 15. `ecodeSDK.setCom('${appId}','CusEle',CusEle);` `const {Button} = antd;const {Button} = antd;const {Button} = antd;`````class CusEle extends React.Component {``class CusEle extends React.Component {class CusEle extends React.Component {render() {`` render() { render() {// console.log(this.props);`` // console.log(this.props); // console.log(this.props);return (`` return ( return (<div style={{padding:10}}>`` <div style={{padding:10}}>

<Button>我是一个动态加载的元素界面</Button>`` <Button>我是一个动态加载的元素界面</Button> </div>`` </div>
)`` ) )}`` } }}``}}```//发布模块CusEle,作为模块${appId}的子模块//发布模块CusEle,作为模块${appId}的子模块//发布模块CusEle,作为模块${appId}的子模块ecodeSDK.setCom('${appId}','CusEle',CusEle);`ecodeSDK.setCom('${appId}','CusEle',CusEle);ecodeSDK.setCom('${appId}','CusEle',CusEle);

(3)如何配置元素

在门户引擎中建立元素,获取主键ID

在门户引擎中建立元素,获取主键ID

在代码中关联这个ID

在代码中关联这个ID 000-big.png)

在代码中关联这个ID

在代码中关联这个ID

(4)如何配置自定义内容来源

ecology版本要求:2110及2110+

ecology版本要求:2110及2110+

自定义元素设置默认有个内容来源设置,可以配置当前元素内容来源参数,参数格式可以根据自定义元素实际需求设置,比如获取某个门户下文档列表元素的数据时,可以配置为:

{"hpid": 1, "subCompanyId": 1, "eid": 1, "ebaseid": "7", "styleid": "synergys1"}

注意:JSON格式的key和value一定要用英文双引号。

自定义元素设置默认有个内容来源设置,可以配置当前元素内容来源参数,参数格式可以根据自定义元素实际需求设置,比如获取某个门户下文档列表元素的数据时,可以配置为:

{"hpid": 1, "subCompanyId": 1, "eid": 1, "ebaseid": "7", "styleid": "synergys1"}
  1. {"hpid": 1, "subCompanyId": 1, "eid": 1, "ebaseid": "7", "styleid": "synergys1"} {"hpid": 1, "subCompanyId": 1, "eid": 1, "ebaseid": "7", "styleid": "synergys1"}``{"hpid": 1, "subCompanyId": 1, "eid": 1, "ebaseid": "7", "styleid": "synergys1"}

注意:JSON格式的key和value一定要用英文双引号。

内容来源参数可以在自定义元素组件中通过属性获取:

  componentDidMount() {
    const { datasourceconfig = '{}' } = this.props.params.options.config.item;
    const datasourceconfigobj = JSON.parse(datasourceconfig);
    const { hpid, subCompanyId, eid, ebaseid, styleid } = datasourceconfigobj;
se(datasourceconfig);
    const { hpid, subCompanyId, eid, ebaseid, styleid } = datasourceconfigobj;WeaTools.callApi('/api/portal/element/news', 'POST', { hpid, subCompanyId, eid, ebaseid, styleid }).then(result => {
      const data = result.data || {};
      this.setState({ data });
    })
  }
then(result => { const data = result.data || {}; this.setState({ data }); }) } `1. ` componentDidMount() {` 2. ` const { datasourceconfig = '{}' } = this.props.params.options.config.item;` 3. ` const datasourceconfigobj = JSON.parse(datasourceconfig);` 4. ` const { hpid, subCompanyId, eid, ebaseid, styleid } = datasourceconfigobj;` 5. 6. WeaTools.callApi('/api/portal/element/news', 'POST', { hpid, subCompanyId, eid, ebaseid, styleid }).then(result => { 7. const data = result.data || {}; 8. this.setState({ data }); 9. }) 10. } componentDidMount() {`` componentDidMount() { componentDidMount() {const { datasourceconfig = '{}' } = this.props.params.options.config.item;`` const { datasourceconfig = '{}' } = this.props.params.options.config.item; const { datasourceconfig = '{}' } = this.props.params.options.config.item;const datasourceconfigobj = JSON.parse(datasourceconfig);`` const datasourceconfigobj = JSON.parse(datasourceconfig); const datasourceconfigobj = JSON.parse(datasourceconfig);const { hpid, subCompanyId, eid, ebaseid, styleid } = datasourceconfigobj;`` const { hpid, subCompanyId, eid, ebaseid, styleid } = datasourceconfigobj; const { hpid, subCompanyId, eid, ebaseid, styleid } = datasourceconfigobj;``` WeaTools.callApi('/api/portal/element/news', 'POST', { hpid, subCompanyId, eid, ebaseid, styleid }).then(result => { WeaTools.callApi('/api/portal/element/news', 'POST', { hpid, subCompanyId, eid, ebaseid, styleid }).then(result => {WeaTools.callApi('/api/porta POST', { hpid, subCompanyId, eid, ebaseid, styleid }).then(result => { WeaTools.callApi('/api/portaPOST', { hpid, subCompanyId, eid, ebaseid, styleid }).then(result => {WeaTools.callApi('/api/portal/element/news', 'POST', { hpid, subCompanyId, eid, ebaseid, styleid }).then(result => { const data = result.data || {};const data = result.data || {};` const data = result.data || {};` this.setState({ data }); this.setState({ data });this.setState({ data }); })})` })` } }} ({ data });`` this.setState({ data }); this.setState({ data });})`` }) })}`` } }###### (5)自定义设置

register.js:需要前置加载,注册了元素即可关联到标准

register.js:需要前置加载,注册了元素即可关联到标准

ecodeSDK.rewritePortalCusEleSettingQueue.push({
  fn: (params) => {
    const { props = {}, options = {} } = params;
    if (options.ebaseid === 'Custom_1562992730957') {
      const acParams = {
        appId: '${appId}',
        name: 'Setting',
        params,
        isPage: false,
        noCss: true
      };
      return ecodeSDK.getAsyncCom(acParams);
    }
    return null;
  }
});
noCss: true }; return ecodeSDK.getAsyncCom(acParams); } return null; } }); `1. `ecodeSDK.rewritePortalCusEleSettingQueue.push({` 2. ` fn: (params) => {` 3. ` const { props = {}, options = {} } = params;` 4. ` if (options.ebaseid === 'Custom_1562992730957') {` 5. ` const acParams = {` 6. ` appId: '${appId}',` 7. ` name: 'Setting',` 8. ` params,` 9. ` isPage: false,` 10. ` noCss: true` 11. ` };` 12. ` return ecodeSDK.getAsyncCom(acParams);` 13. ` }` 14. ` return null;` 15. ` }` 16. `});` `ecodeSDK.rewritePortalCusEleSettingQueue.push({ecodeSDK.rewritePortalCusEleSettingQueue.push({ecodeSDK.rewritePortalCusEleSettingQueue.push({ fn: (params) => {fn: (params) => {` fn: (params) => {` const { props = {}, options = {} } = params; const { props = {}, options = {} } = params;const { props = {}, options = {} } = params; if (options.ebaseid === 'Custom_1562992730957') {if (options.ebaseid === 'Custom_1562992730957') {` if (options.ebaseid === 'Custom_1562992730957') {` const acParams = { const acParams = {const acParams = { appId: '${appId}',appId: '${appId}',` appId: '${appId}',` name: 'Setting', name: 'Setting',name: 'Setting', params,params,` params,` isPage: false, isPage: false,isPage: false, noCss: truenoCss: true` noCss: true` }; };}; return ecodeSDK.getAsyncCom(acParams);return ecodeSDK.getAsyncCom(acParams);` return ecodeSDK.getAs ecodeSDK.getAsyncCom(acParams); return ecodeSDK.getAsyncCom(acParams);return ecodeSDK.getAsecodeSDK.getAsyncCom(acParams);`` return ecodeSDK.getAsyncCom(acParams); return ecodeSDK.getAsyncCom(acParams);}`` } }return null;`` return null; return null;}`` } }});``});}); acParams);}`` } }return null;`` return null; return null;}`` } }});``});});> Setting.js:自定义设置组件

Setting.js:自定义设置组件

const { WeaTools, WeaFormItem, WeaBrowser } = window.ecCom;

class Setting extends React.Component {
  constructor(props) {
    super(props);
    const { params = {} } = this.props;
    const { options = {} } = params;
    // 获取自定义设置组件实例,固定写法
    options.getInstance && options.getInstance(this);
    // 自定义设置组件中的相关数据
    this.state = { ids: '', datas: [] };
  }

  componentWillMount() {
    const { params = {} } = this.props;
    const { options = {} } = params;
    const { eid } = options;
    // 自定义实现元素自定义设置数据的获取
    WeaTools.callApi('/api/portal/dev/element/docsearch/getsecid', 'GET', { eid }).then((result) => {
      const { data = {} } = result;
      const { secobj = [] } = data;
      this.setState({ datas: secobj });
    });
  }

  render() {
    // 实现自定义配置项
    return (
      <WeaFormItem label="文档目录" labelCol={{ span: 6 }} wrapperCol={{ span: 16 }}>
        <WeaBrowser 
          title="请选择文档目录"
          type="doccategory"
          isSingle={false}
          replaceDatas={this.state.datas}
          onChange = {(ids, names, datas) => this.setState({ ids, datas })}
        />
      </WeaFormItem>
    );
  }
 = {(ids, names, datas) => this.setState({ ids, datas })}
        />
      </WeaFormItem>
    );
  }// 设置保存方法名固定为onSave
  onSave = () => {
    const { params = {} } = this.props;
    const { options = {} } = params;
    const { eid } = options;
    const { ids: secid } = this.state;
    // 自定义实现元素自定义设置数据的保存接口
    WeaTools.callApi('/api/portal/dev/element/docsearch/setsecid', 'POST', { eid, secid });
  };
}

ecodeSDK.setCom('${appId}', 'Setting', Setting);
rch/setsecid', 'POST', { eid, secid }); }; }

ecodeSDK.setCom('${appId}', 'Setting', Setting); `1. `const { WeaTools, WeaFormItem, WeaBrowser } = window.ecCom;` 2. 3. class Setting extends React.Component { 4. constructor(props) { 5. super(props); 6. const { params = {} } = this.props; 7. const { options = {} } = params; 8. // 获取自定义设置组件实例,固定写法 9. options.getInstance && options.getInstance(this); 10. // 自定义设置组件中的相关数据 11. this.state = { ids: '', datas: [] }; 12. } 13. 14. ` componentWillMount() {` 15. ` const { params = {} } = this.props;` 16. ` const { options = {} } = params;` 17. ` const { eid } = options;` 18. ` // 自定义实现元素自定义设置数据的获取` 19. ` WeaTools.callApi('/api/portal/dev/element/docsearch/getsecid', 'GET', { eid }).then((result) => {` 20. ` const { data = {} } = result;` 21. ` const { secobj = [] } = data;` 22. ` this.setState({ datas: secobj });` 23. ` });` 24. ` }` 25. 26. render() { 27. // 实现自定义配置项 28. return ( 29. <WeaFormItem label="文档目录" labelCol={{ span: 6 }} wrapperCol={{ span: 16 }}> 30. <WeaBrowser 31. title="请选择文档目录" 32. type="doccategory" 33. isSingle={false} 34. replaceDatas={this.state.datas} 35. onChange = {(ids, names, datas) => this.setState({ ids, datas })} 36. /> 37. </WeaFormItem> 38. ); 39. } 40. 41. ` // 设置保存方法名固定为onSave` 42. ` onSave = () => {` 43. ` const { params = {} } = this.props;` 44. ` const { options = {} } = onSave = () => {` 43. ` const { params = {} } = this.props;` 44. ` const { options = {} } = onSave = () => {` 43. ` const { params = {} } = this.props;` 44. ` const { options = {} } = params;` 45. ` const { eid } = options;` 46. ` const { ids: secid } = this.state;` 47. ` // 自定义实现元素自定义设置数据的保存接口` 48. ` WeaTools.callApi('/api/portal/dev/element/docsearch/setsecid', 'POST', { eid, secid });` 49. ` };` 50. `}` 51. 52. ecodeSDK.setCom('${appId}', 'Setting', Setting); const { WeaTools, WeaFormItem, WeaBrowser } = window.ecCom;``const { WeaTools, WeaFormItem, WeaBrowser } = window.ecCom;const { WeaTools, WeaFormItem, WeaBrowser } = window.ecCom;class Setting extends React.Component {``class Setting extends React.Component {`class Setting extends React.Component {` constructor(props) {`` constructor(props) {` constructor(props) {` super(props);`` super(props);` super(props);` const { params = {} } = this.props;`` const { params = {} } = this.props;` const { params = {} } = this.props;` const { options = {} } = params;`` const { options = {} } = params;` const { options = {} } = params;` // 获取自定义设置组件实例,固定写法`` // 获取自定义设置组件实例,固定写法` // 获取自定义设置组件实例,固定写法` options.getInstance && options.getInstance(this);`` options.getInstance && options.getInstance(this);` options.getInstance && options.getInstance(this);` // 自定义设置组件中的相关数据`` // 自定义设置组件中的相关数据` // 自定义设置组件中的相关数据` this.state = { ids: '', datas: [] };`` this.state = { ids: '', datas: [] };` this.state = { ids: '', datas: [] };` }`` }` } componentWillM ate = { ids: '', datas: [] };this.state = { ids: '', datas: [] }; }}` }````` componentWillMate = { ids: '', datas: [] };` this.state = { ids: '', datas: [] };` } }}````` componentWillMount() {`` componentWillMount() { componentWillMount() {const { params = {} } = this.props;`` const { params = {} } = this.props; const { params = {} } = this.props;const { options = {} } = params;`` const { options = {} } = params; const { options = {} } = params;const { eid } = options;`` const { eid } = options; const { eid } = options;// 自定义实现元素自定义设置数据的获取`` // 自定义实现元素自定义设置数据的获取 // 自定义实现元素自定义设置数据的获取WeaTools.callApi('/api/portal/dev/element/docsearch/getsecid', 'GET', { eid }).then((result) => {`` WeaTools.callApi('/api/portal/dev/element/docsearch/getsecid', 'GET', { eid }).then((result) => { WeaTools.callApi('/api/portal/dev/element/docsearch/getsecid', 'GET', { eid }).then((result) => {const { data = {} } = result;`` const { data = {} } = result; const { data = {} } = result;const { secobj = [] } = data;`` const { secobj = [] } = data; const { secobj = [] } = data;this.setState({ datas: secobj });`` this.setState({ datas: secobj }); this.setState({ datas: secobj });});`` }); });}`` } }render() {`` render() {` render() {` // 实现自定义配置项`` // 实现自定义配置项` // 实现自定义配置项` return (`` return (` return (` <WeaFormItem label="文档目录" labelCol={{ span: 6 }} wrapperCol={{ span: 16 }}>`` <WeaFormItem label="文档目录" labelCol={{ span: 6 }} wrapperCol={{ span: 16 }}>` <W span: 16 }}>`` <WeaFormItem label="文档目录" labelCol={{ span: 6 }} wrapperCol={{ span: 16 }}>` <W span: 16 }}>`` <WeaFormItem label="文档目录" labelCol={{ span: 6 }} wrapperCol={{ span: 16 }}>` <WeaFormItem label="文档目录" labelCol={{ span: 6 }} wrapperCol={{ span: 16 }}>` <WeaBrowser `` <WeaBrowser ` <WeaBrowser ` title="请选择文档目录"`` title="请选择文档目录"` title="请选择文档目录"` type="doccategory"`` type="doccategory"` type="doccategory"` isSingle={false}`` isSingle={false}` isSingle={false}` replaceDatas={this.state.datas}`` replaceDatas={this.state.datas}` replaceDatas={this.state.datas}` onChange = {(ids, names, datas) => this.setState({ ids, datas })}`` onChange = {(ids, names, datas) => this.setState({ ids, datas })}` onChange = {(ids, names, datas) => this.setState({ ids, datas })}` />`` />` />` </WeaFormItem>`` </WeaFormItem>` </WeaFormItem>` );`` );` );` }`` }` } // 设置保存方法名固定为onSave// 设置保存方法名固定为onSave` // 设置保存方法名固定为onSave` onSave = () => { onSave = () => {onSave = () => { const { params = {} } = this.props;const { params = {} } = this.props;` const { params = {} } = this.props;` const { options = {} } = params; const { options = {} } = params;const { options = {} } = params; const { eid } = options;const { eid } = options;` const { eid } = options;` const { ids: secid } = this.state; const { ids: secid } = this.state;const { ids: secid } = this.state; // 自定义实现元素自定义设置数据的保存接口// 自定义 ds: secid } = this.state;` const { ids: secid } = this.state;` // 自定义实现元素自定义设置数据的保存接口 // 自定义ds: secid } = this.state;const { ids: secid } = this.state; // 自定义实现元素自定义设置数据的保存接口// 自定义实现元素自定义设置数据的保存接口` // 自定义实现元素自定义设置数据的保存接口` WeaTools.callApi('/api/portal/dev/element/docsearch/setsecid', 'POST', { eid, secid }); WeaTools.callApi('/api/portal/dev/element/docsearch/setsecid', 'POST', { eid, secid });WeaTools.callApi('/api/portal/dev/element/docsearch/setsecid', 'POST', { eid, secid }); };};` };`}}}`````ecodeSDK.setCom('${appId}', 'Setting', Setting);``ecodeSDK.setCom('${appId}', 'Setting', Setting);ecodeSDK.setCom('${appId}', 'Setting', Setting); ;`ecodeSDK.setCom('${appId}', 'Setting', Setting);ecodeSDK.setCom('${appId}', 'Setting', Setting);##### 3、移动门户元素注册

ecodeSDK.rewritePortalCusEleQueue.push(option) ecology版本要求:1912及1912+ 移动门户元素注册的钩子函数与pc端一致

ecodeSDK.rewritePortalCusEleQueue.push(option) ecology版本要求:1912及1912+ 移动门户元素注册的钩子函数与pc端一致

此方案开发的元素,客户端性能可达到最优,避免门户内存泄漏,另外复用性也比较强,可方便进行二次修改

此方案开发的元素,客户端性能可达到最优,避免门户内存泄漏,另外复用性也比较强,可方便进行二次修改

(1)参数说明
参数 说明 类型 可选 默认 备注
option 复写配置 object 必填 {}
option.fn 复写钩子函数 function 必填 (params)=>{} params 参数请看下一个表格
option.order 复写排序 integer 选填 0
option.desc 复写说明 string 选填 ‘’

参数 说明 类型 可选 默认 备注

参数 说明 类型 可选 默认 备注 参数说明类型可选默认备注

option 复写配置 object 必填 {}

option.fn 复写钩子函数 function 必填 (params)=>{} params 参数请看下一个表格

option.order 复写排序 integer 选填 0

option.desc 复写说明 string 选填 ‘’ 无

option 复写配置 object 必填 {}

option复写配置object必填{} option.fn 复写钩子函数 function 必填 (params)=>{} params 参数请看下一个表格 option.fn复写钩子函数function必填(params)=>{}params 参数请看下一个表格 option.order 复写排序 integer 选填 0

option.order复写排序integer选填0 option.desc 复写说明 string 选填 ‘’ 无 option.desc复写说明string选填‘’无

params 数据

params 数据

参数 说明 类型 备注
props 主题父组件参数 object
options 业务信息 object
options.ebaseid 元素ID string 元素定义完成后生成的ID

参数 说明 类型 备注

参数 说明 类型 备注 参数说明类型备注

props 主题父组件参数 object

options 业务信息 object 无

options.ebaseid 元素ID string 元素定义完成后生成的ID

props 主题父组件参数 object 题父组件参数 object

options 业务信息 object 无

options.ebaseid 元素ID string 元素定义完成后生成的ID

props 主题父组件参数 objectprops主题父组件参数object options 业务信息 object 无 options业务信息object无 options.ebaseid 元素ID string 元素定义完成后生成的ID options.ebaseid元素IDstring元素定义完成后生成的ID

(2)基本例子

register.js:需要前置加载,注册了元素即可关联到标准

register.js:需要前置加载,注册了元素即可关联到标准

ecodeSDK.rewritePortalCusEleQueue.push({
  fn: (params) => {
    const { props } = params;
    // client = mobile:移动端门户标记
    // ebaseid = Custom_QuickEntry: 移动端门户自定义元素标记,区分元素类型
    if (props.client === 'mobile' && props.ebaseid === 'Custom_QuickEntry') {
      const acParams = {
        appId: '${appId}',
        name: 'View',
        params,
        isPage: false,
        noCss: true
      };
      return ecodeSDK.getAsyncCom(acParams);
    }
    return null;
  }
});
noCss: true }; return ecodeSDK.getAsyncCom(acParams); } return null; } }); 1. `ecodeSDK.rewritePortalCusEleQueue.push({` 2. ` fn: (params) => {` 3. ` const { props } = params;` 4. ` // client = mobile:移动端门户标记` 5. ` // ebaseid = Custom_QuickEntry: 移动端门户自定义元素标记,区分元素类型` 6. ` if (props.client === 'mobile' && props.ebaseid === 'Custom_QuickEntry') {` 7. ` const acParams = {` 8. ` appId: '${appId}',` 9. ` name: 'View',` 10. ` params,` 11. ` isPage: false,` 12. ` noCss: true` 13. ` };` 14. ` return ecodeSDK.getAsyncCom(acParams);` 15. ` }` 16. ` return null;` 17. ` }` 18. `});` `ecodeSDK.rewritePortalCusEleQueue.push({``ecodeSDK.rewritePortalCusEleQueue.push({`ecodeSDK.rewritePortalCusEleQueue.push({` fn: (params) => {`` fn: (params) => {` fn: (params) => {` const { props } = params;`` const { props } = params;` const { props } = params;` // client = mobile:移动端门户标记`` // client = mobile:移动端门户标记` // client = mobile:移动端门户标记` // ebaseid = Custom_QuickEntry: 移动端门户自定义元素标记,区分元素类型`` // ebaseid = Custom_QuickEntry: 移动端门户自定义元素标记,区分元素类型` // ebaseid = Custom_QuickEntry: 移动端门户自定义元素标记,区分元素类型` if (props.client === 'mobile' && props.ebaseid === 'Custom_QuickEntry') {`` if (props.client === 'mobile' && props.ebaseid === 'Custom_QuickEntry') {` if (props.client === 'mobile' && props.ebaseid === 'Custom_QuickEntry') {` const acParams = {`` const acParams = {` const acParams = {` appId: '${appId}',`` appId: '${appId}',` appId: '${appId}',` name: 'View s = {` appId: '${appId}',`` appId: '${appId}',` appId: '${appId}',` name: 'Views = {` appId: '${appId}',`` appId: '${appId}',` appId: '${appId}',` name: 'View',`` name: 'View',` name: 'View',` params,`` params,` params,` isPage: false,`` isPage: false,` isPage: false,` noCss: true`` noCss: true` noCss: true` };`` };` };` return ecodeSDK.getAsyncCom(acParams);`` return ecodeSDK.getAsyncCom(acParams);` return ecodeSDK.getAsyncCom(acParams);` }`` }` }` return null;`` return null;` return null;` }`` }` }`});``});`}); acParams);` }`` }` }` return null;`` return null;` return null;` }`` }` }`});``});`});javascript class View extends React.Component { render() { const data = [ { id: 1, name: '我要请假', icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/01.png', url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=1' }, { id: 2, name: '我要留言', icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/02.png', url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=2' }, { id: 3, name: '我要出差', icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/03.png', url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=3' }, { id: 4, name: '产品建议', icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/04.png', url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=4' }, ];

return (
  <div className="portal-m-e-quick-entry">
    {
      data.map((item, index) => {
        return (
          <div key={index} onClick={() => this.onOpen(item.url)}>
            <img src={item.icon} />
            <div><span>{item.name}</span></div>
          </div>
        );
      })
    }
  </div>
);

} ame} ); }) } ); }onOpen = (url) => { if (window.em && window.em.checkJsApi('openLink')) { window.em.openLink({ sysId: window.localStorage.emobile_ec_id, url: url, openType: 2 }); } else { window.open(url); } }; }

ecodeSDK.setCom('${appId}', 'View', View);

);
    } else {
      window.open(url);
    }
  };
}

ecodeSDK.setCom('${appId}', 'View', View);
```1. `class View extends React.Component {`
2. `  render() {`
3. `    const data = [`
4. `      {`
5. `        id: 1, `
6. `        name: '我要请假', `
7. `        icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/01.png', `
8. `        url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=1'`
9. `      },`
10. `      {`
11. `        id: 2, `
12. `        name: '我要留言', `
13. `        icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/02.png', `
14. `        url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=2'`
15. `      },`
16. `      {`
17. `        id: 3, `
18. `        name: '我要出差', `
19. `        icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/03.png', `
20. `        url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=3'`
21. `      },`
22. `      {`
23. `        id: 4, `
24. `        name: '产品建议', `
25. `        icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/04.png', `
26. `        url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=4'`
27. `      },`
28. `    ];`
29. ``
30. `    return (`
31. `      <div className="portal-m-e-quick-entry">`
32. `        {`
33. `          data.map((item, index) => {`
34. `            return (`
35. `              <div key={index} onClick={() => this.onOpen(item.url)}>`
36. `                <img src={item.icon} />`
37. `                <div><span>{item.name}</span></d

36. `                <img src={item.icon} />`
37. `                <div><span>{item.name}</span></d
36. `                <img src={item.icon} />`
37. `                <div><span>{item.name}</span></div>`
38. `              </div>`
39. `            );`
40. `          })`
41. `        }`
42. `      </div>`
43. `    );`
44. `  }`
45. ``
46. `  onOpen = (url) => {`
47. `    if (window.em && window.em.checkJsApi('openLink')) {`
48. `      window.em.openLink({`
49. `        sysId: window.localStorage.emobile_ec_id,`
50. `        url: url,`
51. `        openType: 2`
52. `      });`
53. `    } else {`
54. `      window.open(url);`
55. `    }`
56. `  };`
57. `}`
58. ``
59. `ecodeSDK.setCom('${appId}', 'View', View);`
`class View extends React.Component {``class View extends React.Component {`class View extends React.Component {`  render() {``  render() {` render() {`    const data = [``    const data = [` const data = [`      {``      {` {`        id: 1, ``        id: 1, ` id: 1, `        name: '我要请假', ``        name: '我要请假', ` name: '我要请假', `        icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/01.png', ``        icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/01.png', ` icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/01.png', `        url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=1'``        url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=1'` url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=1'`      },``      },` },`      {``    
flow/static4mobileform/index.html#/req?iscreate=1&workflowid=1'`      },``      },` },`      {``    flow/static4mobileform/index.html#/req?iscreate=1&workflowid=1'`      },``      },` },`      {``      {` {`        id: 2, ``        id: 2, ` id: 2, `        name: '我要留言', ``        name: '我要留言', ` name: '我要留言', `        icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/02.png', ``        icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/02.png', ` icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/02.png', `        url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=2'``        url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=2'` url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=2'`      },``      },` },`      {``      {` {`        id: 3, ``        id: 3, ` id: 3, `        name: '我要出差', ``        name: '我要出差', ` name: '我要出差', `        icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/03.png', ``        icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/03.png', ` icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/03.png', `        url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=3'``        url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=3'` url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=3'`      },``      },` },`      {``      {` {`        id: 4, ``        id: 4, ` id: 4, `        name: '产品建议', ``     
  },` },`      {``      {` {`        id: 4, ``        id: 4, ` id: 4, `        name: '产品建议', ``       },` },`      {``      {` {`        id: 4, ``        id: 4, ` id: 4, `        name: '产品建议', ``        name: '产品建议', ` name: '产品建议', `        icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/04.png', ``        icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/04.png', ` icon: '/cloudstore/release/b59e05ced89f43d69ed7d6bdb6c57140/resources/04.png', `        url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=4'``        url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=4'` url: '/spa/workflow/static4mobileform/index.html#/req?iscreate=1&workflowid=4'`      },``      },` },`    ];``    ];` ];`````    return (``    return (` return (`      <div className="portal-m-e-quick-entry">``      <div className="portal-m-e-quick-entry">` <div className="portal-m-e-quick-entry">`        {``        {` {`          data.map((item, index) => {``          data.map((item, index) => {` data.map((item, index) => {`            return (``            return (` return (`              <div key={index} onClick={() => this.onOpen(item.url)}>``              <div key={index} onClick={() => this.onOpen(item.url)}>` <div key={index} onClick={() => this.onOpen(item.url)}>`                <img src={item.icon} />``                <img src={item.icon} />` <img src={item.icon} />`                <div><span>{item.name}</span></div>``                <div><span>{item.name}</span></div>` <div><span>{item.name}</span></div>`    
/div>``                <div><span>{item.name}</span></div>` <div><span>{item.name}</span></div>`    /div>``                <div><span>{item.name}</span></div>` <div><span>{item.name}</span></div>`              </div>``              </div>` </div>`            );``            );` );`          })``          })` })`        }``        }` }`      </div>``      </div>` </div>`    );``    );` );`  }``  }` }`````  onOpen = (url) => {``  onOpen = (url) => {` onOpen = (url) => {`    if (window.em && window.em.checkJsApi('openLink')) {``    if (window.em && window.em.checkJsApi('openLink')) {` if (window.em && window.em.checkJsApi('openLink')) {`      window.em.openLink({``      window.em.openLink({` window.em.openLink({`        sysId: window.localStorage.emobile_ec_id,``        sysId: window.localStorage.emobile_ec_id,` sysId: window.localStorage.emobile_ec_id,`        url: url,``        url: url,` url: url,`        openType: 2``        openType: 2` openType: 2`      });``      });` });`    } else {``    } else {` } else {`      window.open(url);``      window.open(url);` window.open(url);`    }``    }` }`  };``  };` };`}``}`}`````ecodeSDK.setCom('${appId}', 'View', View);``ecodeSDK.setCom('${appId}', 'View', View);`ecodeSDK.setCom('${appId}', 'View', View);
View', View);``ecodeSDK.setCom('${appId}', 'View', View);`ecodeSDK.setCom('${appId}', 'View', View);###### (3)如何配置元素

> 通过脚本建立元素,获取主键ID
>
>
>
>
> ```javascript
> insert into hp_mobile_BaseElement(id,elementtype,title,elementdesc,isuse,titleEN,titleTHK,loginview,isbase) 
> values('Custom_QuickEntry',2,'快捷入口元素','快捷入口元素',1,'Quick Entry Element','快捷入口元素',0,1)
> ```
>
>
>
> 在移动门户配置对应元素(如:快捷入口元素)
>
>
> ![](../../assets/external-images/file_1589531062000.png)
>
>
>
>
> 在代码中关联元素类型:如案例中的‘Custom_QuickEntry’
>
>
> ![](../../assets/external-images/file_1589531185000.png)

通过脚本建立元素,获取主键ID

```javascript
insert into hp_mobile_BaseElement(id,elementtype,title,elementdesc,isuse,titleEN,titleTHK,loginview,isbase) 
values('Custom_QuickEntry',2,'快捷入口元素','快捷入口元素',1,'Quick Entry Element','快捷入口元素',0,1)

  1. insert into hp_mobile_BaseElement(id,elementtype,title,elementdesc,isuse,titleEN,titleTHK,loginview,isbase)
  2. values('Custom_QuickEntry',2,'快捷入口元素','快捷入口元素',1,'Quick Entry Element','快捷入口元素',0,1) insert into hp_mobile_BaseElement(id,elementtype,title,elementdesc,isuse,titleEN,titleTHK,loginview,isbase) ``insert into hp_mobile_BaseElement(id,elementtype,title,elementdesc,isuse,titleEN,titleTHK,loginview,isbase)insert into hp_mobile_BaseElement(id,elementtype,title,elementdesc,isuse,titleEN,titleTHK,loginview,isbase) values('Custom_QuickEntry',2,'快捷入口元素','快捷入口元素',1,'Quick Entry Element','快捷入口元素',0,1)``values('Custom_QuickEntry',2,'快捷入口元素','快捷入口元素',1,'Quick Entry Element','快捷入口元素',0,1)values('Custom_QuickEntry',2,'快捷入口元素','快捷入口元素',1,'Quick Entry Element','快捷入口元素',0,1) ','快捷入口元素',0,1)`values('Custom_QuickEntry',2,'快捷入口元素','快捷入口元素',1,'Quick Entry Element','快捷入口元素',0,1)在移动门户配置对应元素(如:快捷入口元素)

在代码中关联元素类型:如案例中的‘Custom_QuickEntry’

4、特色门户元素注册

ecodeSDK.rewritePortalCusEleQueue.push(option) ecology版本要求:2003及2003+

ecodeSDK.rewritePortalCusEleQueue.push(option) ecology版本要求:2003及2003+

ecode元素开发易常简洁,无需创建表结构、接口和执行sql,就可以实现多tab元素,只需依照案例重写业务设置项与视图,即可实现整个元素开发。

ecode元素开发易常简洁,无需创建表结构、接口和执行sql,就可以实现多tab元素,只需依照案例重写业务设置项与视图,即可实现整个元素开发。

(1)参数说明
参数 说明 类型 可选 默认 备注
option 复写配置 object 必填 {}
option.fn 复写钩子函数 function 必填 (params)=>{} params 参数请看下一个表格
option.order 复写排序 integer 选填 0
option.desc 复写说明 string 选填 ‘’

参数 说明 类型 可选 默认 备注

参数 说明 类型 可选 默认 备注 参数说明类型可选默认备注

option 复写配置 object 必填 {}

option.fn 复写钩子函数 function 必填 (params)=>{} params 参数请看下一个表格

option.order 复写排序 integer 选填 0

option.desc 复写说明 string 选填 ‘’ 无

option 复写配置 object 必填 {}

option复写配置object必填{} option.fn 复写钩子函数 function 必填 (params)=>{} params 参数请看下一个表格 option.fn复写钩子函数function必填(params)=>{}params 参数请看下一个表格 option.order 复写排序 integer 选填 0

option.order复写排序integer选填0 option.desc 复写说明 string 选填 ‘’ 无 option.desc复写说明string选填‘’无

params 数据

params 数据 der复写排序integer选填0 option.desc 复写说明 string 选填 ‘’ 无 option.desc复写说明string选填‘’无

params 数据

params 数据| 参数 | 说明 | 类型 | 备注 | | --- | --- | --- | --- | | props | 元素父组件参数 | object | | | options | 业务信息 | object | 无 | | options.id | 元素ID | string | 主题定义完成后生成的ID |

参数 说明 类型 备注

参数 说明 类型 备注 参数说明类型备注

props 元素父组件参数 object

options 业务信息 object 无

options.id 元素ID string 主题定义完成后生成的ID

props 元素父组件参数 object

props元素父组件参数object options 业务信息 object 无 options业务信息object无 options.id 元素ID string 主题定义完成后生成的ID options.id元素IDstring主题定义完成后生成的ID

(2)基本例子

ions业务信息object无 options.id 元素ID string 主题定义完成后生成的ID options.id元素IDstring主题定义完成后生成的ID

(2)基本例子> register.js:注册元素文件,需要前置加载。该文件可以修改,元素选择名称,如下图

SettingExtend.js :内容设置扩展文件。该文件可以扩展内容设置页面 设置项,如下图

SettingStyleExtend.js :样式设置扩展文件。该文件可以扩展样式设置页面 设置项,如下图

ContainerModleProxy.js :元素模型代理文件。该文件可以设置 设置扩展页面属性默认值,如下图

ContainerViewProxy.js :显示页面代理文件。 该文件可以设置 { 1)、是否隐藏 设置页面的 内容来源表格 (即是否有多tab) 2)、more 页面地址 } ,如下图 1)、是否隐藏 设置页面的 内容来源表格

2)、more 页面地址

AddExtend.js :添加页面扩展文件。该 文件可以 { 1)、扩展添加页面 设置项 2)、设置扩展添加页面 属性默认值 } ,如下图 1)、扩展添加页面 设置项

2)、设置扩展添加页面 属性默认值

AddExtendGroup.js :添加页面扩展文件。该文件可以扩展添加页面 设置项组,如下图

roup.js :添加页面扩展文件。该文件可以扩展添加页面 设置项组,如下图

roup.js :添加页面扩展文件。该文件可以扩展添加页面 设置项组,如下图

ContainerViewExtend.js :显示页面文件。该文件是元素的显示页面,可以拿到所有设置数据,具体内容显示根据业务渲染,如下图

ContainerViewExtend.js: 元素设置页面代理文件,作为功能扩展文件,目前开发不需要修改 ./assets/external-images/ptse20.png)

ContainerViewExtend.js: 元素设置页面代理文件,作为功能扩展文件,目前开发不需要修改register.js:注册元素文件,需要前置加载。该文件可以修改,元素选择名称,如下图

SettingExtend.js :内容设置扩展文件。该文件可以扩展内容设置页面 设置项,如下图

SettingStyleExtend.js :样式设置扩展文件。该文件可以扩展样式设置页面 设置项,如下图

ContainerModleProxy.js :元素模型代理文件。该文件可以设置 设置扩展页面属性默认值,如下图

ContainerViewProxy.js :显示页面代理文件。 该文件可以设置 { 1)、是否隐藏 设置页面的 内容来源表格 (即是否有多tab) 2)、more 页面地址 } ,如下图 1)、是否隐藏 设置页面的 内容来源表格

AddExtend.js :添加页面扩展文件。该 文件可以 { 1)、扩展添加页面 设置项 2)、设置扩展添加页面 属性默认值 } ,如下图 1)、扩展添加页面 设置项

AddExtendGroup.js :添加页面扩展文件。该文件可以扩展添加页面 设置项组,如下图

ContainerViewExtend.js :显示页面文件。该文件是元素的显示页面,可以拿到所有设置数据,具体内容显示根据业务渲染,如下图

业务渲染,如下图

ContainerViewExtend.js: 元素设置页面代理文件,作为功能扩展文件,目前开发不需要修改

5.元素头注册

ecodeSDK.rewritePortalCusEleHeaderQueue.push(option) ecology版本要求:2011及2011+

ecodeSDK.rewritePortalCusEleHeaderQueue.push(option) ecology版本要求:2011及2011+

此方案开发的元素,可以直接使用标准登录插件,另外跳转到主题可以用路由跳转,性能可达到最优

此方案开发的元素,可以直接使用标准登录插件,另外跳转到主题可以用路由跳转,性能可达到最优

(1)参数说明
参数 说明 类型 可选 默认 备注
option 复写配置 object 必填 {}
option.fn 复写钩子函数 function 必填 (params)=>{} params 参数请看下一个表格
option.order 复写排序 integer 选填 0
option.desc 复写说明 string 选填 ‘’

参数 说明 类型 可选 默认 备注

参数 说明 类型 可选 默认 备注 参数说明类型可选默认备注

option 复写配置 object 必填 {}

option.fn 复写钩子函数 function 必填 (params)=>{} params 参数请看下一个表格

option.order 复写排序 integer 选填 0

option.desc 复写说明 string 选填 ‘’ 无

option 复写配置 object 必填 {}

option复写配置object必填{} option.fn 复写钩子函数 function 必填 (params)=>{} params 参数请看下一个表格 option.fn复写钩子函数function必填(params)=>{}params 参数请看下一个表格 option.order 复写排序 integer 选填 0

option.order复写排序integer选填0 option.desc 复写说明 string 选填 ‘’ 无 option.desc复写说明string选填‘’无

params 数据

params 数据

参数 说明 类型 备注
props 主题父组件参数 object
options 业务信息 object
options.ebaseid 元素ID string 元素定义完成后生成的ID

参数 说明 类型 备注

参数 说明 类型 备注 参数说明类型备注

props 主题父组件参数 object

options 业务信息 object 无

options.ebaseid 元素ID string 元素定义完成后生成的ID

props 主题父组件参数 object 题父组件参数 object

options 业务信息 object 无

options.ebaseid 元素ID string 元素定义完成后生成的ID

props 主题父组件参数 objectprops主题父组件参数object options 业务信息 object 无 options业务信息object无 options.ebaseid 元素ID string 元素定义完成后生成的ID options.ebaseid元素IDstring元素定义完成后生成的ID

(2)基本例子

register.js:需要前置加载,注册了登录页即可关联到标准

register.js:需要前置加载,注册了登录页即可关联到标准

ecodeSDK.rewritePortalCusEleHeaderQueue.push({
  fn: (params) => {
    const { props = {}, options = {} } = params;
    if (options.ebaseid === '1') {
      const acParams = {
        appId: '${appId}',
        name: 'Header',
        params,
        isPage: false,
        noCss: true
      };
      return ecodeSDK.getAsyncCom(acParams);
    }
    return null;
  }
});
noCss: true }; return ecodeSDK.getAsyncCom(acParams); } return null; } }); `1. `ecodeSDK.rewritePortalCusEleHeaderQueue.push({` 2. ` fn: (params) => {` 3. ` const { props = {}, options = {} } = params;` 4. ` if (options.ebaseid === '1') {` 5. ` const acParams = {` 6. ` appId: '${appId}',` 7. ` name: 'Header',` 8. ` params,` 9. ` isPage: false,` 10. ` noCss: true` 11. ` };` 12. ` return ecodeSDK.getAsyncCom(acParams);` 13. ` }` 14. ` return null;` 15. ` }` 16. `});` `ecodeSDK.rewritePortalCusEleHeaderQueue.push({ecodeSDK.rewritePortalCusEleHeaderQueue.push({ecodeSDK.rewritePortalCusEleHeaderQueue.push({ fn: (params) => {fn: (params) => {` fn: (params) => {` const { props = {}, options = {} } = params; const { props = {}, options = {} } = params;const { props = {}, options = {} } = params; if (options.ebaseid === '1') {if (options.ebaseid === '1') {` if (options.ebaseid === '1') {` const acParams = { const acParams = {const acParams = { appId: '${appId}',appId: '${appId}',` appId: '${appId}',` name: 'Header', name: 'Header',name: 'Header', params,params,` params,` isPage: false, isPage: false,isPage: false, noCss: truenoCss: true` noCss: true` }; };}; return ecodeSDK.getAsyncCom(acParams);return ecodeSDK.getAsyncCom(acParams);` return ecodeSDK.getAsyncCom(acParams);` } }} return null;return null;` return null;` n ecodeSDK.getAsyncCom(acParams);` } }} return null;return null;` return null;` n ecodeSDK.getAsyncCom(acParams);` } }} return null;return null;` return null;` } }}});});`}); acParams);` } }} return null;return null;` return null;` } }}});`});});> Header.js:不需要前置加载,元素也可以用mobx实现

Header.js:不需要前置加载,元素也可以用mobx实现

class Header extends React.Component {
  render() {
    // console.log(this.props);
    const { params = {} } = this.props;
    const { props = {}, options = {} } = params;
    const { config = {} } = props;
    const { header = {} } = config.item || {};

    return (
      <div className="portal-cus-rss-header">
        <span className="portal-cus-rss-header-title">{header.title}</span>
        {options.ToolbarCom}
      </div>
    );
  }
}

ecodeSDK.setCom('${appId}', 'Header', Header);
{options.ToolbarCom} ); } }

ecodeSDK.setCom('${appId}', 'Header', Header); `1. `class Header extends React.Component {` 2. ` render() {` 3. ` // console.log(this.props);` 4. ` const { params = {} } = this.props;` 5. ` const { props = {}, options = {} } = params;` 6. ` const { config = {} } = props;` 7. ` const { header = {} } = config.item || {};` 8. 9. return ( 10. <div className="portal-cus-rss-header"> 11. <span className="portal-cus-rss-header-title">{header.title}</span> 12. {options.ToolbarCom} 13. </div> 14. ); 15. } 16. } 17. 18. `ecodeSDK.setCom('${appId}', 'Header', Header);` `class Header extends React.Component {class Header extends React.Component {class Header extends React.Component { render() {render() {` render() {` // console.log(this.props); // console.log(this.props);// console.log(this.props); const { params = {} } = this.props;const { params = {} } = this.props;` const { params = {} } = this.props;` const { props = {}, options = {} } = params; const { props = {}, options = {} } = params;const { props = {}, options = {} } = params; const { config = {} } = props;const { config = {} } = props;` const { config = {} } = props;` const { header = {} } = config.item || {}; const { header = {} } = config.item || {};const { header = {} } = config.item || {};````` return (`` return ( return (<div className="portal-cus-rss-header">`` <div className="portal-cus-rss-header">

<div className="portal-cus-rss-header">` <div className=v className="portal-cus-rss-header">
<div className="portal-cus-rss-header"> {header.title}<span className="portal-cus-rss-header-title">{header.title}</span>` <span className="portal-cus-rss-header-title">{header.title}</span>` {options.ToolbarCom} {options.ToolbarCom}{options.ToolbarCom}
</div>` </div>` ); );); }}` }`}}}`````ecodeSDK.setCom('${appId}', 'Header', Header);``ecodeSDK.setCom('${appId}', 'Header', Header);ecodeSDK.setCom('${appId}', 'Header', Header); der);`ecodeSDK.setCom('${appId}', 'Header', Header);ecodeSDK.setCom('${appId}', 'Header', Header);> Header.css:需要前置加载,自定义元素样式

Header.css:需要前置加载,自定义元素样式

.portal-cus-rss-header {
  position: relative;
  height: 36px;
  line-height: 36px;
  color: #fff;
  background-color: #4d7ad8;
}

.portal-cus-rss-header-title {
  padding-left: 10px;
  font-size: 14px;
}
  1. .portal-cus-rss-header {
  2. position: relative;
  3. height: 36px;
  4. line-height: 36px;
  5. color: #fff;
  6. background-color: #4d7ad8;
  7. }
  8. ``
  9. .portal-cus-rss-header-title {
  10. padding-left: 10px;
  11. font-size: 14px;
  12. } .portal-cus-rss-header {``.portal-cus-rss-header {.portal-cus-rss-header {position: relative;`` position: relative; position: relative;height: 36px;`` height: 36px; height: 36px;line-height: 36px;`` line-height: 36px; line-height: 36px;color: #fff;`` color: #fff; color: #fff;background-color: #4d7ad8;`` background-color: #4d7ad8; background-color: #4d7ad8;}``}}```.portal-cus-rss-header-title {.portal-cus-rss-header-title {.portal-cus-rss-header-title { padding-left: 10px;padding-left: 10px;` padding-left: 10px;` font-size: 14px; font-size: 14px;font-size: 14px;}`}}
(3)案例效果

6.元素标签页注册

ecodeSDK.rewritePortalCusEleTabQueue.push(option) ecology版本要求:2011及2011+

ecodeSDK.rewritePortalCusEleTabQueue.push(option) ecology版本要求:2011及2011+ cology版本要求:2011及2011+*

ecodeSDK.rewritePortalCusEleTabQueue.push(option) ecology版本要求:2011及2011+> 此方案开发的元素,可以直接使用标准登录插件,另外跳转到主题可以用路由跳转,性能可达到最优

此方案开发的元素,可以直接使用标准登录插件,另外跳转到主题可以用路由跳转,性能可达到最优

(1)参数说明
参数 说明 类型 可选 默认 备注
option 复写配置 object 必填 {}
option.fn 复写钩子函数 function 必填 (params)=>{} params 参数请看下一个表格
option.order 复写排序 integer 选填 0
option.desc 复写说明 string 选填 ‘’

参数 说明 类型 可选 默认 备注

参数 说明 类型 可选 默认 备注 参数说明类型可选默认备注

option 复写配置 object 必填 {}

option.fn 复写钩子函数 function 必填 (params)=>{} params 参数请看下一个表格

option.order 复写排序 integer 选填 0

option.desc 复写说明 string 选填 ‘’ 无

option 复写配置 object 必填 {}

option复写配置object必填{} option.fn 复写钩子函数 function 必填 (params)=>{} params 参数请看下一个表格 option.fn复写钩子函数function必填(params)=>{}params 参数请看下一个表格 option.order 复写排序 integer 选填 0

option.order复写排序integer选填0 option.desc 复写说明 string 选填 ‘’ 无 option.desc复写说明string选填‘’无

params 数据

params 数据

参数 说明 类型 备注
props 主题父组件参数 object
options 业务信息 object
options.ebaseid 元素ID string 元素定义完成后生成的ID

参数 说明 类型 备注

参数 说明 类型 备注 参数说明类型备注

props 主题父组件参数 object

options 业务信息 object 无

options.ebaseid 元素ID string 元素定义完成后生成的ID

props 主题父组件参数 object

props主题父组件参数object options 业务信息 object 无 options业务信息object无 options.ebaseid 元素ID string 元素定义完成后生成的ID options.ebaseid元素IDstring元素定义完成后生成的ID

(2)基本例子

register.js:需要前置加载,注册了登录页即可关联到标准

register.js:需要前置加载,注册了登录页即可关联到标准 ng元素定义完成后生成的ID

(2)基本例子

register.js:需要前置加载,注册了登录页即可关联到标准

register.js:需要前置加载,注册了登录页即可关联到标准```javascript ecodeSDK.rewritePortalCusEleTabQueue.push({ fn: (params) => { const { props = {}, options = {} } = params; if (options.ebaseid === '1') { const acParams = { appId: '${appId}', name: 'Tab', params, isPage: false, noCss: true }; return ecodeSDK.getAsyncCom(acParams); } return null; } });

noCss: true
      };
      return ecodeSDK.getAsyncCom(acParams);
    }
    return null;
  }
});
```1. `ecodeSDK.rewritePortalCusEleTabQueue.push({`
2. `  fn: (params) => {`
3. `    const { props = {}, options = {} } = params;`
4. `    if (options.ebaseid === '1') {`
5. `      const acParams = {`
6. `        appId: '${appId}',`
7. `        name: 'Tab',`
8. `        params,`
9. `        isPage: false,`
10. `        noCss: true`
11. `      };`
12. `      return ecodeSDK.getAsyncCom(acParams);`
13. `    }`
14. `    return null;`
15. `  }`
16. `});`
`ecodeSDK.rewritePortalCusEleTabQueue.push({``ecodeSDK.rewritePortalCusEleTabQueue.push({`ecodeSDK.rewritePortalCusEleTabQueue.push({`  fn: (params) => {``  fn: (params) => {` fn: (params) => {`    const { props = {}, options = {} } = params;``    const { props = {}, options = {} } = params;` const { props = {}, options = {} } = params;`    if (options.ebaseid === '1') {``    if (options.ebaseid === '1') {` if (options.ebaseid === '1') {`      const acParams = {``      const acParams = {` const acParams = {`        appId: '${appId}',``        appId: '${appId}',` appId: '${appId}',`        name: 'Tab',``        name: 'Tab',` name: 'Tab',`        params,``        params,` params,`        isPage: false,``        isPage: false,` isPage: false,`        noCss: true``        noCss: true` noCss: true`      };``      };` };`      return ecodeSDK.getAsyncCom(acParams);``      return ecodeSDK.getAsyncCom(acParams);` return ecodeSDK.getAsyncCom(acParams);`    }``    }` }`    return null;``    return null;` return null;`  }``  }` }`});``});`});
acParams);`    }``    }` }`    return null;``    return null;` return null;`  }``  }` }`});``});`});> Tab.js:不需要前置加载,元素也可以用mobx实现

Tab.js:不需要前置加载,元素也可以用mobx实现

```javascript
const { Popconfirm } = antd;

class Tab extends React.Component {
  render() {
    const { params = {} } = this.props;
    const { props = {}, options = {} } = params;
    const { datas = {} } = props;
    const { tabids = [], titles = [], counts = {} } = datas;

    return (
      <div className="portal-cus-rss-tab">
        <ul>
          {
            titles.map((item, index) => {
              return (
                <li 
                  key={tabids[index]} 
                  className={tabids[index] == options.tabid ? 'portal-cus-rss-tab-active' : ''} 
                  onClick={() => options.handleTabData(tabids[index])}
                >
                  <span>{item}</span>
                </li>
              );
            })
          }
        </ul>
      </div>
    );
  }
}

ecodeSDK.setCom('${appId}', 'Tab', Tab);
}) }
); } }

ecodeSDK.setCom('${appId}', 'Tab', Tab); `1. `const { Popconfirm } = antd;` 2. 3. class Tab extends React.Component { 4. render() { 5. const { params = {} } = this.props; 6. const { props = {}, options = {} } = params; 7. const { datas = {} } = props; 8. const { tabids = [], titles = [], counts = {} } = datas; 9. 10. ` return (` 11. ` <div className="portal-cus-rss-tab">` 12. ` <ul>` 13. ` {` 14. ` titles.map((item, index) => {` 15. ` return (` 16. ` <li ` 17. ` key={tabids[index]} ` 18. ` className={tabids[index] == options.tabid ? 'portal-cus-rss-tab-active' : ''} ` 19. ` onClick={() => options.handleTabData(tabids[index])}` 20. ` >` 21. ` <span>{item}</span>` 22. ` </li>` 23. ` );` 24. ` })` 25. ` }` 26. ` </ul>` 27. ` </div>` 28. ` );` 29. ` }` 30. `}` 31. 32. ecodeSDK.setCom('${appId}', 'Tab', Tab); const { Popconfirm } = antd;``const { Popconfirm } = antd;const { Popconfirm } = antd;class Tab extends React.Component {``class Tab extends React.Component {`class Tab extends React.Component {` render() {`` render() {` render() {` const { params = {} } = this.props;`` const { params = {} } = this.props;` const { params = {} } = this.props;` const { props = {}, options = {} } = params;`` const { props = {}, options = {} } = params;` const { props = s = {}, options = {} } = params;`` const { props = {}, options = {} } = params;` const { props = s = {}, options = {} } = params;`` const { props = {}, options = {} } = params;` const { props = {}, options = {} } = params;` const { datas = {} } = props;`` const { datas = {} } = props;` const { datas = {} } = props;` const { tabids = [], titles = [], counts = {} } = datas;`` const { tabids = [], titles = [], counts = {} } = datas;` const { tabids = [], titles = [], counts = {} } = datas; return (return (` return (` <div className="portal-cus-rss-tab">

<div className="portal-cus-rss-tab"> </div>`` </div>
);`` ); );}`` } }}``}}```ecodeSDK.setCom('${appId}', 'Tab', Tab);ecodeSDK.setCom('${appId}', 'Tab', Tab);ecodeSDK.setCom('${appId}', 'Tab', Tab); d}', 'Tab', Tab);``ecodeSDK.setCom('${appId}', 'Tab', Tab);ecodeSDK.setCom('${appId}', 'Tab', Tab);> Tab.css:需要前置加载,自定义元素样式

Tab.css:需要前置加载,自定义元素样式

.portal-cus-rss-tab {
  position: relative;
  height: 36px;
  line-height: 36px;
  color: #333;
  border-bottom: 1px solid #ccc;
  box-sizing: content-box;
}

.portal-cus-rss-tab ul::after {
  content: '';
  display: block;
  clear: both;
}

.portal-cus-rss-tab ul li {
  float: left;
  width: auto;
  padding: 0px 10px;
  cursor: pointer;
}

.portal-cus-rss-tab-active {
  color: #4d7ad8;
  border-bottom: 1px solid #4d7ad8;
}
pointer; }

.portal-cus-rss-tab-active {
color: #4d7ad8;
border-bottom: 1px solid #4d7ad8;
}
``1..portal-cus-rss-tab {`
2. position: relative;
3. height: 36px;
4. line-height: 36px;
5. color: #333;
6. border-bottom: 1px solid #ccc;
7. box-sizing: content-box;
8. }
9. ``
10. .portal-cus-rss-tab ul::after {
11. content: '';
12. display: block;
13. clear: both;
14. }
15. ``
16. .portal-cus-rss-tab ul li {
17. float: left;
18. width: auto;
19. padding: 0px 10px;
20. cursor: pointer;
21. }
22. ``
23. .portal-cus-rss-tab-active {
24. color: #4d7ad8;
25. border-bottom: 1px solid #4d7ad8;
26. }
.portal-cus-rss-tab {``.portal-cus-rss-tab {.portal-cus-rss-tab {position: relative;`` position: relative; position: relative;height: 36px;`` height: 36px; height: 36px;line-height: 36px;`` line-height: 36px; line-height: 36px;color: #333;`` color: #333; color: #333;border-bottom: 1px solid #ccc;`` border-bottom: 1px solid #ccc; border-bottom: 1px solid #ccc;box-sizing: content-box;`` box-sizing: content-box; box-sizing: content-box;}``}}.portal-cus-rss-tab ul::after {``.portal-cus-rss-tab ul::after {`.portal-cus-rss-tab ul::after {` content: '';`` content: '';` content: '';` display: block;`` display: block;` display: block;` clear: both;`` clear: both;` clear: both;`}``}`}.portal-cus-rss-tab ul li {.portal-cus-rss-tab ul li {`.portal-cus-rss-tab ul li {` float: left; float: left;float: left; width: auto;` width: auto; width: auto;` padding: 0px 10
left;float: left;` float: left;` width: auto; width: auto;width: auto; padding: 0px 10: left;float: left;` float: left;` width: auto; width: auto;width: auto; padding: 0px 10px;padding: 0px 10px;` padding: 0px 10px;` cursor: pointer; cursor: pointer;cursor: pointer;}}`}`````.portal-cus-rss-tab-active {.portal-cus-rss-tab-active {.portal-cus-rss-tab-active { color: #4d7ad8;color: #4d7ad8;` color: #4d7ad8;` border-bottom: 1px solid #4d7ad8; border-bottom: 1px solid #4d7ad8;border-bottom: 1px solid #4d7ad8;}}`} m: 1px solid #4d7ad8; border-bottom: 1px solid #4d7ad8;border-bottom: 1px solid #4d7ad8;}`}}###### (3)案例效果

7.元素工具栏注册

ecodeSDK.rewritePortalCusEleToolbarQueue.push(option) ecology版本要求:2011及2011+

ecodeSDK.rewritePortalCusEleToolbarQueue.push(option) ecology版本要求:2011及2011+

此方案开发的元素,可以直接使用标准登录插件,另外跳转到主题可以用路由跳转,性能可达到最优

此方案开发的元素,可以直接使用标准登录插件,另外跳转到主题可以用路由跳转,性能可达到最优

(1)参数说明
参数 说明 类型 可选 默认 备注
option 复写配置 object 必填 {}
option.fn 复写钩子函数 function 必填 (params)=>{} params 参数请看下一个表格
option.order 复写排序 integer 选填 0
option.desc 复写说明 string 选填 ‘’

参数 说明 类型 可选 默认 备注

参数 说明 类型 可选 默认 备注 参数说明类型可选默认备注

option 复写配置 object 必填 {}

option.fn 复写钩子函数 function 必填 (params)=>{} params 参数请看下一个表格

option.order 复写排序 integer 选填 0

option.desc 复写说明 string 选填 ‘’ 无

option 复写配置 object 必填 {}

option复写配置object必填{} option.fn 复写钩子函数 function 必填 (params)=>{} params 参数请看下一个表格 option.fn复写钩子函数function必填(params)=>{}params 参数请看下一个表格 option.order 复写排序 integer 选填 0

option.order复写排序integer选填0 option.desc 复写说明 string 选填 ‘’ 无 option.desc复写说明string选填‘’无

params 数据

params 数据

参数 说明 类型 备注
props 主题父组件参数 object
options 业务信息 object
options.ebaseid 元素ID string 元素定义完成后生成的ID

参数 说明 类型 备注

参数 说明 类型 备注 参数说明类型备注

props 主题父组件参数 object

options 业务信息 object 无

options.ebaseid 元素ID string 元素定义完成后生成的ID 型 备注 参数说明类型备注

props 主题父组件参数 object

options 业务信息 object 无

options.ebaseid 元素ID string 元素定义完成后生成的IDprops 主题父组件参数 object

props主题父组件参数object options 业务信息 object 无 options业务信息object无 options.ebaseid 元素ID string 元素定义完成后生成的ID options.ebaseid元素IDstring元素定义完成后生成的ID

(2)基本例子

register.js:需要前置加载,注册了登录页即可关联到标准

register.js:需要前置加载,注册了登录页即可关联到标准

ecodeSDK.rewritePortalCusEleToolbarQueue.push({
  fn: (params) => {
    const { props = {}, options = {} } = params;
    if (options.ebaseid === '1') {
      const acParams = {
        appId: '${appId}',
        name: 'Toolbar',
        params,
        isPage: false,
        noCss: true
      };
      return ecodeSDK.getAsyncCom(acParams);
    }
    return null;
  }
});
noCss: true }; return ecodeSDK.getAsyncCom(acParams); } return null; } }); `1. `ecodeSDK.rewritePortalCusEleToolbarQueue.push({` 2. ` fn: (params) => {` 3. ` const { props = {}, options = {} } = params;` 4. ` if (options.ebaseid === '1') {` 5. ` const acParams = {` 6. ` appId: '${appId}',` 7. ` name: 'Toolbar',` 8. ` params,` 9. ` isPage: false,` 10. ` noCss: true` 11. ` };` 12. ` return ecodeSDK.getAsyncCom(acParams);` 13. ` }` 14. ` return null;` 15. ` }` 16. `});` `ecodeSDK.rewritePortalCusEleToolbarQueue.push({ecodeSDK.rewritePortalCusEleToolbarQueue.push({ecodeSDK.rewritePortalCusEleToolbarQueue.push({ fn: (params) => {fn: (params) => {` fn: (params) => {` const { props = {}, options = {} } = params; const { props = {}, options = {} } = params;const { props = {}, options = {} } = params; if (options.ebaseid === '1') {if (options.ebaseid === '1') {` if (options.ebaseid === '1') {` const acParams = { const acParams = {const acParams = { appId: '${appId}',appId: '${appId}',` appId: '${appId}',` name: 'Toolbar', name: 'Toolbar',name: 'Toolbar', params,params,` params,` isPage: false, isPage: false,isPage: false, noCss: truenoCss: true` noCss: true` }; };}; return ecodeSDK.getAsyncCom(acParams);return ecodeSDK.getAsyncCom(acParams);` return ecodeSDK.getAsyncCom(acParams);` } }} return null;return null;` return ;` return ecodeSDK.getAsyncCom(acParams);` } }} return null;return null;` return;` return ecodeSDK.getAsyncCom(acParams);` } }} return null;return null;` return null;` } }}});});`}); acParams);` } }} return null;return null;` return null;` } }}});`});});> Toolbar.js:不需要前置加载,元素也可以用mobx实现

Toolbar.js:不需要前置加载,元素也可以用mobx实现

const { Popconfirm } = antd;

class Toolbar extends React.Component {
  render() {
    const { params = {} } = this.props;
    const { props = {}, options = {} } = params;

    return (
      <div className="portal-cus-rss-toolbar">
        <ul>
          <li><span onClick={options.handleRefresh}>刷新</span></li>
          <li><span onClick={options.handleSetting}>设置</span></li>
          <li>
            <Popconfirm 
              placement="leftTop" 
              title="此元素被删除后将不能被恢复,是否继续?"
              onConfirm={options.handleDelete} 
              okText="确定"
              cancelText="取消"
            >
              <span>删除</span>
            </Popconfirm>
          </li>
          <li><span onClick={options.handleMore}>更多</span></li>
        </ul>
      </div>
    );
  }
}

ecodeSDK.setCom('${appId}', 'Toolbar', Toolbar);

); } }

ecodeSDK.setCom('${appId}', 'Toolbar', Toolbar); `1. `const { Popconfirm } = antd;` 2. 3. class Toolbar extends React.Component { 4. render() { 5. const { params = {} } = this.props; 6. const { props = {}, options = {} } = params; 7. 8. ` return (` 9. ` <div className="portal-cus-rss-toolbar">` 10. ` <ul>` 11. ` <li><span onClick={options.handleRefresh}>刷新</span></li>` 12. ` <li><span onClick={options.handleSetting}>设置</span></li>` 13. ` <li>` 14. ` <Popconfirm ` 15. ` placement="leftTop" ` 16. ` title="此元素被删除后将不能被恢复,是否继续?"` 17. ` onConfirm={options.handleDelete} ` 18. ` okText="确定"` 19. ` cancelText="取消"` 20. ` >` 21. ` <span>删除</span>` 22. ` </Popconfirm>` 23. ` </li>` 24. ` <li><span onClick={options.handleMore}>更多</span></li>` 25. ` </ul>` 26. ` </div>` 27. ` );` 28. ` }` 29. `}` 30. 31. ecodeSDK.setCom('${appId}', 'Toolbar', Toolbar); const { Popconfirm } = antd;``const { Popconfirm } = antd;const { Popconfirm } = antd;class Toolbar extends React.Component {``class Toolbar extends React.Component {`class Toolbar extends React.Component {` render() {`` render() {` render() {` const { params = {} } = this.props;`` const { params = {} } = this.props;` const { params = {} } = this.props;` const { props = {}, options = {} } = params;`` const { props = {}, options = {} } = params;` const { pro props = {}, options = {} } = params;`` const { props = {}, options = {} } = params;` const { pro props = {}, options = {} } = params;`` const { props = {}, options = {} } = params;` const { props = {}, options = {} } = params; return (return (` return (` <div className="portal-cus-rss-toolbar">

<div className="portal-cus-rss-toolbar"> </ul>
</div>` </div>` ); );); }}` }`}}}`````ecodeSDK.setCom('${appId}', 'Toolbar', Toolbar);``ecodeSDK.setCom('${appId}', 'Toolbar', Toolbar);ecodeSDK.setCom('${appId}', 'Toolbar', Toolbar); ;`ecodeSDK.setCom('${appId}', 'Toolbar', Toolbar);ecodeSDK.setCom('${appId}', 'Toolbar', Toolbar);> Toolbar.css:需要前置加载,自定义元素样式

Toolbar.css:需要前置加载,自定义元素样式

.portal-cus-rss-toolbar {
  position: absolute;
  top: 0;
  right: 5px;
}

.portal-cus-rss-toolbar ul::after {
  content: '';
  display: block;
  clear: both;
}

.portal-cus-rss-toolbar ul li {
  float: left;
  width: auto;
  padding: 0px 10px;
  cursor: pointer;
}
-cus-rss-toolbar ul li { float: left; width: auto; padding: 0px 10px; cursor: pointer; } `1. `.portal-cus-rss-toolbar {` 2. ` position: absolute;` 3. ` top: 0;` 4. ` right: 5px;` 5. `}` 6. 7. .portal-cus-rss-toolbar ul::after { 8. content: ''; 9. display: block; 10. clear: both; 11. } 12. 13. `.portal-cus-rss-toolbar ul li {` 14. ` float: left;` 15. ` width: auto;` 16. ` padding: 0px 10px;` 17. ` cursor: pointer;` 18. `}` `.portal-cus-rss-toolbar {.portal-cus-rss-toolbar {.portal-cus-rss-toolbar { position: absolute;position: absolute;` position: absolute;` top: 0; top: 0;top: 0; right: 5px;right: 5px;` right: 5px;`}}}`````.portal-cus-rss-toolbar ul::after {``.portal-cus-rss-toolbar ul::after {.portal-cus-rss-toolbar ul::after {content: '';`` content: ''; content: '';display: block;`` display: block; display: block;clear: both;`` clear: both; clear: both;}``}}```.portal-cus-rss-toolbar ul li {.portal-cus-rss-toolbar ul li {.portal-cus-rss-toolbar ul li { float: left;float: left;` float: left;` width: auto; width: auto;width: auto; padding: 0px 10px;padding: 0px 10px;` padding: 0px 10px;` cursor: pointer; cursor: pointer;cursor: pointer;}`}}

(3)案例效果

8、PC门户登录页注册

ecodeSDK.rewritePortalLoginQueue.push(option) ecology版本要求:1906及1906+

ecodeSDK.rewritePortalLoginQueue.push(option) ecology版本要求:1906及1906+ ` ecology版本要求:1906及1906+

ecodeSDK.rewritePortalLoginQueue.push(option) ecology版本要求:1906及1906+> 此方案开发的元素,可以直接使用标准登录插件,另外跳转到主题可以用路由跳转,性能可达到最优

此方案开发的元素,可以直接使用标准登录插件,另外跳转到主题可以用路由跳转,性能可达到最优

(1)参数说明
参数 说明 类型 可选 默认 备注
option 复写配置 object 必填 {}
option.fn 复写钩子函数 function 必填 (params)=>{} params 参数请看下一个表格
option.order 复写排序 integer 选填 0
option.desc 复写说明 string 选填 ‘’

参数 说明 类型 可选 默认 备注

参数 说明 类型 可选 默认 备注 参数说明类型可选默认备注

option 复写配置 object 必填 {}

option.fn 复写钩子函数 function 必填 (params)=>{} params 参数请看下一个表格

option.order 复写排序 integer 选填 0

option.desc 复写说明 string 选填 ‘’ 无

option 复写配置 object 必填 {}

option复写配置object必填{} option.fn 复写钩子函数 function 必填 (params)=>{} params 参数请看下一个表格 option.fn复写钩子函数function必填(params)=>{}params 参数请看下一个表格 option.order 复写排序 integer 选填 0

option.order复写排序integer选填0 option.desc 复写说明 string 选填 ‘’ 无 option.desc复写说明string选填‘’无

params 数据

params 数据

参数 说明 类型 备注
props 主题父组件参数 object
options 业务信息 object
options.id 登录页ID string 登录页定义完成后生成的ID

参数 说明 类型 备注

参数 说明 类型 备注 参数说明类型备注

props 主题父组件参数 object

options 业务信息 object 无

options.id 登录页ID string 登录页定义完成后生成的ID

props 主题父组件参数 object

props主题父组件参数object options 业务信息 object 无 options业务信息object无 options.id 登录页ID string 登录页定义完成后生成的ID options.id登录页IDstring登录页定义完成后生成的ID

(2)基本例子

register.js:需要前置加载,注册了登录页即可关联到标准

register.js:需要前置加载,注册了登录页即可关联到标准 g登录页定义完成后生成的ID

(2)基本例子

register.js:需要前置加载,注册了登录页即可关联到标准

register.js:需要前置加载,注册了登录页即可关联到标准javascript ecodeSDK.rewritePortalLoginQueue.push({ fn:(params)=>{ const {props,options} = params; if(options.id==='a92ef529fd16469988feebe0e38cd83e') { const acParams = { appId:'${appId}', name:'E9NewLogin', //模块名称 isPage:false, //是否是路由页面 noCss:true, //是否禁止单独加载css,通常为了减少css数量,css默认前置加载 props:props } //异步加载模块${appId}下的子模块CusEle return ecodeSDK.getAsyncCom(acParams); } return null; }, order:1, desc:'新登录页' });

 return ecodeSDK.getAsyncCom(acParams);
    }
    return null;
  },
  order:1,
  desc:'新登录页'
});
```1. `ecodeSDK.rewritePortalLoginQueue.push({`
2. `  fn:(params)=>{`
3. `    const {props,options} = params;`
4. `    if(options.id==='a92ef529fd16469988feebe0e38cd83e') {`
5. `      const acParams = {`
6. `        appId:'${appId}',`
7. `        name:'E9NewLogin', //模块名称`
8. `        isPage:false, //是否是路由页面`
9. `        noCss:true, //是否禁止单独加载css,通常为了减少css数量,css默认前置加载`
10. `        props:props`
11. `      }`
12. `      //异步加载模块${appId}下的子模块CusEle`
13. `      return ecodeSDK.getAsyncCom(acParams);`
14. `    }`
15. `    return null;`
16. `  },`
17. `  order:1,`
18. `  desc:'新登录页'`
19. `});`
`ecodeSDK.rewritePortalLoginQueue.push({``ecodeSDK.rewritePortalLoginQueue.push({`ecodeSDK.rewritePortalLoginQueue.push({`  fn:(params)=>{``  fn:(params)=>{` fn:(params)=>{`    const {props,options} = params;``    const {props,options} = params;` const {props,options} = params;`    if(options.id==='a92ef529fd16469988feebe0e38cd83e') {``    if(options.id==='a92ef529fd16469988feebe0e38cd83e') {` if(options.id==='a92ef529fd16469988feebe0e38cd83e') {`      const acParams = {``      const acParams = {` const acParams = {`        appId:'${appId}',``        appId:'${appId}',` appId:'${appId}',`        name:'E9NewLogin', //模块名称``        name:'E9NewLogin', //模块名称` name:'E9NewLogin', //模块名称`        isPage:false, //是否是路由页面``        isPage:false, //是否是路由页面` isPage:false, //是否是路由页面`        noCss:true, //是否禁止单独加载css,通常为了减少css数量,css默认前置加载``        noCss:true, //是否禁止单独加载css,通常为了减少css数量,css默认前置加载` noCss:true, /
独加载css,通常为了减少css数量,css默认前置加载``        noCss:true, //是否禁止单独加载css,通常为了减少css数量,css默认前置加载` noCss:true, /独加载css,通常为了减少css数量,css默认前置加载``        noCss:true, //是否禁止单独加载css,通常为了减少css数量,css默认前置加载` noCss:true, //是否禁止单独加载css,通常为了减少css数量,css默认前置加载`        props:props``        props:props` props:props`      }``      }` }`      //异步加载模块${appId}下的子模块CusEle``      //异步加载模块${appId}下的子模块CusEle` //异步加载模块${appId}下的子模块CusEle`      return ecodeSDK.getAsyncCom(acParams);``      return ecodeSDK.getAsyncCom(acParams);` return ecodeSDK.getAsyncCom(acParams);`    }``    }` }`    return null;``    return null;` return null;`  },``  },` },`  order:1,``  order:1,` order:1,`  desc:'新登录页'``  desc:'新登录页'` desc:'新登录页'`});``});`});
},``  },` },`  order:1,``  order:1,` order:1,`  desc:'新登录页'``  desc:'新登录页'` desc:'新登录页'`});``});`});###### (3)如何配置登录页

> 建立特色登录前门户,并获取ID

建立特色登录前门户,并获取ID

![](../../assets/external-images/file_1569058249000-big.png)

> 在登录页中关联登录前门户,从页面模板可以选择到这个特色门户,并选中这个登录页启用,注意一旦启用并且登录页还未调试好,就必须通过特殊地址才能登陆,调试期间可通过此地址/wui/index.html#/?templateId=-1强制切到标准登录页

在登录页中关联登录前门户,从页面模板可以选择到这个特色门户,并选中这个登录页启用,注意一旦启用并且登录页还未调试好,就必须通过特殊地址才能登陆,调试期间可通过此地址/wui/index.html#/?templateId=-1强制切到标准登录页

![](../../assets/external-images/file_1569058336000-big.png)

> 在代码中关联此登录页,即可开始调试

在代码中关联此登录页,即可开始调试

![](../../assets/external-images/file_1589528778000.png)

![](../../assets/external-images/file_1589528778000.png)

##### 9、全局流程代码块整合

> 此方案用于对全局流程做批量控制采用,另外也可作为单个流程或节点的代码块快速绑定,省去了绑定流程还到多个地方操作的麻烦,创建ecode项目的register.js并标记前置加载

此方案用于对全局流程做批量控制采用,另外也可作为单个流程或节点的代码块快速绑定,省去了绑定流程还到多个地方操作的麻烦,创建ecode项目的register.js并标记前置加载

```javascript
let enable = true;
let isRun = false; //控制执行次数

const runScript = ()=>{ //代码块钩子,类似放在代码块中或者jquery.ready
  //可操作WfForm,以及部分表单dom hiden、ReactDOM.render
  //console.log('runScript!');
  isRun = true; //确保只执行一次
}
可操作WfForm,以及部分表单dom hiden、ReactDOM.render
  //console.log('runScript!');
  isRun = true; //确保只执行一次
}//PC端代码块
//利用组件复写作为代码块执行钩子,这种方案可以支持覆盖到所有流程,也可以判断到指定流程指定节点
ecodeSDK.overwritePropsFnQueueMapSet('WeaReqTop',{
  fn:(newProps)=>{
    if(!enable) return ; //开关打开
    const {hash} = window.location;
    if(!hash.startsWith('#/main/workflow/req')) return ; //判断页面地址
    if(!ecCom.WeaTools.Base64) return ; //完整组件库加载完成
    if(!WfForm) return ; //表单sdk加载完成
    const baseInfo = WfForm.getBaseInfo();
    const {workflowid} = baseInfo;
    if(workflowid!==44) return ; //判断流程id
    if(isRun) return ; //执行过一次就不执行
    runScript(); //执行代码块
  }
});

//移动端触发代码块,由于移动端代码块使用的组件和PC端代码块不同,所以此方法可以建一个独立项目(橙色)
ecodeSDK.overwriteMobilePropsFnQueueMapSet('TabPage',{
  fn:(newProps)=>{
    if(!enable) return ; //开关打开
    const {hash} = window.location;
    if(!hash.startsWith('#/req')) return ; //判断页面地址
    if(!WfForm) return ; //表单sdk加载完成
    const baseInfo = WfForm.getBaseInfo();
    const {workflowid} = baseInfo;
    if(workflowid!==44) return ; //判断流程id
    if(isRun) return ; //执行过一次就不执行
    runScript(); //执行代码块
  }
});
owid!==44) return ; //判断流程id if(isRun) return ; //执行过一次就不执行 runScript(); //执行代码块 } });1. let enable = true; 2. let isRun = false; //控制执行次数 3. 4. `const runScript = ()=>{ //代码块钩子,类似放在代码块中或者jquery.ready` 5. ` //可操作WfForm,以及部分表单dom hiden、ReactDOM.render` 6. ` //console.log('runScript!');` 7. ` isRun = true; //确保只执行一次` 8. `}` 9. 10. //PC端代码块 11. //利用组件复写作为代码块执行钩子,这种方案可以支持覆盖到所有流程,也可以判断到指定流程指定节点 12. ecodeSDK.overwritePropsFnQueueMapSet('WeaReqTop',{ 13. fn:(newProps)=>{ 14. if(!enable) return ; //开关打开 15. const {hash} = window.location; 16. if(!hash.startsWith('#/main/workflow/req')) return ; //判断页面地址 17. if(!ecCom.WeaTools.Base64) return ; //完整组件库加载完成 18. if(!WfForm) return ; //表单sdk加载完成 19. const baseInfo = WfForm.getBaseInfo(); 20. const {workflowid} = baseInfo; 21. if(workflowid!==44) return ; //判断流程id 22. if(isRun) return ; //执行过一次就不执行 23. runScript(); //执行代码块 24. } 25. }); 26. 27. `//移动端触发代码块,由于移动端代码块使用的组件和PC端代码块不同,所以此方法可以建一个独立项目(橙色)` 28. `ecodeSDK.overwriteMobilePropsFnQueueMapSet('TabPage',{` 29. ` fn:(newProps)=>{` 30. ` if(!enable) return ; //开关打开` 31. ` const {hash} = window.location;` 32. ` if(!hash.startsWith('#/req')) return ; //判断页面地址` 33. ` if(!WfForm) return ; //表单sdk加载完成` 34. ` const baseInfo = WfForm.getBaseInfo();` 35. ` const {workflowid} = baseInfo;` 36. ` if(workflowid!==44) return ; //判断流程id` 37. ` if(isRun) return ; //执行过一次就不执行` 38. ` runScript(); //执行代码块` 39. ` }` 40. `});` `let enable = true;let enable = true;`let enab

  1. runScript(); //执行代码块
  2. }
  3. }); let enable = true;``let enable = true;let enab
  4. runScript(); //执行代码块
  5. }
  6. }); let enable = true;``let enable = true;let enable = true;let isRun = false; //控制执行次数``let isRun = false; //控制执行次数let isRun = false; //控制执行次数const runScript = ()=>{ //代码块钩子,类似放在代码块中或者jquery.ready``const runScript = ()=>{ //代码块钩子,类似放在代码块中或者jquery.ready`const runScript = ()=>{ //代码块钩子,类似放在代码块中或者jquery.ready` //可操作WfForm,以及部分表单dom hiden、ReactDOM.render`` //可操作WfForm,以及部分表单dom hiden、ReactDOM.render` //可操作WfForm,以及部分表单dom hiden、ReactDOM.render` //console.log('runScript!');`` //console.log('runScript!');` //console.log('runScript!');` isRun = true; //确保只执行一次`` isRun = true; //确保只执行一次` isRun = true; //确保只执行一次`}``}`}//PC端代码块//PC端代码块`//PC端代码块`//利用组件复写作为代码块执行钩子,这种方案可以支持覆盖到所有流程,也可以判断到指定流程指定节点//利用组件复写作为代码块执行钩子,这种方案可以支持覆盖到所有流程,也可以判断到指定流程指定节点//利用组件复写作为代码块执行钩子,这种方案可以支持覆盖到所有流程,也可以判断到指定流程指定节点ecodeSDK.overwritePropsFnQueueMapSet('WeaReqTop',{ecodeSDK.overwritePropsFnQueueMapSet('WeaReqTop',{`ecodeSDK.overwritePropsFnQueueMapSet('WeaReqTop',{` fn:(newProps)=>{ fn:(newProps)=>{fn:(newProps)=>{ if(!enable) return ; //开关打开if(!enable) return ; //开关打开` if(!enable) return ; //开关打开` const {hash} = window.location; const {hash} = window.location;const {hash} = window.location; if(!hash.startsWith('#/main/workflow/req')) return ; //判断页面地址if(!hash.startsWith('#/main/workflow/req')) return ; //判断页面地址` if(!hash.startsWith('#/main/workflow/req')) return ; //判断页面地址` if(!ecCom.WeaTools.Base64) 断页面地址` if(!hash.startsWith('#/main/workflow/req')) return ; //判断页面地址` if(!ecCom.WeaTools.Base64) 断页面地址` if(!hash.startsWith('#/main/workflow/req')) return ; //判断页面地址` if(!ecCom.WeaTools.Base64) return ; //完整组件库加载完成 if(!ecCom.WeaTools.Base64) return ; //完整组件库加载完成if(!ecCom.WeaTools.Base64) return ; //完整组件库加载完成 if(!WfForm) return ; //表单sdk加载完成if(!WfForm) return ; //表单sdk加载完成` if(!WfForm) return ; //表单sdk加载完成` const baseInfo = WfForm.getBaseInfo(); const baseInfo = WfForm.getBaseInfo();const baseInfo = WfForm.getBaseInfo(); const {workflowid} = baseInfo;const {workflowid} = baseInfo;` const {workflowid} = baseInfo;` if(workflowid!==44) return ; //判断流程id if(workflowid!==44) return ; //判断流程idif(workflowid!==44) return ; //判断流程id if(isRun) return ; //执行过一次就不执行if(isRun) return ; //执行过一次就不执行` if(isRun) return ; //执行过一次就不执行` runScript(); //执行代码块 runScript(); //执行代码块runScript(); //执行代码块 }}` }`});});});`````//移动端触发代码块,由于移动端代码块使用的组件和PC端代码块不同,所以此方法可以建一个独立项目(橙色)``//移动端触发代码块,由于移动端代码块使用的组件和PC端代码块不同,所以此方法可以建一个独立项目(橙色)//移动端触发代码块,由于移动端代码块使用的组件和PC端代码块不同,所以此方法可以建一个独立项目(橙色)ecodeSDK.overwriteMobilePropsFnQueueMapSet('TabPage',{``ecodeSDK.overwriteMobilePropsFnQueueMapSet('TabPage',{ecodeSDK.overwriteMobilePropsFnQueueMapSet('TabPage',{fn:(newProps)=>{`` fn:(newProps)=>{ fn:(newProps)=>{if(!enable) return ; //开关打开`` if(!enable) return ; //开关打开 if(!enable) return ; //开关打开const {hash} = window.location;`` const {hash} = window.location; const {hash} = window.location;if(!hash.startsWith('# on;`` const {hash} = window.location; const {hash} = window.location;if(!hash.startsWith('#on;`` const {hash} = window.location; const {hash} = window.location;if(!hash.startsWith('#/req')) return ; //判断页面地址`` if(!hash.startsWith('#/req')) return ; //判断页面地址 if(!hash.startsWith('#/req')) return ; //判断页面地址if(!WfForm) return ; //表单sdk加载完成`` if(!WfForm) return ; //表单sdk加载完成 if(!WfForm) return ; //表单sdk加载完成const baseInfo = WfForm.getBaseInfo();`` const baseInfo = WfForm.getBaseInfo(); const baseInfo = WfForm.getBaseInfo();const {workflowid} = baseInfo;`` const {workflowid} = baseInfo; const {workflowid} = baseInfo;if(workflowid!==44) return ; //判断流程id`` if(workflowid!==44) return ; //判断流程id if(workflowid!==44) return ; //判断流程idif(isRun) return ; //执行过一次就不执行`` if(isRun) return ; //执行过一次就不执行 if(isRun) return ; //执行过一次就不执行runScript(); //执行代码块`` runScript(); //执行代码块 runScript(); //执行代码块}`` } }});``});});

runScript(); //执行代码块runScript(); //执行代码块` runScript(); //执行代码块` } }}});`});}); ---> ℹ️ 对比提示: 本文档介绍的是门户主题/元素/登录页开发,如需开发独立的 SPA 路由页面,请参考 六-新页面开发.md

⚠️ 注意: 文件末尾“全局流程代码块整合”部分的代码格式存在重复,建议参考官方原文档对照阅读。