From 3d8b31f121159f5e02427da4b36c1026ee10ee9a Mon Sep 17 00:00:00 2001 From: "lihao.ylh" Date: Wed, 1 Dec 2021 16:30:28 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=A9=BA=E5=80=BC?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E7=BB=84/=E5=AF=B9=E8=B1=A1=E7=9A=84=20=5Fit?= =?UTF-8?q?ems=20=E4=B8=8D=E4=B8=BA=20null=20=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../designer/src/document/node/props/prop.ts | 7 ++++-- .../__snapshots__/document-model.test.ts.snap | 22 +++++++++++++++++++ .../tests/document/node/props/prop.test.ts | 16 ++++++++++---- 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/packages/designer/src/document/node/props/prop.ts b/packages/designer/src/document/node/props/prop.ts index a558aa70a..d06fbe231 100644 --- a/packages/designer/src/document/node/props/prop.ts +++ b/packages/designer/src/document/node/props/prop.ts @@ -381,10 +381,11 @@ export class Prop implements IPropParent { @computed private get items(): Prop[] | null { if (this._items) return this._items; return runInAction(() => { - let items: Prop[] | null = []; + let items: Prop[] | null = null; if (this._type === 'list') { const data = this._value; for (const item of data) { + items = items || []; items.push(new Prop(this, item)); } this._maps = null; @@ -394,6 +395,7 @@ export class Prop implements IPropParent { const keys = Object.keys(data); for (const key of keys) { const prop = new Prop(this, data[key], key); + items = items || []; items.push(prop); maps.set(key, prop); } @@ -526,7 +528,8 @@ export class Prop implements IPropParent { this.setValue([]); } const prop = new Prop(this, value); - this.items!.push(prop); + this._items = this._items || []; + this._items.push(prop); return prop; } diff --git a/packages/designer/tests/document/document-model/__snapshots__/document-model.test.ts.snap b/packages/designer/tests/document/document-model/__snapshots__/document-model.test.ts.snap index a12a521f6..f3f5d4a50 100644 --- a/packages/designer/tests/document/document-model/__snapshots__/document-model.test.ts.snap +++ b/packages/designer/tests/document/document-model/__snapshots__/document-model.test.ts.snap @@ -79,6 +79,7 @@ Object { "__slot__extraContent": false, "__slot__logo": false, "__slot__tab": false, + "__style__": Object {}, "action": "", "content": "", "crumb": "", @@ -94,6 +95,7 @@ Object { "condition": true, "id": "node_k1ow3cbf", "props": Object { + "__style__": Object {}, "behavior": "NORMAL", "content": Object { "en_US": "Title", @@ -142,6 +144,7 @@ Object { "isLocked": false, "props": Object { "__category__": "form", + "__style__": Object {}, "__useMediator": "value", "addonAfter": Object { "type": "i18n", @@ -219,6 +222,7 @@ Object { "isLocked": false, "props": Object { "__category__": "form", + "__style__": Object {}, "__useMediator": "value", "addonAfter": Object { "type": "i18n", @@ -292,6 +296,7 @@ Object { "isLocked": false, "props": Object { "__category__": "form", + "__style__": Object {}, "__useMediator": "value", "addonAfter": Object { "type": "i18n", @@ -364,6 +369,7 @@ Object { "id": "node_k1ow3cbx", "isLocked": false, "props": Object { + "__style__": Object {}, "colSpan": "", "fieldId": "column_k1p1bnjm", }, @@ -380,6 +386,7 @@ Object { "isLocked": false, "props": Object { "__category__": "form", + "__style__": Object {}, "__useMediator": "value", "addonAfter": Object { "type": "i18n", @@ -453,6 +460,7 @@ Object { "isLocked": false, "props": Object { "__category__": "form", + "__style__": Object {}, "__useMediator": "value", "autoWidth": true, "behavior": "NORMAL", @@ -545,6 +553,7 @@ Object { "id": "node_k1ow3cby", "isLocked": false, "props": Object { + "__style__": Object {}, "colSpan": "", "fieldId": "column_k1p1bnjn", }, @@ -558,6 +567,7 @@ Object { "id": "node_k1ow3cbw", "isLocked": false, "props": Object { + "__style__": Object {}, "columnGap": "20", "fieldId": "columns_k1ow3h1v", "layout": "6:6", @@ -628,6 +638,7 @@ Object { "isLocked": false, "props": Object { "__category__": "form", + "__style__": Object {}, "__useMediator": "value", "addonAfter": Object { "type": "i18n", @@ -705,6 +716,7 @@ Object { "isLocked": false, "props": Object { "__category__": "form", + "__style__": Object {}, "__useMediator": "value", "addonAfter": Object { "type": "i18n", @@ -777,6 +789,7 @@ Object { "id": "node_k1ow3cc6", "isLocked": false, "props": Object { + "__style__": Object {}, "colSpan": "", "fieldId": "column_k1p1bnjo", }, @@ -793,6 +806,7 @@ Object { "isLocked": false, "props": Object { "__category__": "form", + "__style__": Object {}, "__useMediator": "value", "addonAfter": Object { "type": "i18n", @@ -865,6 +879,7 @@ Object { "id": "node_k1ow3cc7", "isLocked": false, "props": Object { + "__style__": Object {}, "colSpan": "", "fieldId": "column_k1p1bnjp", }, @@ -878,6 +893,7 @@ Object { "id": "node_k1ow3cc5", "isLocked": false, "props": Object { + "__style__": Object {}, "columnGap": "20", "fieldId": "columns_k1ow3h22", "layout": "6:6", @@ -1006,6 +1022,7 @@ Object { "value": Array [ Object { "componentName": "Text", + "props": Object {}, }, ], }, @@ -1035,6 +1052,7 @@ Object { "behavior": "NORMAL", "className": "div_kgaqfbm9", "customClassName": "", + "events": Object {}, "fieldId": "div_k1ow3h1o", "useFieldIdAsDomId": false, }, @@ -1049,6 +1067,7 @@ Object { "id": "form", "isLocked": false, "props": Object { + "__style__": Object {}, "autoUnmount": true, "autoValidate": true, "behavior": "NORMAL", @@ -1057,6 +1076,7 @@ Object { "variable": "state.formData", }, "fieldId": "form", + "fieldOptions": Object {}, "labelAlign": "top", "obj": Object { "a": 1, @@ -1117,6 +1137,7 @@ Object { "globalConfig": Object { "fit": Object { "compiled": "", + "error": Object {}, "source": "", "type": "js", }, @@ -1175,6 +1196,7 @@ Object.keys(module.exports).forEach(function(item) { }, "props": Object { "className": "page_kgaqfbm4", + "containerStyle": Object {}, "extensions": Object { "启用页头": true, }, diff --git a/packages/designer/tests/document/node/props/prop.test.ts b/packages/designer/tests/document/node/props/prop.test.ts index 3e52f92a9..9ee0058ab 100644 --- a/packages/designer/tests/document/node/props/prop.test.ts +++ b/packages/designer/tests/document/node/props/prop.test.ts @@ -247,6 +247,8 @@ describe('Prop 类测试', () => { type: 'JSExpression', value: 'state.a', }, + emptyArr: [], + emptyObj: {}, z: { z1: 1, z2: 'str', @@ -258,7 +260,7 @@ describe('Prop 类测试', () => { }); it('items / get', async () => { - expect(prop.size).toBe(5); + expect(prop.size).toBe(7); expect(prop.get('a').getValue()).toBe(1); expect(prop.get('b').getValue()).toBe('str'); @@ -289,6 +291,10 @@ describe('Prop 类测试', () => { const newlyCreatedNestedProp2 = prop.get('m.m2', true); // .m2 的值为 undefined,导出时将会被移除 expect(prop.get('m').getValue()).toEqual({ m1: 'newlyCreatedNestedProp' }); + + // 对于空值的 list / map 类型,_items 应该为 null + expect(prop.get('emptyArr')._items).toBeNull(); + expect(prop.get('emptyObj')._items).toBeNull(); }); it('export', () => { @@ -300,6 +306,8 @@ describe('Prop 类测试', () => { type: 'JSExpression', value: 'state.a', }, + emptyArr: [], + emptyObj: {}, z: { z1: 1, z2: 'str', @@ -348,19 +356,19 @@ describe('Prop 类测试', () => { for (const item of prop) { mockedFn(); } - expect(mockedFn).toHaveBeenCalledTimes(5); + expect(mockedFn).toHaveBeenCalledTimes(7); mockedFn.mockClear(); prop.forEach((item) => { mockedFn(); }); - expect(mockedFn).toHaveBeenCalledTimes(5); + expect(mockedFn).toHaveBeenCalledTimes(7); mockedFn.mockClear(); prop.map((item) => { return mockedFn(); }); - expect(mockedFn).toHaveBeenCalledTimes(5); + expect(mockedFn).toHaveBeenCalledTimes(7); mockedFn.mockClear(); });