Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | 8x 8x 8x 35x 35x 35x 26x 26x 37x 26x 26x 3x 23x 23x 33x 17x 17x 23x 6x 3x 17x 25x 9x 3x 35x 8x 33x | import { ComponentInternalInstance, Slots } from 'vue' import { Props, PushFn, renderVNodeChildren, SSRBufferItem } from '../render' import { isArray } from '@vue/shared' export type SSRSlots = Record<string, SSRSlot> export type SSRSlot = ( props: Props, push: PushFn, parentComponent: ComponentInternalInstance | null, scopeId: string | null ) => void export function ssrRenderSlot( slots: Slots | SSRSlots, slotName: string, slotProps: Props, fallbackRenderFn: (() => void) | null, push: PushFn, parentComponent: ComponentInternalInstance, slotScopeId?: string ) { // template-compiled slots are always rendered as fragments push(`<!--[-->`) const slotFn = slots[slotName] if (slotFn) { const slotBuffer: SSRBufferItem[] = [] const bufferedPush = (item: SSRBufferItem) => { slotBuffer.push(item) } const ret = slotFn( slotProps, bufferedPush, parentComponent, slotScopeId ? ' ' + slotScopeId : '' ) if (isArray(ret)) { // normal slot renderVNodeChildren(push, ret, parentComponent, slotScopeId) } else { // ssr slot. // check if the slot renders all comments, in which case use the fallback let isEmptySlot = true for (let i = 0; i < slotBuffer.length; i++) { if (!isComment(slotBuffer[i])) { isEmptySlot = false break } } if (isEmptySlot) { if (fallbackRenderFn) { fallbackRenderFn() } } else { for (let i = 0; i < slotBuffer.length; i++) { push(slotBuffer[i]) } } } } else if (fallbackRenderFn) { fallbackRenderFn() } push(`<!--]-->`) } const commentRE = /^<!--.*-->$/ function isComment(item: SSRBufferItem) { return typeof item === 'string' && commentRE.test(item) } |