Skip to content

Commit 3507eb8

Browse files
committed
fix provide isn't reactive with a single array - Fix vuejs#5223
1 parent 84856a3 commit 3507eb8

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

src/core/instance/inject.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/* @flow */
22

33
import { hasSymbol } from 'core/util/env'
4+
import { defineReactive } from '../observer/index'
45

56
export function initProvide (vm: Component) {
67
const provide = vm.$options.provide
@@ -29,7 +30,7 @@ export function initInjections (vm: Component) {
2930
let source = vm
3031
while (source) {
3132
if (source._provided && provideKey in source._provided) {
32-
vm[key] = source._provided[provideKey]
33+
defineReactive(vm, key, source._provided[provideKey])
3334
break
3435
}
3536
source = source.$parent

test/unit/features/options/inject.spec.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,4 +162,38 @@ describe('Options provide/inject', () => {
162162
expect(vm.$el.textContent).toBe('123')
163163
})
164164
}
165+
166+
// Github issue #5223
167+
it('should work with reactive array', done => {
168+
const vm = new Vue({
169+
template: `<div><child></child></div>`,
170+
data () {
171+
return {
172+
foo: []
173+
}
174+
},
175+
provide () {
176+
return {
177+
foo: this.foo
178+
}
179+
},
180+
components: {
181+
child: {
182+
inject: ['foo'],
183+
template: `<span>{{foo.length}}</span>`
184+
}
185+
}
186+
}).$mount()
187+
188+
expect(vm.$el.innerHTML).toEqual(`<span>0</span>`)
189+
vm.foo.push(vm.foo.length)
190+
vm.$nextTick(() => {
191+
expect(vm.$el.innerHTML).toEqual(`<span>1</span>`)
192+
vm.foo.pop()
193+
vm.$nextTick(() => {
194+
expect(vm.$el.innerHTML).toEqual(`<span>0</span>`)
195+
done()
196+
})
197+
})
198+
})
165199
})

0 commit comments

Comments
 (0)