墨舟的AI笔记头像
动态表单架构笔记:纯规则、异步报价与草稿各守一层封面图

动态表单架构笔记:纯规则、异步报价与草稿各守一层

动态表单的规则与状态

动态表单常把三类逻辑搅在一起:本地能确定的计算、需要远程确认的结果、为了恢复而保存的草稿。一个字段变化后同时触发三条链路,如果没有边界,就会出现旧报价覆盖新值、草稿复活失效字段、校验状态冒充提交成功。

可以先把本地规则整理成纯函数,再给异步结果加修订号,最后只持久化允许恢复的数据。它们共享字段身份,却不应该共享一个含糊的 valid 布尔值。

规则计算先有顺序

下面把数量、单价、教学折扣与应付金额分开。依赖顺序是受控定义,不接受任意表达式。变化的字段只触发其可达的派生节点,返回实际访问过的节点供检查。

本地规则与异步、持久化的分层

import assert from 'node:assert/strict';
const nodes=[
 {id:'subtotal',deps:['quantity','priceCents'],run:v=>v.quantity*v.priceCents},
 {id:'discount',deps:['subtotal'],run:v=>v.subtotal>=30000?3000:0},
 {id:'payable',deps:['subtotal','discount'],run:v=>v.subtotal-v.discount}
];
function update(previous,patch){
  if(!Object.keys(patch).every(k=>['quantity','priceCents','note'].includes(k))) throw new Error('field');
  const values={...previous,...patch};
  if(!Number.isInteger(values.quantity)||values.quantity<1||values.quantity>99||
     !Number.isSafeInteger(values.priceCents)||values.priceCents<0||values.priceCents>100000000)
    throw new Error('input range');
  const changed=new Set(Object.keys(patch)),visited=[];
  for(const n of nodes){
    if(n.deps.some(id=>changed.has(id))){
      values[n.id]=n.run(values);changed.add(n.id);visited.push(n.id);
    }
  }
  return {values,visited};
}
const first=update({quantity:1,priceCents:10000,note:''},{quantity:3});
assert.equal(first.values.payable,27000);
assert.deepEqual(first.visited,['subtotal','discount','payable']);
const note=update(first.values,{note:'门口联系'});
assert.deepEqual(note.visited,[]);assert.equal(note.values.payable,27000);
assert.throws(()=>update(first.values,{script:'bad'}),/field/);
console.log('local dependency order and isolated note checks passed');

顺序在这里写死,生产 DSL 则需要构图、检查未知依赖与环,再生成拓扑顺序。代码不宣称普适的自动依赖追踪。初始状态也要从完整有效输入计算一次,不能带着缺失的派生值直接提交。

异步结果不能混进纯规则

远程报价应单独标记加载、成功、失败与过期。用户继续修改时,旧结果失效;提交要求当前字段修订与报价修订一致。取消网络是节省资源的尝试,拒绝迟到回写才是维持正确性的底线。

2026 年 9 月 25 日更新的 WebMCP 声明式 API 说明展示了让表单具备明确工具语义的方向。无论是否使用这种能力,表单仍应对人可读,提交条件也不能只存在于模型提示里。

草稿只保存可恢复的部分

字段值、Schema 版本和修订号可以进入草稿;远程校验“通过”通常需要重新确认,不能永久持久化成资格。身份令牌、密码与敏感验证信息也不应随手放入本地恢复对象。

离线测试只覆盖这组教学规则,不含真实表单、浏览器输入法、远程服务、数据库或交易。把三层边界画清楚,是为了让失败能被定位,并不是一份“零故障”保证。

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/2301_77785315/article/details/169552153

文章来源转载

评论

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--