页面可视化
大量同质化代码的处理
页面的基础信息统一放在
store中去处理
const initialState = {
cur: '', //当前选中组件的guid
total: 0, //组件总数
count: 0, //组件已加载个数,用于判断初次加载是否完毕
componentPool: {
guid: '',
type: '',
// ...
flags: delete | add | update
}, //所有组件(包含容器组件)的组件实例,key为guid
error: {
guid: [], //错误组件的guid[]
message: [] //以及对应的错误信息
}
};
编辑器页面获取组件:
- 自上而下的进行数据包的分发
- 组件实例化,根据
rawContent将上次编辑的数据进行还原
前端编辑完成之后交付给后端需要两种数据结构:
rawContent: 原始的json结构--用于在编辑页面的数据快速恢复【JSON.parse(rawContent)】renderTreeContent: 面向ToC的数据页面--页面上经过计算完成的数据【convet(rawContent)】
编辑数据是否更新
- 校验
rawContent和上一次保存之后的数据是否发生了变化 - 页面复制的时候为每一个组件的
guid重新赋值 - 将组件的信息放在
localStorage中
数据保存
- 在页面编辑栏发生
更新/删除/添加/操作的时候对该组件增加flags - 在进行保存的时候直接保存对应的
store中的数据结构(此时需要移除flags为删除状态的操作) - **
撤销操作**:维护一个past数组,初始状态为[],以及预设中间状态preset,这次操作在组件实例化完成之后进行,preset为组件实例化之后的对象- 所有的组件操作都会触发一个
action,当触发action的时候去调用这个reducer - 每次新增或者更改的时候保存上一次页面状态,放入数组之中
- 此时维护的
past数组是当前页面上所有的未保存的状态 - 触发
undo的时候,preset状态更新为past[past.length - 1],同时增加回撤future数组
- 所有的组件操作都会触发一个
// init
case TYPES.TOOLS.UNDO:
const previous = past[past.length - 1];
const newPast = past.slice(0, past.length - 1);
return {
past: newPast,
present: previous,
future: [present, ...future]
};
case TYPES.TOOLS.REDO:
const next = future[0];
const newFuture = future.slice(1);
return {
past: [...past, present],
present: next,
future: newFuture
};
case TYPES.COMPONENT.COMPONENTS_INSTANTIATION_END: //加载完毕后开始计算redo undo
return {
past: [],
present: reducer(present, action),
future: []
}
default:
//将其他 action 委托给原始的 reducer 处理
const newPresent = reducer(present, action);
if (present === newPresent) {
return state;
}
return {
past: [...past, present],
present: newPresent,
future: []
};
组件原始数据结构
[
{
gid: '',
name: '',
ename: '',
props: {}
flags: {},
version: '',
position: '', //当前位置
},
{},
]