您的位置:首页 > 财经 > 产业 > amis做工具库 - Evalutor的使用 (字符串变量解析)

amis做工具库 - Evalutor的使用 (字符串变量解析)

2025/4/1 3:13:19 来源:https://blog.csdn.net/qq_42152032/article/details/140066331  浏览:    关键词:amis做工具库 - Evalutor的使用 (字符串变量解析)

const { isEffectiveApi, parse, Evaluator } = amisRequire("amis");

// console.log(window.amisRequire); //amisRequire是sdk方式引入挂载到window到。里面还有一些window document赋值,需要在浏览器环境下执行。 node端执行会报错,只能npm install单独使用

const {Evaluator, parse}= require("amis-formula");  //node端单独使用amis-formula

console.log( Evaluator, parse);

字符串变量解析:
1-1.new Function + with 原生实现。字符串支持单引号和双引号,仅对字符串类型进行解析处理。

传入字符串格式的number object array会根据data自动解析变量并转为对应类型。若返回字符串必须包个冒号: "'aaa’",不然会当作变量来解析报错。   

如下:

   let constant = "node.title"; //或者"this.node.title"const data = { node: { title: 'xxx' } }const func = (constant, data) => {try{  if(constant && typeof constant === 'string') {constant = (new Function('data',`with(data){ return ${constant} }`).bind(data))(data); // '"aa"'、'[]'、'{}'等new Function处理 = > 'aa' [] {}}return constant;}catch(e){console.warn(e, constant);return null;}}console.log(func(constant, data));//输出xxx

(amis的formula组件执行函数evalJS底层就是new Function实现的)

1-2.还可以用amis的Evalutor做parse解析(evalMode: true),效果与new Function一样。

将字符串格式的number object array自动转为对应类型。若返回字符串必须包个冒号: "'aaa'".   这样的纯字符串"node.title",会当做对象解析.

如下:

const { parse, Evaluator} = amisRequire("amis");
let path = "node.title"
let data = { node: { title: "xxx" } }const ast = parse(path, {evalMode: true,allowFilter: true});const ret = new Evaluator(data).evalute(ast);
console.log(ret); // 输出结果为 'xxx'

2.amis的Evalutor(evalMode: false)  

好处是可以使用amis中提供的各种filter和函数进行处理。

ps:也可以直接用resolveMapping(path, data); 函数即可(内部是Evalutor(evalMode: false))

如下:

const { parse, Evaluator, resolveMapping } =   amisRequire("amis");
let path = "${node.title | json}"
let data = { node: { title: "xxx" } }
const defaultFilter = '| raw';const ast = parse(path, {evalMode: false,allowFilter: true});const ret = new Evaluator(data, {defaultFilter}).evalute(ast);
console.log(ret); //输出结果为"xxx"

const ret1= resolveMapping(path, data);
Console.log(ret1);//输出结果为"xxx"

只解析${},如:${ [] }、${ {key:'value'} }、${node.title}

表达式内可以使用amis的函数,且可获取window、ls、ss、cookie的数据${cookie: 'admin-token'}

额外: JSON.parse() 仅支持JSON格式 字符串必须为双引号。 不符合json格式报错。 也可以实现类型转换。     

传入字符串格式的number object array自动解析为对应类型。若返回字符串必须用双引号包一层:JSON.parse("\"aaa\"")

        try{ if(constant && typeof constant === 'string') constant = JSON.parse(constant); 
return constant;}catch(e){console.warn(e, constant);return null;}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com