# ClassX
**Repository Path**: TinyClass/class-x
## Basic Information
- **Project Name**: ClassX
- **Description**: 支持继承和多态的前端状态管理器
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2022-08-09
- **Last Updated**: 2022-09-06
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# ClassX
> 面向对象的前端状态管理器,提供金融类、表单类等项目的前端数据解决方案
- 完全面向对象,支持继承与多态
- 支持 TypeScript
- 针对数组数据优化设计
- 简单,轻量化
- 千人一面,提供灵活的代码控制功能,保证不同基础的开发人员代码风格完全一致
- 提供模板复用功能,高效复用页面代码
- 面向低代码平台
- UI,逻辑,组件调用逻辑三部分完全分离。组件全生命周期 API 支持
| 包名 | 功能 |
| :-----| :---- |
| classx-state | 提供前端状态管理功能,实现UI与业务代码分离 ,提升代码可读性|
| | 通过类的继承与多态实现代码复用 |
| | 提供前端页面数据缓存功能(keepAlive) |
| | 提供前端异步处理功能 |
| | 提供前端跨组件异步通信功能 |
| | 提供数组数据排序,筛选等处理功能 |
| classx-form | 实现在状态管理器中维护表单数据,提供与表单UI双向绑定功能,提供表单数据校验,交互,获取等API |
| | 通过配置自动渲染表单,从此告别复杂的表单UI开发 |
| | 实现UI,业务逻辑,表单组件调用逻辑分离,提升代码可读性 |
| | 支持 class 或者 JSON 数据进行表单渲染,灵活适配业务场景 |
| | 代码控制,保证代码风格千人一面 |
| | 自动注册的组件化系统,实现对组件调用的全生命周期覆盖 |
| classx-antd-form | 提供基于Antd的classx-form表单接入方案 |
| classx-react | 提供基于react的classx-state接入方案,vue方案开发中 |
---
## 安装
```bash
yarn add CassX
# or with npm
npm install CassX
```
建议搭配 ClassX-Form 和 ClassX-React 使用:
```bash
npm install ClassX-Form ClassX-React
```
## 使用
### 状态管理器使用
你可以创建任意个 State,并且单独或者全局的使用它们
```tsx
import { ClassX } from "classx-state";
//提供一个state,对应的页面获取此state后将其实例化单独使用
export class State extends ClassX {
onCreate() {
setInterval(() => {
this.reset();
this.$updateView();
}, 1000);
}
secondsPassed = 0;
increase() {
this.secondsPassed += 1;
}
reset() {
this.secondsPassed = 0;
}
}
//提供一个全局使用的state
export const GlobalState = new State();
```
`connect` 提供一个高阶组件,将 state 数据浅拷贝后通过 props 注入到 UI 中。如果你希望用户返回某个页面依旧保持之前操作状态,connect 的 keepAlive 属性请传 true。
```tsx
function Page(props: any) {
return (
<>
>
);
}
export default connect("/demo", State, true)(Page);
```
异步处理:
```tsx
import { ClassX } from "classx-state";
export class UserState extends ClassX {
name;
password;
async login(from) {
let rst = await httpPost({
url: "/login",
data: { name: this.name, password: this.password, ...from },
});
}
}
function LoginPage(props: any) {
return (
<>
>
);
}
export default connect("/login", UserState)(LoginPage);
```
跨组件之间简单的异步通讯:
```tsx
import { ClassX } from "classx-state";
export class List extends ClassX {
async queryList(params){
let rst = await httpPost(params)
}
}
export class Filter extends ClassX {
get data(){
return {}
}
async click(){
await this.dispatch("ListUniqueName",this.data,"queryList")//dispatch为异步通信,在List组件加载前会一直保持pending状态
}
}
```
### 表单使用
你可以在 State 中创建任意个 表单
```tsx
import { ClassX } from 'classx-state';
import connect from 'classx-react';
import { setForm, setConfig, setRule } from 'classx-form';
import NForm from 'classx-antd-form';
import { Input } from 'antd';
export class State extends ClassX {
@setForm('loginForm') //注册一个名为'loginForm'的表单
@setConfig(function() {
return {
required: true, //必填
label: '用户名',
ele: 'Input', //全局注册的组件
props: { //组件对应的props
placeHolder: '请输入用户名',
},
};
})
name = 'newUser';
@setForm('loginForm')
@setConfig(function() {
return {
required: true, //必填
label: '密码',
ele: , //严格模式将只能够使用全局组件以加强对代码的控制
};
})
@setRule([
function() {
if (!v) {
throw new DBError('密码不能为空');
}
},
{ required: true },
])
@setPack(function(v){
return {password:Md5.encode(v)}
})
password;
async login(from) {
let rst = await httpPost({
url: '/login',
data: { this.config('loginForm').getAllNeedParams(), ...from },
});
}
}
```
在 UI 中绑定这个表单
```tsx
//绑定loginForm表单,对应的布局和UI会通过组件会自动生成
function Page(props: any) {
return (
);
}
export default connect("/login", State, false)(Page);
```
使用 JSON 渲染表单
```tsx
function Page(props) {
let form = Form.useForm()
let [config, setConfig] = useState()
useEffect(() => {
setTimeout(() => {
setConfig({
name: {
config: {
label: '用户名',
ele: 'Input'
}
},
password: {
config: {
label: '密码',
ele: 'Input'
}
}
})
}, 5000)
}, [])
let login = ()=>{
let rst = await httpPost({
url: '/login',
data: { props.config('loginForm').getAllNeedParams(), ...from },
});
}
return (
);
}
export default connect('/login', State, false)(Page);
```
文件名以`.component.tsx`结尾的组件会自动注册为全局组件。
```tsx
//Input.component.tsx
import React from "react";
import { Input as AInput } from "antd";
const Input = (props) => {
return ;
};
export { Input };
```
提供组件的全生命周期 API 支持,同一组件相关代码写在一起,维护轻而易举。
```tsx
@setForm('loginForm') //注册一个名为'loginForm'的表单
@reset()//清空所有配置,在继承时使用
@setConfig(()=>{//组件常规配置
return {
required: true, //必填
label: '用户名',
ele: 'Input', //全局注册的组件
props: { //组件对应的props
placeHolder: '请输入用户名',
},
};
})
@setRule([(v)=>{//async-validator功能已集成,完成测试后将推送到开源版本
if(v === 'admin'){
throw new DBError("非法用户名")
}
}])
@setInit(({userName})=>{//调用form.init(data)时将调用此方法给组件赋值,同时去除校验状态
return userName
})
@setPack(({userName})=>{//提交数据时将调用此方法对组件值进行处理
return {name:}
})
@setWatch(function(v){//监听用户输入
this.password=''//若需要this指向当前class示例,则不能使用箭头函数
})
@setHide(function(){//隐藏此组件
this.loginType === 'phone'//若需要this指向当前class示例,则不能使用箭头函数
})//隐藏
name = 'newUser';
```
### 高级使用
代码复用与控制:开发一套报表模板以复用 UI 和部分逻辑代码并达到代码控制的效果
```tsx
class InitState extends db {
// url
// dataSource
// title
async getList(p) {
if (this.config("form").checkAll()) {
let rst = await $Manager
.httpPost({
url: this.url,
data: { ...this._config("form").getAllNeedParams(), ...p },
})
.catch((error) => {
message.error(error.msg || "错误");
});
if (rst) {
if (Array.isArray(rst.data)) {
this.dataSource = rst.data;
} else {
Object.keys(rst.data).forEach((key) => {
if (Array.isArray(rst.data[key])) {
this.dataSource = rst.data[key];
}
});
}
this.$updateView();
}
return rst;
}
}
}
function Page(props) {
return (
{props.title}
);
}
export { InitState, Page };
```
使用模板。修饰器中的表单数据也支持继承和多态
```tsx
class MIndexPage extends IndexPage {
url = "/list";
title = "用户列表";
@setForm("form")
@setConfig(function() {
return {
label: "姓名",
ele: "Input",
};
})
name;
columns = [
{
title: "姓名",
align: "center",
dataIndex: "name",
},
{
title: "年龄",
align: "center",
dataIndex: "age",
},
];
}
export default connect("/list", MIndexPage)(Page);
```
状态管理器数组相关使用
```tsx
import { CassX } from "CassX";
//班级
class Class extends CassX {
name;
num;
fun() {
//指向父亲节点
this.$PARENT;
//指向根节点
this.$THIS;
}
}
//学校
class School extends CassX {
//可以添加任意属性,这些属性都可以在VIEW层通过props获取到
name;
location;
constructor() {
//给表新建一个对象
let mClass = new Class();
//将对象保存到库
this.save(mClass);
//删除这个对象
this.delete(mClass);
//返回一个数组,数组中数据可以直接在UI层使用
let list = this.selectFrom("Class").findAll(true);
//返回一个数组,数组中对象都是被实例化的Class,不可以直接在UI层使用
list = this.selectFrom("Class").findAll();
//排序
list = this.selectFrom("Class")
.orderBy("num", false)
.findAll();
//条件查找
list = this.selectFrom("Class")
.where('name == "一班"')
.orderBy("num", false)
.findAll();
//返回一个对象
let theFirst = this.selectFrom("Class").findFirst(true);
let theLast = this.selectFrom("Class").findLast(false);
}
}
```
## License
[MIT](http://opensource.org/licenses/MIT)
© 2022 GitHub, Inc.
Terms
Privacy
Security
Status
Docs
Contact GitHub
Pricing
API
Training
Blog
About