Skip to content

Commit 449ab03

Browse files
committed
feat(templateRef): should work with direct reactive property
close #901
1 parent 55b364d commit 449ab03

File tree

2 files changed

+28
-11
lines changed

2 files changed

+28
-11
lines changed

packages/runtime-core/__tests__/apiTemplateRef.spec.ts

+20-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ import {
55
render,
66
nextTick,
77
Ref,
8-
defineComponent
8+
defineComponent,
9+
reactive
910
} from '@vue/runtime-test'
1011

1112
// reference: https://vue-composition-api-rfc.netlify.com/api.html#template-refs
@@ -200,4 +201,22 @@ describe('api: template refs', () => {
200201

201202
expect(spy).toHaveBeenCalledWith('div')
202203
})
204+
205+
it('should work with direct reactive property', () => {
206+
const root = nodeOps.createElement('div')
207+
const state = reactive({
208+
refKey: null
209+
})
210+
211+
const Comp = {
212+
setup() {
213+
return state
214+
},
215+
render() {
216+
return h('div', { ref: 'refKey' })
217+
}
218+
}
219+
render(h(Comp), root)
220+
expect(state.refKey).toBe(root.children[0])
221+
})
203222
})

packages/runtime-core/src/renderer.ts

+8-10
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ import {
3232
isFunction,
3333
PatchFlags,
3434
ShapeFlags,
35-
NOOP
35+
NOOP,
36+
hasOwn
3637
} from '@vue/shared'
3738
import {
3839
queueJob,
@@ -45,7 +46,6 @@ import {
4546
stop,
4647
ReactiveEffectOptions,
4748
isRef,
48-
toRaw,
4949
DebuggerEvent
5050
} from '@vue/reactivity'
5151
import { resolveProps } from './componentProps'
@@ -1859,27 +1859,25 @@ function baseCreateRenderer(
18591859
}
18601860
const oldRef = oldRawRef && oldRawRef[1]
18611861
const refs = owner.refs === EMPTY_OBJ ? (owner.refs = {}) : owner.refs
1862-
const renderContext = toRaw(owner.renderContext)
1862+
const renderContext = owner.renderContext
18631863

18641864
// unset old ref
18651865
if (oldRef != null && oldRef !== ref) {
18661866
if (isString(oldRef)) {
18671867
refs[oldRef] = null
1868-
const oldSetupRef = renderContext[oldRef]
1869-
if (isRef(oldSetupRef)) {
1870-
oldSetupRef.value = null
1868+
if (hasOwn(renderContext, oldRef)) {
1869+
renderContext[oldRef] = null
18711870
}
18721871
} else if (isRef(oldRef)) {
18731872
oldRef.value = null
18741873
}
18751874
}
18761875

18771876
if (isString(ref)) {
1878-
const setupRef = renderContext[ref]
1879-
if (isRef(setupRef)) {
1880-
setupRef.value = value
1881-
}
18821877
refs[ref] = value
1878+
if (hasOwn(renderContext, ref)) {
1879+
renderContext[ref] = value
1880+
}
18831881
} else if (isRef(ref)) {
18841882
ref.value = value
18851883
} else if (isFunction(ref)) {

0 commit comments

Comments
 (0)