amis/docs/renderers/Tpl.md

135 lines
7.1 KiB
Markdown
Raw Normal View History

2019-06-04 20:13:40 +08:00
## Tpl
2019-05-08 22:55:41 +08:00
tpl 类型的渲染器支持用 JS 模板引擎来组织输出,采用的 lodash 的 [template](https://lodash.com/docs/4.15.0#template),关于语法部分,请前往 lodash 文档页面。
```schema:height="200"
{
"data": {
2019-07-03 17:41:28 +08:00
"user": "no one",
"items": [
"A",
"B",
"C"
]
2019-05-08 22:55:41 +08:00
},
2019-07-03 17:41:28 +08:00
"body": [
{
"type": "tpl",
"tpl": "User: <%= data.user%>"
},
{
"type": "tpl",
"inline": false,
"tpl": "<% if (data.items && data.items.length) { %>Array: <% data.items.forEach(function(item) { %> <span class='label label-default'><%= item %></span> <% }); %><% } %>"
}
]
2019-05-08 22:55:41 +08:00
}
```
2019-07-03 17:41:28 +08:00
仔细看示例不难发现,语法跟 ejs 很像,`<% 这里面是 js 语句 %>`,所以只要会写 js做页面渲染没有什么问题。另外以下是一些可用 js 方法。
2019-05-08 22:55:41 +08:00
2020-02-27 19:57:30 +08:00
- `formatDate(value, format='LLL', inputFormat='')` 格式化时间格式,关于 format 请前往 [moment](http://momentjs.com/) 文档页面。
- `formatTimeStamp(value, format='LLL')` 格式化时间戳为字符串。
- `formatNumber(number)` 格式化数字格式,加上千分位。
- `countDown(value)` 倒计时,显示离指定时间还剩下多少天,只支持时间戳。
- 下面 filters 中的方法也可以使用如: `<%= date(data.xxx, 'YYYY-MM-DD')%>`
- 可以联系我们添加更多公用方法。
2019-05-08 22:55:41 +08:00
如:
```json
{
2020-02-27 19:57:30 +08:00
"data": {
"user": "no one"
},
"body": {
"type": "tpl",
"tpl": "User: <%= formatDate(data.time, 'YYYY-MM-DD') %>"
}
2019-05-08 22:55:41 +08:00
}
```
2019-07-15 23:42:22 +08:00
如果只想简单取下变量,可以用 `$xxx` 或者 `${xxx}`。同时如果不指定渲染器类型,默认就是 `tpl`, 所以以上示例可以简化为。
2019-05-08 22:55:41 +08:00
> 取值支持多级,如果层级比较深可以用 `.` 来分割如: `${xx.xxx.xx}`
> 另外 `$&` 表示直接获取当前的 `data`。
```schema:height="200"
{
"data": {
"user": "no one"
},
"body": "User: $user"
}
```
2019-07-15 23:42:22 +08:00
`注意:$xxx 与 <%= data.xxx %> 这两种语法不能同时使用,只有一种有效,所以不要交叉使用。`
2020-02-27 19:57:30 +08:00
通过 `$xxx` 取到的值,默认是会做 html 转义的,也就是说 `$xxx` 完全等价于 `${xxx | html}`, 如果你想什么都不做,那么请这么写 `${xxx | raw}`
2019-05-08 22:55:41 +08:00
从上面的语法可以看出来,取值时是支持指定 filter 的,那么有哪些 filter 呢?
2020-02-27 19:57:30 +08:00
- `html` 转义 html 如:`${xxx|html}`。
2020-04-24 10:00:25 +08:00
- `json` json stringify。将目标变量转成 json 字符串。
- `toJson` 反过来处理,如果目标字段是字符串,尝试把它解析成 js 数据。
2020-02-27 19:57:30 +08:00
- `raw` 表示不转换, 原样输出。
- `date` 做日期转换如: `${xxx | date:YYYY-MM-DD}`
- `number` 自动给数字加千分位。`${xxx | number}` `9999` => `9,999`
- `trim` 把前后多余的空格去掉。
- `percent` 格式化成百分比。`${xxx | percent}` `0.8232343` => `82.32%`
- `round` 四舍五入取整。
- `truncate` 切除, 当超出 200 个字符时,后面的部分直接显示 ...。 `${desc | truncate:500:...}`
- `url_encode` 做 url encode 转换。
- `url_decode` 做 url decode 转换。
- `default` 当值为空时,显示其他值代替。 `${xxx | default:-}` 当为空时显示 `-`
- `join` 当值是 array 时,可以把内容连起来。\${xxx | join:,}
- `first` 获取数组的第一个成员。
- `last` 获取数组的最后一个成员。
- `pick` 如果是对象则从当前值中再次查找值如: `${xxx|pick:yyy}` 等价于 `${xxx.yyy}`。如果是数组,则做 map 操作,操作完后还是数组,不过成员已经变成了你选择的东西。如: `${xxx|pick:bbb}` 如果 xxx 的值为 `[{aaa: 1, bbb: 2}]` 经过处理后就是 `[2]`。更复杂的用法: `${xxx|pick:a~aaa,b~bbb}` 经过处理就是 `[{a:1, b: 2}]`
- `split` 可以将字符传通过分隔符分离成数组,默认分隔符为 `,` 如: `${ids|split|last}` 即取一段用逗号分割的数值中的最后一个。
2020-03-25 19:20:34 +08:00
- `nth` 取数组中的第 n 个成员。如:`${ids|split|nth:0}` 是取第一个成员
2020-02-27 19:57:30 +08:00
- `str2date` 请参考 [date](./Date.md) 中日期默认值的设置格式。
- `duration` 格式化成时间端如:`2` -=> `2秒` `67` => `1分7秒` `1111111` => `13天21时39分31秒`
- `asArray` 将数据包成数组如: `a` => `[a]`
- `lowerCase` 转小写
- `upperCase` 转大写
- `base64Encode` base64 转码
- `base64Decode` base64 解码
2020-03-10 17:26:17 +08:00
- `isTrue` 类三元过滤器,用法:`${xxx|isTrue:'foo':bar}`,如果`xxx`变量为真,则返回字符串`'foo'`,否则返回当前数据作用域中的变量`bar`值。
2020-03-10 22:45:13 +08:00
- `isFalse` 判断逻辑与`isTrue`相反。
2020-04-02 17:37:26 +08:00
- `isMatch` 类三元过滤器,用法:
- 匹配字符串,第一个参数加引号:用法:`${xxx|isMatch:'somestring':'foo':bar}`,如果变量模糊匹配字符`'somestring'`,则返回字符串`'foo'`,否则返回当前数据作用域中的变量`bar`值。
- 匹配变量,第一个参数不加引号:用法:`${xxx|isMatch:variable:'foo':bar}`,如果`xxx`变量模糊匹配`variable`变量的值,则返回字符串`'foo'`,否则返回当前数据作用域中的变量`bar`值。
2020-03-10 22:45:13 +08:00
- `notMatch` 判断逻辑与`isMatch`相反。
2020-04-02 17:37:26 +08:00
- `isEquals` 类三元过滤器,用法:
- 对比字符串,第一个参数加引号:`${xxx|isEquals:'somestring':'foo':bar}`,如果变量等于字符串`'somestring'`,则返回字符串`'foo'`,否则返回当前数据作用域中的变量`bar`值。
- 对比变量,第一个参数不加引号:`${xxx|isEquals:variable:'foo':bar}`,如果变量等于`variable`变量的值,则返回字符串`'foo'`,否则返回当前数据作用域中的变量`bar`值。
2020-03-10 22:45:13 +08:00
- `notEquals` 判断逻辑与`isEquals`相反。
2020-02-27 19:57:30 +08:00
- `filter` 过滤数组,操作对象为数组,当目标对象不是数组时将无效。使用语法 \${xxx | filter: 参与过滤的字段集合:指令:取值变量名}。
比如: `${xxx|filter:readonly:isTrue}` 将 xxx 数组中 readonly 为 true 的成员提取出来。
再来个栗子:`${xxx|filter:a,b:match:keywords}` 将 xxx 数组中成员变量 a 或者 b 的值与环境中 keywords 的值相匹配的提取出来。如果不需要取变量,也可以写固定值如:`${xxx|filter:a,b:match:'123'}`
指令类型:
- `isTrue` 目标值为真通过筛选。
- `isFalse` 目标值为假时通过筛选。
- `match` 模糊匹配后面的参数。`${xxx|filter:a,b:match:keywords}` 表示 xxx 里面的成员,如果字段 a 或者 字段 b 模糊匹配 keywords 变量的值,则通过筛选。
2020-02-27 20:24:57 +08:00
- `equals` 相对于模糊匹配,这个就相对精确匹配了,用法跟 `match` 一样。
2019-05-08 22:55:41 +08:00
组合使用。
2020-02-27 19:57:30 +08:00
- `${&|json|html}` 把当前可用的数据全部打印出来。`$&` 取当前值json 做 json stringify然后 html 转义。
- `${rows|first|pick:id}` 把 rows 中的第一条数据中的 id 取到。
- `${rows|pick:id|join:,}`
2019-07-15 23:42:22 +08:00
没有找到合适的?可以自定义 filter。如果是 AMIS 平台用户,可以将以下代码加入到自定义组件中,如果不是请想办法插入以下代码。
```js
import {registerFilter} from 'amis';
2020-02-27 20:24:35 +08:00
registerFilter('myfilter', (input: string) => `${input}Boom`);
2019-07-15 23:42:22 +08:00
```
2020-02-27 20:24:35 +08:00
加入成功后就可以这样使用了 `${xxx | myfilter}`。 如果 `xxx` 的值是 `abc` 那么输出将会是 `abcBoom`