代码模型
一个页面包括5个文件:源码 W 文件、代码 JS 文件、样式 CSS 文件、元数据 meta 文件和服务元数据 serviceMetaInfo 文件。
源码 W 文件
W 文件是 XML 格式的,相当于 Html 文件,里面是一个个组件,以树的形式存储层次结构。W 文件示例如下图所示
页面结构
W 文件里面的层次结构,在页面设计区通过页面结构展示。如下图所示,W 文件的根组件是“页面”组件
组件属性
JSX 属性值,除字符串以外,都使用“大花括号”括起来,例如:
- 字符串:tab="表格"
- 布尔值:filterRow={true}
- JSON:pagination={{pageSize:4}}
W 文件是 XML 格式的,属性值都使用“双引号”括起来,组件属性值经过编译生成 JSX 属性值,对应关系如下:
类型 | 组件属性值 | JSX 属性值 |
---|---|---|
字符串 | tab="表格" | tab="表格" |
布尔 | filterRow="true" | filterRow={true} |
JSON | pagination="{{{pageSize:4}}}" | pagination={{pageSize:4}} |
组件属性值支持表达式
- 数据组件当前行:text="{pageData.current?.title}"
- 表格(列表)当前行:src="{$row.images}"
表达式中可以调用 JS 文件中的方法
- React 体系:在 w 文件中,使用 $page 访问 js 里面的方法,例如:
render="{$page.tableColumn27RenderRender(text, record, index)}"
- Vue 系统:在 w 文件中,直接访问 js 文件中的方法,使用 $page 访问 data.js 里面的方法,例如:
render="{tableColumn27RenderRender(text, record, index)}"
readonly="{$page.setReadonly($row.state)}"
特别说明
- 表达式内可用的语法糖变量有:$page, $row, $index, $parent, $root, $state, $event, $common
- $page:页面对象,获取组件,例如:$page.comp('restData1')
- $row, $index, $parent, $root:行对象相关,在表格(列表)中使用
- $state:页面状态,例如获取 loading:$state.loading
- $common:公共 JS 文件 UI2/pcx/common.js,在 w 文件中自动引用
组件事件
组件的事件支持:操作、操作组合、画代码、写代码
操作
调用一个操作,如下图所示,w 文件中的代码如下:
on:onClick="{'operation':'serviceRequest0.sendServiceRequest'}"
操作组合
调用多个操作,如下图所示,w 文件中的代码如下:
on:onClick="[{'operation':'batchRequest0.beginBatchRequest'},{'operation':'commonOperation.saveData','args':{'data':'ordermData'}},{'operation':'commonOperation.saveData','args':{'data':'productData'}},{'operation':'batchRequest0.endBatchRequest'}]"
画代码
适用于非开发者,在捋顺业务逻辑后,可以使用画代码的方式进行无代码开发。w 文件中的代码如下,在 JS 文件中生成相应的 JS 代码
on:onClick="{'args':{'event':'js:$event'},'operation':'button2OnClickCallback.customOperation','type':'customOperation'}"
系统提供“动作”用于执行一个或多个语句;提供“条件分支”实现 if else 语句;提供“循环”实现 for 语句,画代码的界面如下图所示。
写代码
适用于开发者,选择“写代码”,点击“跳转”按钮,在 w 文件中生成组件事件的定义代码,代码如下;在 JS 文件中生成相应的 JS 方法。
on:onClick="onOpenDialogBtnClick({"row":$row})"
特别说明
- 组件事件的方法名由三部分组成:on + 组件 id + 事件名称。为了增加代码的可读性,组件 id 应该设置为有意义的名称
- 删除组件事件,不能只删除 JS 文件中的方法,也必须同时删除 w 文件中组件事件的定义代码
代码 JS 文件
和 w 文件同名的 JS 文件,支持 ES6 语法,JS 文件中是一个个 JS 方法,这些方法被 W 文件调用。
Vue 技术体系开发必读
React 体系有一个 JS 文件,Vue 体系有两个 JS 文件,使用 Vue 体系开发前一定仔细阅读《Vue 技术体系开发必读》
ES6 异步方法
ES6 提供 async 和 await 语法糖,使得调用异步方法和调用同步方法的写法一样。在方法上添加 async,在异步请求前添加 await 即可。
- 调用两个异步方法,这两个方法顺序执行,写法如下
let doDeleteRole = async (rowid) => {
try{
let {data:deletedSuccess} = await this.request({
method : "DELETE",
dataType : "text",
url : "/authorize/roles/" + rowid
})
let {deleteRoleResult} = await this.comp("deleteRoleRequest").send({ roleid: rowid });
message.info("删除角色执行成功!");
}catch(e){
message.error("删除角色执行失败:" + e);
}
}
- 调用两个异步方法,这两个方法同时执行,写法如下
let doDeleteRole = async (rowid) => {
try{
let pi = this.request({
method : "DELETE",
dataType : "text",
url : "/authorize/roles/" + rowid
})
let p2 = this.comp("deleteRoleRequest").send({ roleid: rowid });
await Promise.all([p1, p2]);
message.info("删除角色执行成功!");
}catch(e){
message.error("删除角色执行失败:" + e);
}
}
特别说明
- 注意必须抛出具体错误
ref 的使用
在 JS 文件中获取组件对象,调用组件方法,需要在组件上开启组件引用(数据组件除外),如下图所示,设置组件的“开启组件引用”属性为“是”
在 JS 文件中,可以通过 this.comp("组件id") 获取组件对象,如下图所示。开启组件引用相当于设置组件的 ref 属性,即组件设置 ref 属性后,即可在 JS 中获取组件对象。
企业门户打开页面使用单页模式,单页模式下打开的多个页面中,存在相同的元素 id 或者 class 时,直接使用 id 或 class 获取元素,会出现获取到的不是当前页面中元素的情况,另外 querySelector 还存在消耗资源的情况,因此不建议使用 querySelector 获取 DOM 元素,建议使用 ref 获取 DOM 元素
样式 CSS 文件
和 w 文件同名的 CSS 文件,用于设置当前页面的样式,设置样式的方法参考《页面样式》
元数据 meta 文件
w 文件的元数据文件,无需手工维护
在“配置”中的修改,会存入元数据文件。如果需要将一个普通页面改为流程页面,在配置中,选中“流程”即可
服务元信息 serviceMetaInfo 文件
页面保存时,系统根据 w 文件 的元数据文件,自动生成 w 文件的服务元信息文件。服务元信息文件的内容含义参考《服务元信息》
在“配置”中选中“PC 首页内容块”,使页面成为小部件页面,但是这还不够,小部件页面需要“编码”属性,因此需要自定义服务元信息文件,参考《桌面端门户首页小部件开发》
公共 JS 文件
公共 JS 文件位于 UI2/pcx/common.js,默认没有此文件,需要手工创建。w 文件自动引用,在表达式中使用 $common 访问,在 js 文件中手工引用。文件格式如下:
import './common.css';
export default {
// 对象为null,undefined,NaN 则输出为空串
convertToEmpty(value) {
if (value === null || value === undefined || Number.isNaN(value)) {
return '';
}
return value;
}
};
公共 CSS 文件
公共 CSS 文件位于 UI2/pcx/common.css,默认没有此文件,需要手工创建。在 common.css 文件中定义样式,在 common.js 文件中引用 common.css 文件,由于 w 文件会自动引用 common.js 文件,所以间接的 w 文件引用了 common.css 文件
在 common.js 文件中引用 common.css 文件的代码如下
在 common.css 文件中定义公共样式,代码如下
编译处理
页面编译就是将页面模型文件 w、 js 和 css 等文件,编译为可在浏览器里面使用的文件。
页面编译分为两个阶段
- 第一阶段, 将 w 编译为 js 文件
- React 体系的 w 文件编译
- 将 w 文件的视图 view 部分,编译为 component.js,逻辑部分(包括操作),编译为 build.js,再生成一个 js,引用 user.js
- 将 w 同名的 js 文件改名为 user.js
- css 文件不变
- Vue 系统的 w 文件编译
- 将 w、js、css 文件编译为 vue 文件
- data.js 文件不变
- 这些编译后的文件,放到 model-user/.debug/pcx/pages/pcx/ 目录下
- React 体系的 w 文件编译
React 的 W 文件,编译出 component.js、build.js 和 user.js,如下图所示
Vue 的 W 文件,编译出 vue 和 data.js,如下图所示
- 第二阶段,使用 webpack 打包
- 使用模块打包器 webpack 将 JS 文件打包在一起,生成一个可在浏览器中使用的文件,文件名为:_pages_pcx_xxx_component_js.js
UI2/pcx/cs.w 最终编译为 _pages_pcx_cs_component_js.js,如下图所示
UI2/pcx/page/pageComp.w 最终编译为 _pages_pcx_page_pageComp_component_js.js,如下图所示
特别说明
- 打开 IDE 时,系统编译 UI2/wxsys 目录下的文件
- 第一次预览时,系统根据预览的端,对端下的文件进行全编译,例如预览桌面端,编译 pcx 目录下所有的文件
- 第一次预览时,根据当前的技术体系(React 或者 Vue),对市场组件进行全编译
- 后续在 IDE 中修改文件,执行快速编译,即组件比较版本,其他文件比较时间,不变不编译