contructor方法
- 入参:接受
config和额外的options和payload参数,不过options和payload参数当前没有用。 - 将传入的传入的
config参数保存到__DSL中,调用init方法 - 核心代码
init方法
核心流程
- 将
__DSL中的数据结构出来,包括models模型机layers图层states状态frames片段 - 执行
reduceToViewMap方法 处理layers图层 - 执行
reduceToHookMap方法处理models模型机 - 执行
reduceFrameToNode方法处理frames,并且传入 处理后的layers__layerVos - 将state处理成
stateVos - 使用pinia初始化
store仓库 调用state方法,处理状态机(调用hook更新state状态)
reduceToViewMap方法
参数:
layers- 核心功能:将数组类型的layers转换成 map类型的layers
入参
layers: [{key: "LayerReady",view: LayerOne,data: {message: "layer one",},},{key: "LayerLoading",view: LayerLoad,data: {message: "layer loading",list: async (ctx: any) => {return await ctx.model("feed").get("list");},},},{key: "LayerTwo",view: LayerTwo,data: {message: "layer two",},},],
输入结果:
this.__layerVos = {LayerReady: {view: LayerOne,data: {message: "layer one",},},LayerLoading: {view: LayerLoad,data: {message: "layer loading",list: async (ctx: any) => {return await ctx.model("feed").get("list");},},},LayerTwo: {view: LayerTwo,data: {message: "layer two",},}}
reduceToHookMap方法
- 和
reduceToViewMap方法类似 - 作用:将数组格式的
models转换成 对象形式的models
输入
models: [{key: "user",hook: new UserModel(),},],
输出
this.__modelVos = {user: new UserModel()}
reduceFrameToNode方法
将frams和layers结合,处理成更容易渲染的数据结构
输入:
frames: [{// 第一部分key: "head",blocks: [{// 状态 映射state: "root",stateMaps: [{value: "READY",layer: "LayerReady",},{value: "LOADING",layer: "LayerLoading",},],},],},{// 第二部分key: "foot",blocks: [{// 状态 映射state: "foot",stateMaps: [{value: "READY",layer: "LayerTwo",},],},],},],this.__layerVos = {LayerReady: {view: LayerOne,data: {message: "layer one",},},LayerLoading: {view: LayerLoad,data: {message: "layer loading",list: async (ctx: any) => {return await ctx.model("feed").get("list");},},},LayerTwo: {view: LayerTwo,data: {message: "layer two",},}}
输出
this.__nodes = [{state: 'root',stateMaps: {LOADING: {view: LayerLoad,data: {message: "layer loading",list: async (ctx: any) => {return await ctx.model("feed").get("list");},},path: "0/root/LOADING"},READY: {view: LayerOne,data: {message: "layer one",},path: "0/root/READY"}}},{state: 'foot',stateMapVos: {READY: {view: LayerTwo,data: {message: "layer two",},path: "1/foot/READY"}}}]
这么做的优点:将所有的frames和图层结合到一起,得到了frams中需要渲染的所有图层以及数据。接下来就需要处理如何渲染这些frames。
stateVos处理
将传入的state进行处理
输入
states: [{key: "root",value: "LOADING",hook: async (ctx: any) => {await wait(500);return "READY";},},{key: "foot",value: "",hook: async (ctx: any) => {return "READY";},},],
输出
const stateVos = {foot: '' || 'Default',root: 'LOADING'}
问题: hook貌似丢了,不过在状态机处理中(state方法)中调用了hooks
store处理
基于pinia定义了一个machine的store,保存了 stateVos 和 dataVos以及更新时间。提供了更新的actions
问题:多个组件,多次实例化store的话,id是不是可能会冲突
状态机处理
在init方法最后调用了 state方法
state方法的逻辑
- 遍历config中传入的state数组
- 如果state中有hooks,执行hooks用于修改状态,并且注入了ctx,通过ctx可以获取到model,可以调用model中的属性和方法,
- 获取到数据之后,更新到store中。
理解;将来可以在state的hooks中可以写如下的代码
{key: "root",value: "LOADING",hook: async (ctx: any) => {await wait(500);// 类似const res = await ctx.model('user').login()return "READY";},},
问题: 返回值是用于控制组件的渲染还是说用于图层内部的渲染
update方法
invoke方法
暂时没有实现
