【发布时间】: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