amis 自定义filter过滤器 和 valid校验规则

amis-core/src/utils/filter.ts里是内置的所有filter过滤器实现。比如:raw、url_encode等

相关介绍文档:https://aisuda.bce.baidu.com/amis/zh-CN/docs/concepts/data-mapping

amis-formula/src/evalutor.ts 里是内置的所有表达式中可用的逻辑函数的实现。 比如:CONCATENATE(fnCONCATENATE)、LOWER(fnLOWER)等

相关介绍文档:https://aisuda.bce.baidu.com/amis/zh-CN/docs/concepts/expression

一、自定义表单项valid校验规则:

比如定义一个customValid,可以写自定义逻辑校验。函数内可用参数:1.value为当前校验的表单项值,2.values为所有表单项值。

1.注册一个自定义校验规则

  amisLib.addRule(
    'customValid', //自定义函数校验  "customValid": "return value===values.password";  value为当前校验的表单项值,values为所有表单项值
    function (values, value, func) {
      let flag = new Function('values', 'value', func)(values, value);
      return flag || false;
    },
    `格式校验出错`
  );

2.用法如下:

{
"type": "input-number",
"label": "密码确认",
"name": "repeatPassword",
"validations": {
"customValid": "return value===values.password"; " //校验规则
},
"validationErrors": {
"customValid": "俩次输入的密码不匹配" //校验失败的提示信息
}
}

二、自定义filter过滤器:

filter 主要用于amis中表达式解析,可以提供自定义处理逻辑。

PS: amis表达式中还可以使用IF、ABS等逻辑函数来处理,但不支持自定义逻辑函数。

比如 定义一个doOptions 过滤器,将数组转为select Options结构

//转换options结构函数
function doOptions(arr, filter, extraParams){ 
  return _.map(filter !== undefined ? _.filter(arr, filter) : arr, (n) => {
    const result = {
      label:
        n["label"] ||
        n["title"] ||
        n["browseName"] ||
        n["displayName"],
      value: n["name"] || n["value"],
    };
    _.forEach(extraParams, extraParam => {
      result[extraParam] = n[extraParam];
    });
    return result;
  });

//注册amis自定义filter

  amisLib.registerFilter('doOptions', function (arr, filter, extraParams) {
    filter = resolveFilter(filter);
    extraParams = extraParams?.split(",");
    return doOptions(arr, filter, extraParams);
  });

2.使用时 在表达式中如下方式使用即可:

{
"type": "select",
"name": "target",
"label": "转换状态名称",
"source": "${topnode.children|doOptions }",
}

额外:

注册自定义filter时可以覆盖这些默认的filter过滤器,比如说 raw和html过滤器。处理方法如下:

  //html默认是用于input组件中label属性( "label": "${ddddd}")、tpl中tpl属性("tpl": "${xxxx}")等html元素属性。

  //raw默认用于api接口调用时的data属性(数据映射)"data":{"perPage": "${perPage}", "page": "${page}"} 和 responseData属性(返回结果映射) "responseData": { "rows": "${rows}" } 。

const amisLib = amisRequire('amis');
const _filters = {...amisLib.filters}; //amis内置的一些filter过滤器
//自定义amisFilter
function amisFilter() {
  ['raw', 'html'].forEach(funcName =>{ //覆盖raw和html测试 也可以Object.keys(_filters || {})全部覆盖,但没必要  
    amisLib.registerFilter(funcName, function(...params) { //接受参数
      //自定义逻辑添加
      const [input] = params;
      console.log(`覆盖默认 ${funcName}` , input);
      if(!input) return "自定义值解析失败"
      //解构params 并调用原始的amis过滤器,保证过滤器逻辑正常
      return  _filters[funcName](...params); 
    });
  })

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李庆政370

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值