跳转至

title: OA/泛微 前端开发规范 created: 2026-04-18 updated: 2026-04-18 type: reference tags: [weaver]


OA/泛微 前端开发规范

适用于 E9 流程表单代码块、ecode 二次开发、前端脚本编写

1. 变量声明规范

严禁使用 var,优先使用 const,需重新赋值时使用 let

场景 推荐关键字 占比 说明
绝大多数情况 const ~90% 声明后不可重新赋值,防止意外修改
需要重新赋值 let ~10% 循环计数器、状态切换、累加器等
永远不用 var 0% ES6 之后写新代码完全不需要它

为什么不用 var

  1. 作用域泄露var 没有块级作用域,会泄露到函数甚至全局作用域。

    for (var i = 0; i < 3; i++) {}
    console.log(i); // 3,变量泄露 ❌
    
    for (let j = 0; j < 3; j++) {}
    console.log(j); // ReferenceError ✅ 作用域被严格限制
    

  2. 重复声明var 允许在同一作用域重复声明,容易意外覆盖;let 会报错。

    var status = "pending";
    var status = "done"; // 静默覆盖,难排查 ❌
    
    let status = "pending";
    let status = "done"; // SyntaxError: 已声明 ✅
    

  3. 变量提升与暂存死区var 会初始化为 undefinedlet 有暂时性死区,在声明前访问会直接抛错,更安全。

  4. 全局污染var 声明的变量会挂载到 window 对象上。

    var config = {};
    console.log(window.config); // {} ❌ 意外污染全局
    
    let version = "1.0";
    console.log(window.version); // undefined ✅
    

为什么 Java 开发特别强调这个?

Java 一直是严格的块级作用域 + 强类型 + 编译期检查var 的松散特性违背了 Java 的编程直觉,而 let/const 的设计理念和 Java 高度一致。


2. 字段操作规范

获取字段值

  • 主表字段WfForm.getFieldValue("field12345")
  • 明细表字段WfForm.getFieldValue("field12345_0")(_0 代表第一行)
  • ❌ 不要使用 jQuery("#field12345").val() 等原生 DOM 操作。 :WfForm.getFieldValue("field12345_0")(_0 代表第一行)
  • ❌ 不要使用 jQuery("#field12345").val() 等原生 DOM 操作。### 修改字段值
  • 通用修改WfForm.changeFieldValue("field12345", {value: "新值"})
  • 修改显示属性WfForm.changeFieldAttr("field12345", 1) (1只读/2可编辑/3必填/4隐藏)
  • ❌ 不要使用 jQuery("#field12345").val("新值"),会导致联动失效。

3. 异步与联动

字段值变化监听

使用 WfForm.bindFieldChangeEvent,不要使用 jQuery 的 .change().on('input')

// ✅ 正确做法
WfForm.bindFieldChangeEvent("field12345", function(obj, id, value){
    console.log("字段值变更为:", value);
});

// ❌ 错误做法
jQuery("#field12345").change(function(){
    // 在 E9 表单中可能不会触发或触发异常
});

联动修改自身字段

如果在事件监听中修改本字段的值,需要使用 setTimeout 延时,避免死循环或栈溢出。

WfForm.bindFieldChangeEvent("field12345", function(obj, id, value){
    window.setTimeout(function(){
        WfForm.changeFieldValue("field12345", {value: "处理后的值"});
    }, 10);
});


4. ecode 模块规范

引入库

ecode 环境下,常用库已全局存在,不需要写 import

// ❌ 不需要
import React from "react";
import { Button } from "antd";

// ✅ 直接解构
const { Button } = antd;
const { toJS } = mobx;

导出模块

使用 ecodeSDK 进行导出和导入:

// 导出组件
ecodeSDK.setCom('${appId}', 'MyComponent', MyComponent);

// 在同一个项目内导入
const MyComp = ecodeSDK.imp('MyComponent');