当前位置: 首页 > 知识库问答 >
问题:

typescript - vue3 渲染函数怎么直接当做组件使用?

柯波
2024-08-07

vue3 渲染函数怎么直接当做组件使用

export function useNestComponents(cmps: INestCmp[]) {
    const createCmp = (index: number): VNode  => {
        if (index === cmps.length - 1) {
            return h(cmps[index].component, cmps[index].props || null);
        } else {
            return h(cmps[index].component, cmps[index].props || null, createCmp(index + 1))
        }
    }
    return createCmp( 0);
}
<script lang="ts" setup>
const AppProvider = useNestComponents([
    {
        component: NConfigProvider
    },
    {
        component: NNotificationProvider,
    },
    {
        component: NMessageProvider
    },
])
</script>

<template>
    <AppProvider>3123123</AppProvider>
</template>

AppProvider 应当渲染3个组件出来的, 但是只渲染了一个出来。

如果 AppProvider 用函数式组件写, 3个组件都可以渲染出来。 但是 AppProvider 里面的内容久渲染不出来

import { useNestComponents } from './hooks/component';
const AppProvider = useNestComponents([
    {
        component: NConfigProvider
    },
    {
        component: NNotificationProvider,
    },
    {
        component: NMessageProvider
    },
])

export default {
    setup() {
        return () => AppProvider
    }
}

共有2个答案

贺佑运
2024-08-07

试试这样

<script lang="ts" setup>
const AppProvider = () => useNestComponents([
    {
        component: NConfigProvider
    },
    {
        component: NNotificationProvider,
    },
    {
        component: NMessageProvider
    },
])
</script>

<template>
    <AppProvider>3123123</AppProvider>
</template>
燕刚捷
2024-08-07
export function useNestComponents(cmps: INestCmp[]) {
    const nestComponent = (props, ctx) => {
        const createCmp = (index: number): VNode => {
            if (index === cmps.length - 1) {
                return h(cmps[index].component, cmps[index].props || null, ctx.slots.default && ctx.slots.default()); // Directly return VNode here
            } else {
                return h(cmps[index].component, cmps[index].props || null, createCmp(index + 1));
            }
        }
        const vnodes = createCmp(0);
        return h('div', props, vnodes);
    }
    return nestComponent;
}

在最后一个组件里面操作插槽, 就能渲染了。另外 h 函数的第一个传参不能是vnode。 所以会而外新增一个div标签

 类似资料:
  • 请问下为什么renderDom能正常渲染renderComDom却渲染不出来?

  • 我有一个组件类,我正在使用react-redux将redux存储连接到该组件类,但是当我尝试将该组件传递到connect函数时,出现了一个错误。 以下是我正在使用的每个接口(redux发出的调度除外): IFileItemProps:组件将使用的所有类型 IFilePassedProps:这些是从父组件传递到组件的道具,所以我没有看到呈现的组件元素的键入问题。 IFileItemReduxStat

  • 原先的参数 成品尺寸:100.00_100.00_100.00;展开尺寸:415.00_330.00;印刷:双面印刷;正面印刷颜色:多色_CMYK;反面印刷颜色:多色_CMYK;表面处理:哑胶;背面处理:无;预折:否;正面专色:4,1,2,3,4;反面专色:4,1,2,3,4;1;粘合:自动粘1处;纸张材质:单铜纸_350;包装服务:盒子扎皮筋;外箱套蛇皮袋:否; 修改后的参数 成品尺寸:100.

  • 本文向大家介绍怎样有条件地渲染组件?相关面试题,主要包含被问及怎样有条件地渲染组件?时的应答技巧和注意事项,需要的朋友参考一下 or

  • 嗨,我是新来的反应本机和尝试渲染组件调用一个函数内渲染,但它似乎不工作。 我的职能: 如果我这样做,效果会更好: 但不是这个: 我不明白为什么第二个代码不起作用

  • 本文向大家介绍你有用过预渲染技术吗?怎么做的?相关面试题,主要包含被问及你有用过预渲染技术吗?怎么做的?时的应答技巧和注意事项,需要的朋友参考一下 预渲染的核心是使用 prerender-spa-plugin new PrerenderSPAPlugin({ staticDir: path.join(__dirname, 'dist'), routes: [ '/', '/home', '/inf

  • vue3 cdn引入怎么使用组件?

  • 本文向大家介绍react中怎样阻止组件渲染?相关面试题,主要包含被问及react中怎样阻止组件渲染?时的应答技巧和注意事项,需要的朋友参考一下 在极少数情况下,你可能希望能隐藏组件,即使它已经被其他组件渲染。若要完成此操作,你可以让  方法直接返回 ,而不进行任何渲染。