All files / src/components/f-slot.vue index.vue

87.5% Statements 21/24
55.55% Branches 10/18
100% Functions 2/2
95% Lines 19/20

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      7x     7x 7x                                     23387x 23387x   23387x 23387x   23387x 2002x 2002x   1987x 1987x 1987x 2347x 2347x  
<script>
export default {
    name: 'f-slot',
    functional: true,
    props: {
        vm: null,
        name: String,
        props: Object,
        catchError: { type: Boolean, default: true },
    },
    render(h, context) {
        let { vm, name, props, catchError } = context.props;
        vm = vm || vm.context.parent; // @TODO: 可能不太对,需要验证一下
        const scopedSlot = vm.$scopedSlots[name];
        const slot = vm.$slots[name];
        if (scopedSlot) {
            try {
                const slotResult = scopedSlot(props);
                if (slotResult) {
                    const newScopeValue = [];
                    (slotResult || []).forEach((scopeValue) => {
                        if (scopeValue.tag !== vm.$vnode.tag) {
                            newScopeValue.push(scopeValue);
                        }
                    });
                    return newScopeValue;
                } else
                    return context.children;
            } catch (e) {
                if (catchError)
                    return h('div', e.message || e);
                else
                    throw e;
            }
        } else if (slot)
            return slot;
        else
            return context.children;
    },
};E
</script>