Skip to content

Commit 81a4981

Browse files
committed
fix(usemodel): only when constructor.name == 'Object' can data be merged
1 parent 4424c1c commit 81a4981

File tree

3 files changed

+45
-3
lines changed

3 files changed

+45
-3
lines changed

__test__/lane/lane.spec.ts

+40
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,46 @@ describe('lane model', () => {
125125
})
126126
})
127127

128+
test('array value is protected', async () => {
129+
const { useStore } = createStore(() => {
130+
const [list, setList] = useModel(<Array<number>>[])
131+
return { list, setList }
132+
})
133+
134+
let renderTimes = 0
135+
const { result, rerender } = renderHook(() => {
136+
const { list, setList } = useStore()
137+
renderTimes += 1
138+
return { renderTimes, list, setList }
139+
})
140+
act(() => {
141+
expect(renderTimes).toEqual(1)
142+
expect(result.current.list.constructor.name).toBe('Array')
143+
})
144+
145+
act(() => {
146+
result.current.setList([1, 2])
147+
})
148+
149+
act(() => {
150+
expect(renderTimes).toEqual(2)
151+
expect(result.current.list.constructor.name).toBe('Array')
152+
expect(result.current.list[0]).toBe(1)
153+
expect(result.current.list[1]).toBe(2)
154+
})
155+
156+
act(() => {
157+
rerender()
158+
})
159+
160+
act(() => {
161+
expect(renderTimes).toEqual(3)
162+
expect(result.current.list.constructor.name).toBe('Array')
163+
expect(result.current.list[0]).toBe(1)
164+
expect(result.current.list[1]).toBe(2)
165+
})
166+
})
167+
128168
test('multiple models', async () => {
129169
const { useStore } = createStore(() => {
130170
const [count, setCount] = useModel(1)

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "react-model",
3-
"version": "4.1.1-alpha.0",
3+
"version": "4.1.2-rc.0",
44
"description": "The State management library for React",
55
"main": "./dist/react-model.js",
66
"module": "./dist/react-model.esm.js",

src/index.tsx

+4-2
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,10 @@ function useModel<S>(
4848
)
4949
} else {
5050
if (
51-
typeof Global.mutableState[storeId][index] === 'object' &&
52-
typeof state === 'object'
51+
Global.mutableState[storeId][index] &&
52+
state &&
53+
Global.mutableState[storeId][index].constructor.name === 'Object' &&
54+
state.constructor.name === 'Object'
5355
) {
5456
Global.mutableState[storeId][index] = {
5557
...Global.mutableState[storeId][index],

0 commit comments

Comments
 (0)