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方法
暂时没有实现