【问题标题】:Vue 3: resolveComponent can only be used in render() or setup()Vue 3:resolveComponent 只能在 render() 或 setup() 中使用
【发布时间】:2021-01-21 16:39:14
【问题描述】:

我正在尝试在 Vue 3 中渲染模板。模板包含一个组件,该组件在实例上本地注册。

import template from './template'
import RenderlessPagination from "./RenderlessPagination";
import {h, resolveComponent} from 'vue'

export default {
    name: 'Pagination',
    components: {RenderlessPagination},
    provide() {
        return {
            Page: () => this.value,
            perPage: () => this.perPage,
            records: () => this.records
        }
    },
    render() {
        const RLPagination = resolveComponent('renderless-pagination');

        return h(RLPagination, {
            slots: {
                default: function (props) {
                    return props.override ? h(
                        props.override,
                        {
                            attrs: {props}
                        }
                    ) : template(props)(h)
                }
            }
        })
    },
    props: {
        value: {
            type: Number,
            required: true,
            validator(val) {
                return val > 0;
            }
        },
        records: {
            type: Number,
            required: true
        },
        perPage: {
            type: Number,
            default: 25
        },
        options: {
            type: Object
        }
    },
    data: function () {
        return {
            aProps: {
                role: "button"
            }
        }
    }
}

这会导致以下运行时警告:

resolveComponent can only be used in render() or setup()

此外,renderless-pagination 组件没有被编译,而是按原样添加到 HTML 中:

<renderless-pagination slots=[Object Object]></renderless-pagination>

你可以看到render函数中使用resolveComponent,这让我想知道为什么它会抱怨,以及为什么renderless-pagination组件没有被编译。

我检查了resolveComponent 调用返回的值,它只返回组件的名称,即renderless-pagination

我在这里错过了什么?

编辑:

根据@skirtle 的评论,我使用webpack 中的externals 选项从包中删除了重复的Vue 实例。 但是,我仍然收到同样的错误:

resolveComponent can only be used in render() or setup()

相关webpack 配置:

  output: {
        path: path.resolve(__dirname, './dist'),
        publicPath: '/dist/',
        filename: 'vue-pagination-2.min.js',
        library:'Pagination',
        libraryTarget: "commonjs"
    },
    externals: {
        vue: {
            root: 'Vue',
            commonjs: 'vue',
            commonjs2: 'vue',
            amd: 'vue'
        }
    }

【问题讨论】:

  • 你有可能拉入两个 Vue 副本吗?不一定是不同的版本,只是同一版本的两个副本被构建的不同部分引入?完整的堆栈跟踪可能有助于识别这一点,因为 resolveComponent 可能正在调用与渲染过程的其余部分不同的 Vue。
  • @skirtle 是的!我相信这就是原因。我正在升级一个包,所以在包的代码库上呈​​现了一个不同的 vue 实例。谢谢:)

标签: vuejs3 vue-render-function


【解决方案1】:

感谢@skirtle 的评论,我删除了重复的 Vue 实例,但仍然遇到相同的错误。

最终的工作是将组件实例本身传递给h 函数,如下所示:

render() {
        return h(RenderlessPagination, {}, {
                default: function (props) {
                    return props.override ? h(
                        props.override,
                        {
                            props
                        }
                    ) : template(props)(h)
                }
        })

我想这就是 resolveComponent 在幕后所做的……哦,好吧

【讨论】:

    猜你喜欢
    • 2023-02-25
    • 2021-03-28
    • 1970-01-01
    • 2022-08-09
    • 2011-11-05
    • 2021-02-09
    • 2021-05-30
    • 2018-08-31
    • 1970-01-01
    相关资源
    最近更新 更多