使用 render() 函数渲染的组件内的动态组件

Posted

技术标签:

【中文标题】使用 render() 函数渲染的组件内的动态组件【英文标题】:Dynamic component inside a component that is rendered with render() function 【发布时间】:2020-12-17 12:16:56 【问题描述】:

我在文档中看到您可以在 VueComponent 中拥有一个动态组件,如下所示:

<component :is="componentName" v-bind="componentProps" @custom-event="doSomething" />

我试图在动态呈现的组件中包含这些动态组件之一(使用 render() 函数,而不是使用 html 模板)。没有太多希望,我试过这个:

render(createElement: CreateElement) 
  return createElement('component', props: 
    'is': 'TestComponent'
  );

但我得到了

[Vue warn]: Unknown custom element: <component> - did you register the component correctly?

再一次,我不想太期待奇迹,我尝试导入 Component 并将其声明为组件:

@Component(
  components: 
    Component,
    TestComponent
  
)
export default class DynamicThingy extends Vue 
  render(createElement: CreateElement): VNode 
    return createElement('Component', 
      props: 
        'is': 'TestComponent'
      
    );
  

然后我明白了

[Vue warn]: Do not use built-in or reserved HTML elements as component id: Component

知道这怎么可能吗?

【问题讨论】:

【参考方案1】:

createElement()的第一个参数必须是任一

HTML 标记名称, 组件选项, 或解析为其中之一的异步函数。

https://vuejs.org/v2/guide/render-function.html#createElement-Arguments

因此,在渲染函数中,您可以简单地创建一个函数*,它根据您所需的标准返回一个或另一个组件的选项,并将其作为您的第一个参数。 *此函数与您编写的用于确定 :is 属性中的内容的函数相同)

您只需要模板中的动态组件 &lt;component /&gt;:is 属性,而您无法以编程方式完成。

您可以以this smart-list component from the vue docs 为例。

【讨论】:

谢谢这似乎工作除了一种情况:&lt;component :is="cmp"&gt;cmp 是一个空字符串时,没有呈现任何内容并且没有抛出错误,现在我必须放入一个组件或者我得到一个错误 您可以让它返回'div',而不是函数中的空字符串。它会呈现一个“div”,但至少它不会崩溃。或者,您可以只在元素为真时调用 createElement 函数(如 v-if)。不太清楚内置的“组件”如何处理空字符串,但是使用渲染函数,您必须自己重新实现解决方案。

以上是关于使用 render() 函数渲染的组件内的动态组件的主要内容,如果未能解决你的问题,请参考以下文章

在 Render 函数中构建动态数量的 Vue 插槽

关于render渲染优化

在 iView 的组件中使用 Render 函数渲染内容,可以通过设置 class 属性来自定义样式

记一次elementui表格组件问题

render()--组件--纯函数

Vue.js(12)- 霸道的render函数渲染组件