低代码5之组件的层级(置顶展示)、选中删除、编辑与预览效果
- 拖拽后的组件在内容区域内,展示这些组件的层级( 谁顶层谁底层 )
- 需要添加按钮
- 在useCommand.js之中 添加命令
- 置顶 就是在未选中之中找到最大的zIndex值(maxZIndex),然后设置以选中的zIndex为 maxZIndex + 1
- 置底 就是未选中找到最小的zIndex值(minZIndex),然后判断这个值是否小于0,则设置为minZIndex为0,其未选中的zIndex则为minZIndex的绝对值 + 原本的值,然后选中的则为minZIndex
- 删除
- 删除-撤销 就是拿到当前的data下的最新的blocks值
- 删除-重做 就是拿focusData之中未被选中的值,因为以选中的被删除了
- 编辑与预览
- previewRef添加一个预览与编辑的flag,在useFocus.js之中去判断是否处于预览效果,若是为true则为预览效果则无法进行拖拽操作
src / package / editor.jsx
import {
computed, defineComponent, inject, ref } from "vue";
import "./editor.scss";
import EditorBlock from "./editor-block";
import deepcopy from "deepcopy";
import {
useMenuDragger } from "./useMenuDragger";
import {
useFocus } from "./useFocus";
import {
useBlockDragger } from "./useBlockDragger";
import {
useCommand } from "./useCommand";
import {
$dialog } from "@/components/Dailog";
export default defineComponent({
props: {
modelValue: {
type: Object,
},
},
emits: ["update:modelValue"],
setup(props, ctx) {
const previewRef = ref(true)
const data = computed({
get() {
return props.modelValue;
},
set(newValue) {
ctx.emit("update:modelValue", deepcopy(newValue));
},
});
const contentStyle = computed(() => ({
width: data.value.container.width + "px",
height: data.value.container.height + "px",
}));
const config = inject("config");
const containerRef = ref(null);
const {
dragstart, dragend } = useMenuDragger(containerRef, data);
const {
blockMousedown, containerMousedown, focusData,lastSelectBlock,clearBlockFocus } = useFocus(
data,previewRef,
(e) => {
mousedown(e, focusData);
}
);
const {
mousedown,markLine } = useBlockDragger(focusData,lastSelectBlock,data);
const {
commands} = useCommand(data,focusData)
const buttons = [
{
lable:'撤销',icon:'',handler:()=>commands.undo()},
{
lable:'重做',icon:'',handler:()=>commands.redo()},
{
lable:'导出',icon:'',handler:()=>{
$dialog({
title:'导出json使用',
content: JSON.stringify(data.value)
})
}},
{
lable:'导入',icon:'',handler:()=>{
$dialog({
title:'导入json使用',
content:'',
footer:true,
onComfirm:(text)=>{
commands.updateContainer( JSON.parse(text) )
}
})
}},
{
lable:'置顶',icon:'',handler:()=>commands.placeTop()},
{
lable:'置底',icon:'',handler:()=>commands.placeBottom()},
{
lable:'删除',icon:'',handler:()=>commands.delete()},
{
lable: ()=>previewRef.value ? '编辑' : '预览',icon:()=>previewRef.value ? '编辑icon' : '预览icon',
handler:()=> {
previewRef.value = !previewRef.value;
clearBlockFocus()
}
},
]
return () => (
<div class="editor">
<div