Skip to content

Commit eaee515

Browse files
committed
feat(vapor): setRef vdom interop
1 parent d8ae428 commit eaee515

File tree

5 files changed

+36
-2
lines changed

5 files changed

+36
-2
lines changed

packages/runtime-core/src/index.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -557,3 +557,11 @@ export { startMeasure, endMeasure } from './profiling'
557557
* @internal
558558
*/
559559
export { initFeatureFlags } from './featureFlags'
560+
/**
561+
* @internal
562+
*/
563+
export { setRef } from './rendererTemplateRef'
564+
/**
565+
* @internal
566+
*/
567+
export type { VNodeNormalizedRef } from './vnode'

packages/runtime-core/src/rendererTemplateRef.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ export function setRef(
7676
const setupState = owner.setupState
7777
const rawSetupState = toRaw(setupState)
7878
const canSetSetupRef =
79-
setupState === EMPTY_OBJ
79+
setupState === undefined || setupState === EMPTY_OBJ
8080
? () => false
8181
: (key: string) => {
8282
if (__DEV__) {

packages/runtime-vapor/src/apiTemplateRef.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import {
2020
isString,
2121
remove,
2222
} from '@vue/shared'
23+
import { isFragment } from './block'
2324

2425
export type NodeRef = string | Ref | ((ref: Element) => void)
2526
export type RefEl = Element | VaporComponentInstance
@@ -47,7 +48,10 @@ export function setRef(
4748
refFor = false,
4849
): NodeRef | undefined {
4950
if (!instance || instance.isUnmounted) return
50-
51+
if (isFragment(el) && el.setRef) {
52+
el.setRef(instance, ref, refFor)
53+
return
54+
}
5155
const setupState: any = __DEV__ ? instance.setupState || {} : null
5256
const refValue = isVaporComponent(el) ? getExposed(el) || el : el
5357

packages/runtime-vapor/src/block.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
import { createComment, createTextNode } from './dom/node'
99
import { EffectScope, pauseTracking, resetTracking } from '@vue/reactivity'
1010
import { isHydrating } from './dom/hydration'
11+
import type { NodeRef } from './apiTemplateRef'
1112

1213
export type Block =
1314
| Node
@@ -23,6 +24,11 @@ export class VaporFragment {
2324
anchor?: Node
2425
insert?: (parent: ParentNode, anchor: Node | null) => void
2526
remove?: (parent?: ParentNode) => void
27+
setRef?: (
28+
instance: VaporComponentInstance,
29+
ref: NodeRef,
30+
refFor: boolean,
31+
) => void
2632

2733
constructor(nodes: Block) {
2834
this.nodes = nodes

packages/runtime-vapor/src/vdomInterop.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
type ShallowRef,
99
type Slots,
1010
type VNode,
11+
type VNodeNormalizedRef,
1112
type VaporInteropInterface,
1213
createVNode,
1314
currentInstance,
@@ -16,6 +17,7 @@ import {
1617
renderSlot,
1718
shallowRef,
1819
simpleSetCurrentInstance,
20+
setRef as vdomSetRef,
1921
} from '@vue/runtime-dom'
2022
import {
2123
type LooseRawProps,
@@ -33,6 +35,7 @@ import type { RawSlots, VaporSlot } from './componentSlots'
3335
import { renderEffect } from './renderEffect'
3436
import { createTextNode } from './dom/node'
3537
import { optimizePropertyLookup } from './dom/prop'
38+
import type { NodeRef } from './apiTemplateRef'
3639

3740
// mounting vapor components and slots in vdom
3841
const vaporInteropImpl: Omit<
@@ -169,9 +172,12 @@ function createVDOMComponent(
169172
: new Proxy(wrapper.slots, vaporSlotsProxyHandler)
170173
}
171174

175+
let rawRef: VNodeNormalizedRef | undefined
172176
let isMounted = false
173177
const parentInstance = currentInstance as VaporComponentInstance
174178
const unmount = (parentNode?: ParentNode) => {
179+
// unset ref
180+
if (rawRef) vdomSetRef(rawRef, null, null, vnode, true)
175181
internals.umt(vnode.component!, null, !!parentNode)
176182
}
177183

@@ -186,6 +192,8 @@ function createVDOMComponent(
186192
undefined,
187193
false,
188194
)
195+
// set ref
196+
if (rawRef) vdomSetRef(rawRef, null, null, vnode)
189197
onScopeDispose(unmount, true)
190198
isMounted = true
191199
} else {
@@ -202,6 +210,14 @@ function createVDOMComponent(
202210

203211
frag.remove = unmount
204212

213+
frag.setRef = (
214+
instance: VaporComponentInstance,
215+
ref: NodeRef,
216+
refFor: boolean,
217+
): void => {
218+
rawRef = { i: instance as any, r: ref as any, k: undefined, f: refFor }
219+
}
220+
205221
return frag
206222
}
207223

0 commit comments

Comments
 (0)