Closed StringKe closed 1 year ago
不是很理解你的问题,能说描述详细一些吗?最好有截图。 场景: 如果你想在右侧面板输入文本,让文本作为子元素。同时又希望某些情况下作为一个可以被拖拽的容器,类似这样:
只需要给组件本身添加,一些 key即可,只要组件不接受 children,组件就不能被拖元素到内部,但是内部可以同过 props 使用其他的 key 作为 children.
一个组件可以被拖入 children 的前提是组件配置了 isContainer, 同时 组件支持读取外部传入的 children
右侧这个开启容器,是通过什么控制的呢?
我想要的就是这样的功能。
组件接收一个 isContainer 的 props, 如果为 true 就将 props 传入的 children
丢弃掉,使用 props 中的 text 字段,反之依然
props: { isContainer: boolean, text: string }
那这个组件的 metadata 需要永远标记成 isContianer 为 true ? 不是通过 isContianer 这个来控制组件是否允许被拽拖进元素么?
你可以理解为,metadata 中的一定要为true,这样engine 才会提供拖拽的方式去生成children,但是生成的children内容,你组件内部可以不使用,相当于组件本身可以间接的控制拖入的内容
你说的方案我明白,但存在组件依旧可以被拽拖进去,会多出冗余的数据的问题。
目前较好的方式可能是同一个组件,导出两个名字一个标记 isContainer 一个不进行标记。
数据冗余可以通过model包提供的方法遍历节点做数据清理,这个之前有计划提供,现在生成的数据有的是开发中才需要的冗余字段,后面会提供清理方法。
为啥你不把text也作为一个组件呢?
我可以将 text 作为一个组件传递,但这个组件会被允许继续通过拽拖的方式新增更多的内容。
那其实是一个text组件和其他组件并排就好了,不是一定要嵌套到text内部
并排也是被允许添加,TextButton 就是不允许添加子元素,里面只能是文本。
其实这个更应该是这么个需求,针对同一个组件可以支持多份 metadata 定义。
可以通过自定义setter 实现,自定义 setter 内可以修改节点的信息,然后在判断拖拽的时候读取node 的 meta 和 物料的 meta 做合并,节点的 meta 优先级高,应该就可以实现你想要的功能。
0.0.12 已经支持
TestSetter: (props: any) => {
useEffect(() => {
console.log(props);
const currentNode = props.setterContext.pluginCtx.engine.getActiveNode();
currentNode.value.configure.isContainer = false;
currentNode.value.children = [];
currentNode.updateValue();
console.log('🚀 ~ file: index.tsx:200 ~ pluginManager.customPlugin ~ currentNode:', currentNode);
}, []);
return <div>123</div>;
},
};
我同步了新的代码,在我本地运行 engine 的时候左侧大纲树好像有影响到
已经找到原因,需要重新 build ,dev 模式依赖的其他包不会使用 source 更新。
Button 的 children 可以是 text 也可以是拽拖进来的 组件。