如何将每个元素包装在一个插槽中?

tsc*_*tao 5 vue.js vuejs2

我编写了一个组件(组件 B),它通过这样的插槽接受自定义组件列表

// Component A
<div class="component-a">
  ...
  <component-b>
    <component-x></component-x>
    <component-y></component-y>
  </component-b>
  ...
</div>
Run Code Online (Sandbox Code Playgroud)

我想将组件 x 和 y 包装在其他组件中,例如 li 标签。

// Output
...
<ul>
  <li><component-x></component-x></li>
  <li><component-y></component-y></li>
</ul>
...
Run Code Online (Sandbox Code Playgroud)

我试过

// Component B
<div class="component-b">
  <ul>
    <li v-for="item in $slots.default">
      <component :is="item"></component>
    </li>
  </ul>
</div>
Run Code Online (Sandbox Code Playgroud)

它不起作用。该项目是 VNode 对象,无法使用组件标签进行渲染。有没有办法解决这个问题?

编辑:我的包装组件不是 li 标签,它是一个自定义组件,具有我在组件 B 中设置的指定道具。如果我从组件 A 包装它们,我需要重复编写自定义组件及其道具。

Edit2: Render 函数也许可以解决这个问题,但我正在寻找带有 html 模板(单文件组件)的解决方案。

小智 5

我想如果没有成人版本(渲染功能),就不可能做到这一点。

PS:对于更详细的组件而不会弄乱渲染功能,我建议插入另一个组件来处理其他功能,例如:

createElement(componentForMakeCoolThings,{props...})    
Run Code Online (Sandbox Code Playgroud)

PS2:您可以通过简单的改编在单个文件组件中使用以下解决方案:

<script>
  export default{
     render: function(createElement){
     }
  }
</script>
Run Code Online (Sandbox Code Playgroud)

createElement(componentForMakeCoolThings,{props...})    
Run Code Online (Sandbox Code Playgroud)
<script>
  export default{
     render: function(createElement){
     }
  }
</script>
Run Code Online (Sandbox Code Playgroud)


Emī*_*bis 0

这有效吗?

<div class="component-a">
  <component-b>
    <component-x></component-x>
    <component-y></component-y>
  </component-b>
</div>
Run Code Online (Sandbox Code Playgroud)

然后使用

<div class="component-a">
  <component-b>
    <ul>
      <li><component-x></component-x></li>
      <li><component-y></component-y></li>
    </ul>
  </component-b>
</div>
Run Code Online (Sandbox Code Playgroud)