alibaba / lowcode-engine

An enterprise-class low-code technology stack with scale-out design / 一套面向扩展设计的企业级低代码技术体系
https://lowcode-engine.cn
MIT License
14.65k stars 2.55k forks source link

extraProps配置项setValue接收value有问题 #2810

Closed fanwww closed 9 months ago

fanwww commented 10 months ago

代码是复制lowcode-materials项目fusion-lowcode-materials中tab组件meta

可以拉这个仓库的代码试一下

https://gitee.com/superfan-fan/lowcode_bug.git

操作过程中会出现接收value和实际数据不一致的情况 9f2e979e-b2b4-4971-864e-66b23433d39f

image

        extraProps: {
          getValue(target: IPublicModelSettingField, value: any) {
            const map = target.node?.children?.map((child) => {
              const primaryKey = child.getPropValue('primaryKey')
                ? String(child.getPropValue('primaryKey'))
                : child.id;
              return {
                primaryKey,
                title: child.getPropValue('title'),
                closeable: child.getPropValue('closeable'),
                disabled: child.getPropValue('disabled'),
              };
            }) || [];
            console.log('map: ',map);

            return map;
          },
          setValue(target: IPublicModelSettingField, value: any) {
            const { node } = target;
            const map: Record<string, any> = {};
            if (!Array.isArray(value)) {
              value = [];
            }

            value.forEach((item: any) => {
              const tabitem = Object.assign({}, item);
              map[item.primaryKey] = tabitem;
            });
            console.log('触发set_value',value);
            console.log('触发set_map',map);
            node?.children?.mergeChildren(
              (child) => {
                const primaryKey = String(child.getPropValue('primaryKey'));
                if (Object.hasOwnProperty.call(map, primaryKey)) {
                  child.setPropValue('title', map[primaryKey].title);
                  child.setPropValue('closeable', map[primaryKey].closeable);
                  child.setPropValue('disabled', map[primaryKey].disabled);
                  delete map[primaryKey];
                  return false;
                }
                return true;
              },

              () => {
                const items = [];
                for (const primaryKey in map) {
                  if (Object.hasOwnProperty.call(map, primaryKey)) {
                    items.push({
                      componentName: 'Slot',
                      props: map[primaryKey],
                    });
                  }
                }
                return items;
              },
              (child1, child2) => {
                const a = value.findIndex(
                  (item: any) => String(item.primaryKey) === String(child1.getPropValue('primaryKey')),
                );
                const b = value.findIndex(
                  (item: any) => String(item.primaryKey) === String(child2.getPropValue('primaryKey')),
                );
                return a - b;
              },
            );
          },
        },

image

fanwww commented 10 months ago

把getValue中的target.node?.children?.map改为通过value操作,数据可以同步,暂时还没发现这么操作的副作用

liujuping commented 10 months ago

这部分主要是 meta 配置的问题。修改之后可能的副作用场景还得 @eternalsky 看看。

eternalsky commented 10 months ago

这个 issue 是为了讨论在 extraProps 里 setValue 的问题,还是为了解决 lowcode-materials 中的 bug?

fanwww commented 10 months ago

这个 issue 是为了讨论在 extraProps 里 setValue 的问题,还是为了解决 lowcode-materials 中的 bug?

是为了讨论 extraProps 里 setValue 的问题,setValue 的代码是从lowcode-materials里面复制过来的,使用时出现了数据接收不匹配的情况,getValue中接收target.node?.children的值在设计器配置数据时有问题,如我第一张gif图中所示的,原本是三条数据,当我在第一条数据的input框中修改数据后,三条数据变成了两条

Dogtiti commented 5 months ago

@fanwww 最后解决了吗

voiddiddvue commented 2 months ago

@fanwww 请问这个问题最后解决了嘛,我也遇到了这个问题,setValue接受的值非常诡异