# thinplus
**Repository Path**: juuen/thinplus
## Basic Information
- **Project Name**: thinplus
- **Description**: 轻量化、沉浸式、无约束、纯ES语法的WEB开发框架。
- **Primary Language**: JavaScript
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2023-09-06
- **Last Updated**: 2024-04-06
## Categories & Tags
**Categories**: Uncategorized
**Tags**: thin, thinjs, thinplus
## README
- [thinplus.js 使用手册](#thinplusjs-使用手册)
- [简介](#简介)
- [特性](#特性)
- [如何使用](#如何使用)
- [第一步:添加引用](#第一步添加引用)
- [第二步:编写代码](#第二步编写代码)
- [语法介绍](#语法介绍)
- [模板(template)](#模板template)
- [函数模板参数成员](#函数模板参数成员)
- [对象模板成员](#对象模板成员)
- [控制语句](#控制语句)
- [IF 语句](#if-语句)
- [SWITCH 语句](#switch-语句)
- [WHEN 语句](#when-语句)
- [数据渲染](#数据渲染)
- [数据源](#数据源)
- [数据漫游器](#数据漫游器)
- [数据双向绑定](#数据双向绑定)
- [SELECT 数据渲染](#select-数据渲染)
- [事件处理](#事件处理)
- [事件函数参数](#事件函数参数)
- [数据漫游器默认值及格式化](#数据漫游器默认值及格式化)
- [默认值](#默认值)
- [格式化](#格式化)
- [组合使用](#组合使用)
- [其他说明](#其他说明)
- [相关组件推荐](#相关组件推荐)
# thinplus.js 使用手册
## 简介
thinplus.js 是一个纯净的、轻量级、沉浸式前端框架。
设计灵感源于 thin.js ,thinplus 选择回归自然,采用标准 ES 代码编写,不依赖任何外部组件,不限制开发环境,提供一码到底的沉浸式开发体验。
## 特性
- 轻量化、纯净化
- 无运行环境依赖
- 无外部组件包依赖
- 沉浸式开发体验
- 数据垂直继承,随用随取
- 数据漫游器默认值
- 数据漫游器格式化
## 如何使用
### 第一步:添加引用
只需在 head 里添加 thinplus.js 的引用即可。
```html
```
### 第二步:编写代码
```javascript
```
## 语法介绍
### 模板(template)
thinplus 是基于模板进行动态渲染,模板是指将 HTML 元素结构抽象为 Javascript 对象的一种书写表达。
目前渲染模板有如下几种:
- **对象模板(object template)**
这是最常用模板(推荐),样例如下:
```javascript
HTMLElement.render({
div: "这是对象模板",
class: "css class",
id: "element id"
});
```
- **字符串模板(string template)**
这是文本模板,支持纯文本和 HTML 文本,样例如下:
```javascript
HTMLElement.render("这是字符串模板");
```
- **数组模板(array template)**
这是组合模板,由对象模板、字符串模板和函数模板构成。样例如下:
```javascript
HTMLElement.render([
{
div: "这是对象模板",
class: "css class",
id: "element id"
},
"这是字符串模板"
]);
```
- **函数模板(function template)**
这是自定义模板,支持匿名函数和自定义函数,样例如下:
```javascript
HTMLElement.render({
div: function (r) {
return r.data || "这是函数模板";
}
});
```
#### 函数模板参数成员
回调函数参数为对象,对象的成员结构如下:
| 成员 | 类型 | 说明 |
| :-------- | :---------- | :----------- |
| container | HTMLElement | 当前容器元素 |
| data | object | 渲染数据对象 |
#### 对象模板成员
| 成员 | 类型 | 说明 |
| :------ | :------------------ | :----------------------------------------------------------------------------------------------------- |
| id | string | HTML 元素 ID 属性(全局属性),不支持数据漫游器 |
| class | string | HTML 元素 class 属性(全局属性),不支持数据漫游器 |
| name | string | HTML 元素 name 属性(常用属性),不支持数据漫游器 |
| title | string | HTML 元素 title 属性(全局属性),不支持数据漫游器 |
| style | object | HTML 元素 style 属性 |
| a/a2 | object | 成员 a 为元素属性对象的简写,该对象可以设置 HTML 元素属性值,仅当元素为超链接 A 时候,使用 a2 替代 a。 |
| click | function | 点击事件处理函数 |
| event | object | 事件处理对象,使用对象结构设置 DOM 事件 |
| data | object/string | 设置模板渲染数据源,支持数据对象、数组、数据漫游器两、Axios 数据源 |
| bind | string | 双向数据绑定,设置数据绑定路径 |
| value | string | 设置数据控件默认值,如 select、input、textarea |
| options | string/array/object | 设置 select 元素选项值 |
## 控制语句
### IF 语句
根据条件真假来控制使用真/假模板,语法结构如下:
```javascript
{
if: 布尔表达式|条件函数,
then: 真模板,
else: 假模板
}
```
样例:
```javascript
HTMLElement.render({
div: {
if: function (r) {
return true;
},
then: { p: "真模板" },
else: { p: "假模板" }
}
});
```
### SWITCH 语句
根据条件值来匹配模板,语法结构如下:
```javascript
{
switch:条件,
case:{
条件:模板,
条件2:模板2,
default:默认模板
}
}
```
样例:
```javascript
HTMLElement.render({
div: {
switch: "条件",
case: {
条件: "模板",
条件2: "模板2",
default: "默认模板"
}
}
});
```
### WHEN 语句
根据条件判断是否渲染当前模板,语法结构如下:
```javascript
{
div:模板,
when:条件
}
```
样例:
```javascript
HTMLElement.render({
div: "这是WHEN语句模板",
when: function (r) {
return true;
}
});
```
## 数据渲染
### 数据源
在实际应用中渲染模板通常都带有数据源,这里的数据源是指对象模板渲染时候所要读取的业务数据对象,对象模板中使用 data 属性是用来设置当前模板及其子级渲染数据源。
数据源支持的形式包含:
- 对象
- 数组
- 数据漫游器
- Axios Promise 对象
样例:
```javascript
HTMLElement.render({
div: [{ h2: "[[title]]" }, { p: "[[month/max]]" }],
data: {
title: "最大的月份",
month: { max: "十二月", min: "一月" }
}
});
```
### 数据漫游器
数据漫游器是指访问数据源中具体字段所约定的一种标准化格式。
格式为:`[[datapath]]`,使用双中括号作为漫游器识别符号,`datapath` 是数据访问路径,使用斜杠`/`来区分数据层级关系。
当数据源为纯数值数组数据时候,数据漫游器访问方式为`[[.]]`,此时`datapath`为点号。
样例:
```javascript
HTMLElement.render({
div: [{ h2: "[[title]]" }, { p: "[[.]]", data: "[[months]]" }],
data: {
title: "含有31天的月份",
months: ["一月", "三月", "五月", "七月", "八月", "十月", "十二月"]
}
});
```
### 数据双向绑定
数据双向绑定主要应用于数据控件,如 select、input、textarea。采用 bind 属性来设置数据路径。
注意:bind 属性和 data 属性不能够设置在同一个对象模板上
样例:
```javascript
HTMLElement.render({
div: [
{ h2: "用户信息" },
{ p: { input: "name", a: { type: "text" }, bind: "name" } },
{ p: { input: "", name: "gender", a: { type: "text" }, bind: "gender" } },
{ p: { input: "", name: "remark", a: { type: "text" }, bind: "remark" } },
{
button: "保存",
click: function (e) {
console.log(e);
//保存数据
}
}
],
data: {
name: "李四",
gender: "男",
remark: "天苍苍野茫茫风吹草低现牛羊"
}
});
```
### SELECT 数据渲染
HTML 下拉列表元素 SELECT 可以通过 options 属性赋值进行下拉列表渲染,options 可以接受的值类型包括:函数、对象、字符串、数组、模板字符串。
样例如下:
```javascript
container.render({
div: [
function (r) {
console.log(r);
},
{
select: "",
options: "[[dlist]]"
},
{
select: "",
options: ["苹果", "梨子", "橘子"]
},
{
select: "",
options: { 男: "man", 女: "woman" }
},
{
select: "",
options: function (r) {
return ["苹果", "梨子", "橘子"];
}
},
{
select: "",
options: "苹果,梨子,橘子"
}
],
data
});
```
## 事件处理
通过添加事件监听器来实现对元素事件的处理。目前提供两种事件绑定方式:
- click 属性
结构为:{click : 回调函数}
- event 属性
结构为:{事件名 : 回调函数, ...}
样例:
```javascript
HTMLElement.render({
div: [
{
select: "",
name: "status",
options: ["已创建", "支付中", "已完成", "已取消"],
event: {
change: function (e) {
console.log(e);
},
click: function (e) {
console.log(e);
}
}
},
{
button: "保存",
click: function (e) {
console.log(e);
}
}
]
});
```
### 事件函数参数
**参数结构**
事件回调函数为对象,对象成员结构如下:
```javascript
{
sender:{事件源},
event:{事件},
type:{事件类型},
org_data:{原始数据源},
new_data:{最新数据源}
}
```
**参数说明**
| 名称 | 类型 | 描述 |
| :------- | :---------- | :--------- |
| sender | HTMLElement | 事件源 |
| event | object | 事件 |
| type | string | 事件类型 |
| org_data | object | 原始数据源 |
| new_data | object | 最新数据源 |
## 数据漫游器默认值及格式化
### 默认值
数据漫游器支持对可能的空值提供默认值,格式如下:
```javascript
[[字段名 == 默认值]];
```
### 格式化
- 货币格式化
使用方式为`[[字段名::货币代码]]`,如人民币:`[[price::CNY]]`
- 日期格式化
使用方式有两种:`[[字段名::date]]`和`[[字段名::datetime]]`
### 组合使用
格式化必须始终放在最后,样例如下:
`[[createtime==2000/01/01::date]]`
## name 属性赋值说明
```javascript
// 第一种方式
{
input: "name1";
}
// 第二种方式
{
input: "",name:"name2";
}
// 第三种方式
{
input: "",a:{name:"name3"};
}
```
第一种方式仅针对 select、input、textarea 元素,name 属性可以通过值的形式赋值给元素对象完成属性设置。但是这种形式优先级最低。
第二、第三种方式适合所有元素。
理论上赋值优先级:第三种 > 第二种 > 第一种。
## 其他说明
- HTML 元素对象模板第一个属性必须为 HTML 元素名称
- 对象模板中 data 属性和 bind 属性不能一起设置
- HTML 元素可以使用 HTMLElement.empty()方法清空所有内容包括子元素,支持链式调用,比如 HTMLElement.empty().render()
- 数组模板不支持嵌套数组模板
- 不支持 IE 浏览器,适用于现代浏览器。
## 相关组件推荐
- [thinbuilder](https://www.npmjs.com/package/thinbuilder)
- [thindb](https://www.npmjs.com/package/thindb)
- [axios](https://axios-http.com/zh/)