diff --git a/.gitignore b/.gitignore index 8c18a31..29f9b68 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ /node_modules /lib /yarn.lock +/.idea diff --git a/src/index.js b/src/index.js index 87c7d9f..a17df7a 100644 --- a/src/index.js +++ b/src/index.js @@ -23,6 +23,18 @@ const log = (model, constitute, count) => { } } +// 实现深拷贝的Object.assign +const deepObjectAssign = (target, source) => { + try { + if (source) { + // 对source进行判空,否则JSON.parse操作会报错: Unexpected token u in JSON at position 0 + Object.assign(target, JSON.parse(JSON.stringify(source))) + } + } catch (e) { + console.log(e) + } +} + export default function modelExtend(...models) { const base = { state: {}, subscriptions: {}, effects: {}, reducers: {}, }; const stateCache = []; @@ -38,7 +50,7 @@ export default function modelExtend(...models) { acc.namespace = extend.namespace; if (typeof extend.state === 'object' && !Array.isArray(extend.state)) { check(extend.state, stateCache, stateCount) - Object.assign(acc.state, extend.state); + deepObjectAssign(acc.state, extend.state); } else if ('state' in extend) { acc.state = extend.state; } diff --git a/test/index.test.js b/test/index.test.js index e278586..ab41e3c 100644 --- a/test/index.test.js +++ b/test/index.test.js @@ -77,6 +77,24 @@ describe('modelExtend', () => { assert.strictEqual(res.state.length, 0); }); + it('should deeply merge states when they are objects', () => { + const originalModel = { + state: { + user: { + name: 'Benjy', + } + }, + } + const res = modelExtend(originalModel); + originalModel.state.user.name = 'Yuan'; + + assert.deepEqual(res.state, { + user: { + name: 'Benjy', + } + }); + }); + it('should log 2 times of state overwritten log', () => { modelExtend({ state: {