UNPKG

zero-mvc

Version:

zeromvc是一种mvc设计模式。主要意义在于分离视图代码、逻辑代码和数据处理代码。

228 lines (204 loc) 5.47 kB
# zeromvc zeromvc 是一种轻量级mvc设计模式。是一种设计思路。不是全是一个框架。 主要意义在于分离视图表现代码、逻辑控制代码和数据处理代码。 解决在软件和游戏开发过程中,随着项目体量和参与人数的增加维护难度越来越难大的问题。 # zeromvc 有以下特点 ·使用TypeScript开发。 ·仅仅只有两百多行代码。 ·包含链表和事件。 ·支持泛型,对已定义的事件进行智能提示。 ·事件支持异步调用。 ·说明比代码还要多。 # View 视图 用于视图表现代码, 可以对引用到的模型数据进行绑定。 当视图在显示状态时,被绑定模型数据产出变化时会响应视图同名方法。 可以定义指命和指命参数类型。 可以发出已定义过的指命。 不能修改模型不能调用模型方法。 # Control 控制器 用于逻辑控制代码。 可以接受来指定视图指命。 可以接受来指定控制器指命。 可以发出已定义过的指命。 引用模型并修改。 # Model 模型 用于数据处理代码。 数据可被多个控制器和视图访问。 数据可被多个控制器修改。 数据被修改后变产生修改记录并在下次反应(16毫秒)通知视图。 # 设计方案 继承View、Control、Model的每一个类的实例都理解为一个节点。 每一个模块或逻辑都由一个或多个节点构成。 Model类的实例都以单例模式存在一个Zeromvc实例中。 Control类需要实例化 View类可多实例化 数据响应以同名法(可加前缀)进行调用。遵循协议大于配置 。 使用延迟反应让多次数据修改只产生一次事件通知。 # 响应关系 模型没有依赖关系 事件没有依赖关系 视图依赖模型和命令 控制器依赖模型和命令 # 响应流 视图 -> command -> 控制器 控制器 -> call -> 模型 模型 -> binding -> 视图 # 代码组织顺序 想要代码写的行云流水 代码组织顺序就很关键了 这很考验你是否遵守了限制 (模型 和 命令) ->视图->控制器 # 安装 ``` yarn add zero-mvc ``` 或 ``` npm i zero-mvc ``` # 起步 ``` export class TestModel extends Model { MaxHp: number = 100 hp: number = 100 } export class TestView { view: View = new View() model = this.view.getModel(TestModel) constructor() { this.view.bind(this.model, this) this.view.show() this.view.emit("behurt", 5) } hp() { console.log(this.model.hp) } } export class TestControl extends Control { model = this.getModel(TestModel) constructor() { super() this.on("behurt", (value) => { console.log("TestView发生behurt事件,参数为" + value) this.model.hp -= value }) } } new Zeromvc() new TestControl() new TestView() ``` # 视图 视图用new的方法来新建 ``` export class TestView{ view:View=new View() constructor(){ this.view.show() } } ``` 发送命令 ``` this.view.emit("behurt", 5) ``` # 控制器 控制器使用类的继承 先要新建一个控制器类 ``` export class TestControl extends Control { constructor() { super() } } ``` # 模型 ``` export class TestModel extends Model { MaxHp: number = 100 hp: number = 100 } ``` # 启动使用框架 ``` new Zeromvc() ``` # MVC框架限制 视图和视图不能互相引用调用 控制器和控制器不能互相引用调用 模型和模型不能互相引用调用 视图不能调用修改模型 视图不能引用控制器 控制器不能直接操作视图 建议控制器修改模型时通过调用模形的方法 这些限制你可能需要多写一些代码。 限制出规则,规则出秩序。秩序就是我们想要的 # 应用在CocosCreator 多场景 我们选择在第一个场景中初始化mvc 将包类文index.ts拷贝到Script/lib/下改命为Zeromvc.ts 新建模块文件Main.ts ``` start() { new Zeromvc() new MainControl() } ``` MainUI.ts ``` const { ccclass, property } = cc._decorator; @ccclass export default class MainUI extends cc.Component { view: View=new View() start() { } btn() { this.view.emit("openBag") } protected onEnable(): void { this.view.show() } protected onDestroy(): void { this.view.hide() } } ``` BagUI.ts ``` const { ccclass, property } = cc._decorator; @ccclass export default class BagUI extends cc.Component { @property(cc.Label) label: cc.Label = null; view = new View() mainModel: MainModel protected onLoad(): void { this.mainModel = this.view.getModel(MainModel) this.view.bind(this.mainModel, this) this.view.bind(this.mainModel, { money:()=>{ this.label.string = this.mainModel.money.toString() } }) } start() { console.log("________start_________") } btn() { this.view.emit(new AddMoney(20)) } money() { this.label.string = this.mainModel.money.toString() } protected onEnable(): void { this.view.show() } protected onDestroy(): void { this.view.hide() } } ``` 需要两个场影分别挂两个脚本场景上 很多CocosCreator开发者更喜欢用单场景模式 # 应用在CocosCreator 单场景 等待更新 # 应用在CocosCreator+FairyGUI 等待更新