cherry-tomato
基于面向对象的设计理念,主要专注于在前端领域里,抽象数据模型和业务逻辑。让逻辑和视图解耦,提高项目代码的可复用性。
cherry-tomato
基于 typescript
开发,是纯粹的 js
代码。
npm install --save @cherry-tomato/core
-
核心API
-
Model模型 基础
Model
类 -
Collection集合 基础
Collection
类,是多个Model
的集合(类似数组) -
attribute属性装饰器 事件订阅基类,
Model
事件基于此 -
connect关联模型装饰器 自动关联2个
Model
的装饰器 - 自定义event事件 自定义event事件
-
Model模型 基础
- Usage with react
基础模型类。最基础也是重要的,一般需要配合 attribute 装饰器使用
import {
Model,
attribute
} from '@cherry-tomato/core';
class CustomModel extends Model {
@attribute()
accessor text = 'a'; // 设置默认值为a
}
const custom = new CustomModel();
custom.text === 'a';
-
[attributes]
初始化属性
const custom = new CustomModel({ text: 'b' });
custom.text === 'b';
-
get(key)
获取属性,设置过的属性可以被通过attribute装饰过的属性直接获取 -
set(key, value)
设置属性 -
reset(value)
重设所有属性 -
remove(key)
删除对应属性
使用例子如下
custom.set('text', 'c');
custom.text === 'c';
custom.get('text') === 'c';
- [initialAttributes] {Function} - 将会把返回值作为初始化的属性。现在更推荐使用
class fields
的方式设置默认值 - key - key生成函数,默认无需设置,会自动生成
model设置了2个生命周期,同时会抛出同名的Event
- modelWillUpdate {Function([prevAttribute, nextAttribute])} - 调用了
set
, 但还没有执行set
操作时,此时this.get(attributeName) === prevAttributes.get(attributeName)
- modelDidUpdate {Function([prevAttribute, nextAttribute])} - 调用了
set
,set
执行成功, 此时this.get(attributeName) === nextAttributes.get(attributeName)
继承自Model, 扩充对数组类型的支持。会更具static Model
的静态属性自动转换children对对应的对象实例
import {
Collection
} from '@cherry-tomato/core';
class CustomCollection extends Collection<CustomModel> {
static Model = CustomModel;
// hook: before update children (includes remove, add)
collectionWillUpdateChildren () {}
// hook: after update children (includes remove, add)
collectionDidUpdateChildren () {}
}
const customCollection = new CustomCollection();
customCollection.resetChildren(
[
{
text: 'a'
},
{
text: 'b'
}
]
);
customCollection.children[0] instanceof CustomModel;
customCollection.children[0].text === 'a';
customCollection.children[1].text === 'b';
-
[initialAttributes]
同Model
的initialAttributes
-
Model
- 用于自动生成子元素的构造函数 - 其他继承于 Model
-
Model
所有函数 - 可以使用
Array
的各种方法 已支持forEach
,map
,reduce
,reduceRight
,slice
,filter
,find
,findIndex
,some
,every
,includes
,indexOf
特别注意:filter、slice、concat 返回的是一个collection实力customCollection.forEach((custom) => { console.log(custom.text) }) // 'a' // 'b'
-
addChild
- 添加一个子元素到最后,并添加监听,会自动使用设置的Static Model
去创建- @params item {Object} - 子元素属性内容
-
removeChild
- 移除一个子元素,并取消监听,会自动使用设置的Static Model
去创建- @params item {Model} - 子元素实例
-
resetChildren
- 重设所有子元素,并添加监听,会自动使用设置的Static Model
去创建- @params items {Array} - 子元素数据数组
-
merge
效果同 concat,同时会修改自身
-
Model
的所有hooks - collectionWillUpdateChildren {Function([prevChildren: Array, nextChildren: Array])} - 添加/删除子元素之前后触发
- collectionDidUpdateChildren {Function([prevChildren: Array, nextChildren: Array])} - 添加/删除子元素后触发
- collectionChildDidUpdate - 任一子元素发生
modelDidUpdate
,collectionDidUpdateChildren
,collectionDidUpdateChildren
事件后触发
参考Model就可以了
高级用法,关联不同的实例
import {
Model,
connect,
attribute
} from '@cherry-tomato/core';
class ModelA extends Model {
@attribute()
accessor text = 'a';
}
class ModelB extends Model {
@connect()
a = new ModelA();
}
const b = new ModelB({
a: {
text: 'aa'
}
});
b.a instanceof ModelA;
b.a.text === 'aa';
待补充