vuejs 渲染功能是不是允许采用现有的嵌套 VNode 的插槽

Posted

技术标签:

【中文标题】vuejs 渲染功能是不是允许采用现有的嵌套 VNode 的插槽【英文标题】:Does vuejs render function allow adopting an existing nested VNode of slotvuejs 渲染功能是否允许采用现有的嵌套 VNode 的插槽 【发布时间】:2022-01-09 14:52:12 【问题描述】:

我是 vuejs 渲染功能的新手,并且怀疑:可以重新采用 VNode,例如嵌套在插槽下的 VNode 被移动到另一个 VNode,如下例所示(仅用于演示目的, 与此版本不同):

以下代码

<row cols="4,8">
   <ui-text name="A" />
   <ui-text name="B" />
</row>

预计会产生与以下相同的结果:

<b-form-row>
   <b-col cols="4">
      <ui-text name="A" />
   </b-col>
   <b-col cols="8">
      <ui-text name="B" />
   </b-col>
</b-form-row>

这是我的代码,在 vuejs-devtools 视图中验证后最终输出与预期不完全相同,但 html 代码与预期结果相似。

vuejs-devtools中显示的结构,你可以发现2个UiText节点分别不是BCol节点的子节点,2个BCol节点被标记为功能,我不知道“功能”是什么,我不确定如何解决这种不一致,我的代码只是尝试让新创建的 VNode 采用现有的 VNode,我不确定 UiText 的 $parent 是否不可变,这是正确的解决方案吗?

export default 
  props: ['cols'],
  computed: 
    columns() 
      let v = this.cols;
      if (!v)
        return [];
      let values = this.cols.split(/,/g);
      return values;
    
  ,
  render: function(h) 
    let columns = this.columns;
    let children = this.$slots.default ? this.$slots.default : new Array();
    let kids = new Array();
    for(let i = 0, s = Math.min(columns.length, children.length); i < s; i++) 
      let kid = children[i];
      let node = h('b-col', props: cols: columns[i], [ kid ]);
      kids.push(node);
    
    return h('b-form-row', , kids);
  

【问题讨论】:

【参考方案1】:

我误解了一些东西,功能组件就是这样工作的,所以没有问题。

这是更新版本,也是一个功能组件。

<script>

export default 
  functional: true,
  props: ['cols'],
  render: function(h, ctx) 
    let columns = (ctx.props.cols  || '').split(/,/g);
    let children = ctx.children || new Array();
    let kids = new Array();
    for(let i = 0, s = Math.min(columns.length, children.length); i < s; i++) 
      let node = h('b-col', props: cols: columns[i], [ children[i] ]);
      kids.push(node);
    
    return h('b-form-row', , kids);
  


</script>

【讨论】:

以上是关于vuejs 渲染功能是不是允许采用现有的嵌套 VNode 的插槽的主要内容,如果未能解决你的问题,请参考以下文章

VueJS 使用 props 渲染嵌套列表

vuejs 入门

在 for 循环期间访问嵌套对象 VueJS

VueJS如何实现渐进式渲染? [关闭]

VueJS:添加到现有的 HTML 并处理导入

在实现 Vue-Router 的 VueJS SPA 中实现嵌套的 $refs