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 {
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;
}

View File

@ -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,
},

View File

@ -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();
});