fix: 修复空值的数组/对象的 _items 不为 null 的问题

This commit is contained in:
lihao.ylh 2021-12-01 16:30:28 +08:00
parent 54c8c51258
commit 3d8b31f121
3 changed files with 39 additions and 6 deletions

View File

@ -381,10 +381,11 @@ export class Prop implements IPropParent {
@computed private get items(): Prop[] | null { @computed private get items(): Prop[] | null {
if (this._items) return this._items; if (this._items) return this._items;
return runInAction(() => { return runInAction(() => {
let items: Prop[] | null = []; let items: Prop[] | null = null;
if (this._type === 'list') { if (this._type === 'list') {
const data = this._value; const data = this._value;
for (const item of data) { for (const item of data) {
items = items || [];
items.push(new Prop(this, item)); items.push(new Prop(this, item));
} }
this._maps = null; this._maps = null;
@ -394,6 +395,7 @@ export class Prop implements IPropParent {
const keys = Object.keys(data); const keys = Object.keys(data);
for (const key of keys) { for (const key of keys) {
const prop = new Prop(this, data[key], key); const prop = new Prop(this, data[key], key);
items = items || [];
items.push(prop); items.push(prop);
maps.set(key, prop); maps.set(key, prop);
} }
@ -526,7 +528,8 @@ export class Prop implements IPropParent {
this.setValue([]); this.setValue([]);
} }
const prop = new Prop(this, value); const prop = new Prop(this, value);
this.items!.push(prop); this._items = this._items || [];
this._items.push(prop);
return prop; return prop;
} }

View File

@ -79,6 +79,7 @@ Object {
"__slot__extraContent": false, "__slot__extraContent": false,
"__slot__logo": false, "__slot__logo": false,
"__slot__tab": false, "__slot__tab": false,
"__style__": Object {},
"action": "", "action": "",
"content": "", "content": "",
"crumb": "", "crumb": "",
@ -94,6 +95,7 @@ Object {
"condition": true, "condition": true,
"id": "node_k1ow3cbf", "id": "node_k1ow3cbf",
"props": Object { "props": Object {
"__style__": Object {},
"behavior": "NORMAL", "behavior": "NORMAL",
"content": Object { "content": Object {
"en_US": "Title", "en_US": "Title",
@ -142,6 +144,7 @@ Object {
"isLocked": false, "isLocked": false,
"props": Object { "props": Object {
"__category__": "form", "__category__": "form",
"__style__": Object {},
"__useMediator": "value", "__useMediator": "value",
"addonAfter": Object { "addonAfter": Object {
"type": "i18n", "type": "i18n",
@ -219,6 +222,7 @@ Object {
"isLocked": false, "isLocked": false,
"props": Object { "props": Object {
"__category__": "form", "__category__": "form",
"__style__": Object {},
"__useMediator": "value", "__useMediator": "value",
"addonAfter": Object { "addonAfter": Object {
"type": "i18n", "type": "i18n",
@ -292,6 +296,7 @@ Object {
"isLocked": false, "isLocked": false,
"props": Object { "props": Object {
"__category__": "form", "__category__": "form",
"__style__": Object {},
"__useMediator": "value", "__useMediator": "value",
"addonAfter": Object { "addonAfter": Object {
"type": "i18n", "type": "i18n",
@ -364,6 +369,7 @@ Object {
"id": "node_k1ow3cbx", "id": "node_k1ow3cbx",
"isLocked": false, "isLocked": false,
"props": Object { "props": Object {
"__style__": Object {},
"colSpan": "", "colSpan": "",
"fieldId": "column_k1p1bnjm", "fieldId": "column_k1p1bnjm",
}, },
@ -380,6 +386,7 @@ Object {
"isLocked": false, "isLocked": false,
"props": Object { "props": Object {
"__category__": "form", "__category__": "form",
"__style__": Object {},
"__useMediator": "value", "__useMediator": "value",
"addonAfter": Object { "addonAfter": Object {
"type": "i18n", "type": "i18n",
@ -453,6 +460,7 @@ Object {
"isLocked": false, "isLocked": false,
"props": Object { "props": Object {
"__category__": "form", "__category__": "form",
"__style__": Object {},
"__useMediator": "value", "__useMediator": "value",
"autoWidth": true, "autoWidth": true,
"behavior": "NORMAL", "behavior": "NORMAL",
@ -545,6 +553,7 @@ Object {
"id": "node_k1ow3cby", "id": "node_k1ow3cby",
"isLocked": false, "isLocked": false,
"props": Object { "props": Object {
"__style__": Object {},
"colSpan": "", "colSpan": "",
"fieldId": "column_k1p1bnjn", "fieldId": "column_k1p1bnjn",
}, },
@ -558,6 +567,7 @@ Object {
"id": "node_k1ow3cbw", "id": "node_k1ow3cbw",
"isLocked": false, "isLocked": false,
"props": Object { "props": Object {
"__style__": Object {},
"columnGap": "20", "columnGap": "20",
"fieldId": "columns_k1ow3h1v", "fieldId": "columns_k1ow3h1v",
"layout": "6:6", "layout": "6:6",
@ -628,6 +638,7 @@ Object {
"isLocked": false, "isLocked": false,
"props": Object { "props": Object {
"__category__": "form", "__category__": "form",
"__style__": Object {},
"__useMediator": "value", "__useMediator": "value",
"addonAfter": Object { "addonAfter": Object {
"type": "i18n", "type": "i18n",
@ -705,6 +716,7 @@ Object {
"isLocked": false, "isLocked": false,
"props": Object { "props": Object {
"__category__": "form", "__category__": "form",
"__style__": Object {},
"__useMediator": "value", "__useMediator": "value",
"addonAfter": Object { "addonAfter": Object {
"type": "i18n", "type": "i18n",
@ -777,6 +789,7 @@ Object {
"id": "node_k1ow3cc6", "id": "node_k1ow3cc6",
"isLocked": false, "isLocked": false,
"props": Object { "props": Object {
"__style__": Object {},
"colSpan": "", "colSpan": "",
"fieldId": "column_k1p1bnjo", "fieldId": "column_k1p1bnjo",
}, },
@ -793,6 +806,7 @@ Object {
"isLocked": false, "isLocked": false,
"props": Object { "props": Object {
"__category__": "form", "__category__": "form",
"__style__": Object {},
"__useMediator": "value", "__useMediator": "value",
"addonAfter": Object { "addonAfter": Object {
"type": "i18n", "type": "i18n",
@ -865,6 +879,7 @@ Object {
"id": "node_k1ow3cc7", "id": "node_k1ow3cc7",
"isLocked": false, "isLocked": false,
"props": Object { "props": Object {
"__style__": Object {},
"colSpan": "", "colSpan": "",
"fieldId": "column_k1p1bnjp", "fieldId": "column_k1p1bnjp",
}, },
@ -878,6 +893,7 @@ Object {
"id": "node_k1ow3cc5", "id": "node_k1ow3cc5",
"isLocked": false, "isLocked": false,
"props": Object { "props": Object {
"__style__": Object {},
"columnGap": "20", "columnGap": "20",
"fieldId": "columns_k1ow3h22", "fieldId": "columns_k1ow3h22",
"layout": "6:6", "layout": "6:6",
@ -1006,6 +1022,7 @@ Object {
"value": Array [ "value": Array [
Object { Object {
"componentName": "Text", "componentName": "Text",
"props": Object {},
}, },
], ],
}, },
@ -1035,6 +1052,7 @@ Object {
"behavior": "NORMAL", "behavior": "NORMAL",
"className": "div_kgaqfbm9", "className": "div_kgaqfbm9",
"customClassName": "", "customClassName": "",
"events": Object {},
"fieldId": "div_k1ow3h1o", "fieldId": "div_k1ow3h1o",
"useFieldIdAsDomId": false, "useFieldIdAsDomId": false,
}, },
@ -1049,6 +1067,7 @@ Object {
"id": "form", "id": "form",
"isLocked": false, "isLocked": false,
"props": Object { "props": Object {
"__style__": Object {},
"autoUnmount": true, "autoUnmount": true,
"autoValidate": true, "autoValidate": true,
"behavior": "NORMAL", "behavior": "NORMAL",
@ -1057,6 +1076,7 @@ Object {
"variable": "state.formData", "variable": "state.formData",
}, },
"fieldId": "form", "fieldId": "form",
"fieldOptions": Object {},
"labelAlign": "top", "labelAlign": "top",
"obj": Object { "obj": Object {
"a": 1, "a": 1,
@ -1117,6 +1137,7 @@ Object {
"globalConfig": Object { "globalConfig": Object {
"fit": Object { "fit": Object {
"compiled": "", "compiled": "",
"error": Object {},
"source": "", "source": "",
"type": "js", "type": "js",
}, },
@ -1175,6 +1196,7 @@ Object.keys(module.exports).forEach(function(item) {
}, },
"props": Object { "props": Object {
"className": "page_kgaqfbm4", "className": "page_kgaqfbm4",
"containerStyle": Object {},
"extensions": Object { "extensions": Object {
"启用页头": true, "启用页头": true,
}, },

View File

@ -247,6 +247,8 @@ describe('Prop 类测试', () => {
type: 'JSExpression', type: 'JSExpression',
value: 'state.a', value: 'state.a',
}, },
emptyArr: [],
emptyObj: {},
z: { z: {
z1: 1, z1: 1,
z2: 'str', z2: 'str',
@ -258,7 +260,7 @@ describe('Prop 类测试', () => {
}); });
it('items / get', async () => { it('items / get', async () => {
expect(prop.size).toBe(5); expect(prop.size).toBe(7);
expect(prop.get('a').getValue()).toBe(1); expect(prop.get('a').getValue()).toBe(1);
expect(prop.get('b').getValue()).toBe('str'); expect(prop.get('b').getValue()).toBe('str');
@ -289,6 +291,10 @@ describe('Prop 类测试', () => {
const newlyCreatedNestedProp2 = prop.get('m.m2', true); const newlyCreatedNestedProp2 = prop.get('m.m2', true);
// .m2 的值为 undefined导出时将会被移除 // .m2 的值为 undefined导出时将会被移除
expect(prop.get('m').getValue()).toEqual({ m1: 'newlyCreatedNestedProp' }); 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', () => { it('export', () => {
@ -300,6 +306,8 @@ describe('Prop 类测试', () => {
type: 'JSExpression', type: 'JSExpression',
value: 'state.a', value: 'state.a',
}, },
emptyArr: [],
emptyObj: {},
z: { z: {
z1: 1, z1: 1,
z2: 'str', z2: 'str',
@ -348,19 +356,19 @@ describe('Prop 类测试', () => {
for (const item of prop) { for (const item of prop) {
mockedFn(); mockedFn();
} }
expect(mockedFn).toHaveBeenCalledTimes(5); expect(mockedFn).toHaveBeenCalledTimes(7);
mockedFn.mockClear(); mockedFn.mockClear();
prop.forEach((item) => { prop.forEach((item) => {
mockedFn(); mockedFn();
}); });
expect(mockedFn).toHaveBeenCalledTimes(5); expect(mockedFn).toHaveBeenCalledTimes(7);
mockedFn.mockClear(); mockedFn.mockClear();
prop.map((item) => { prop.map((item) => {
return mockedFn(); return mockedFn();
}); });
expect(mockedFn).toHaveBeenCalledTimes(5); expect(mockedFn).toHaveBeenCalledTimes(7);
mockedFn.mockClear(); mockedFn.mockClear();
}); });