vue slot传参,vue slot嵌套

  vue slot传参,vue slot嵌套

  本文主要介绍Vue跨组件交付Slot的实现。通过示例代码进行了非常详细的介绍,对大家的学习或者工作都有一定的参考价值。有需要的朋友就跟着下面的边肖学习吧。

  在开发过程中,我遇到了这样一个问题,如何跨组件转移插槽。因为在开发树状组件的过程中,插槽需要对外传输到树的根节点,再通过根节点依次传输到各个叶节点。那么如何将根节点的槽传递给子组件呢?

  在开发过程中,我们希望将叶节点的结构重新定义如下:

  数据树

  模板v-slot:node=data

  div { { data . title } }-{ { data . text } }/div

  /模板

  /数据树

  那么如何在组件中传递Slot就是一个问题。

  

嵌套传递

  通过固定级组件结构,可以直接编写v-Slot.以转移相应的槽元件,从而实现逐层转移。

  数据树

  数据树项目

  模板:节点=数据

  slot :data=data xxx /slot

  /模板

  /数据树项目

  /数据树

  槽可以通过在外层创建槽来一层一层的转移,但是嵌套层次太多就麻烦了。

  

Render

  另一种解决方案是通过Render函数来显示它。可以通过$slots访问当前组件的slot元素,然后在通过Render函数创建新组件时将slot传递给下一层。

  h(数据树项目,{

  scopedSlots: {

  节点:道具=这个。$slots.node(props)

  },

  })

  这样就可以通过Render子元素接收到相应的槽位,也实现了传输。

  

动态组件

  另一种方式是通过动态组件,这也是一种推荐的实现方式。不是通过槽,而是通过子节点主动获取根节点的槽对象,然后直接在UI中渲染。

  为此,我们需要创建一个组件来呈现相应的插槽对象。

  首先,您需要获得根节点:

  const root component name= data-tree

  /**

  *获取父组件

  */

  const getRootComponent=(

  组件:ComponentInternalInstance null

  ):component internal instance undefined={

  if(component component . type . name===root component name){

  返回组件

  }

  if (component component.parent) {

  const parent=component.parent

  返回getRootComponent(父级)

  }

  }

  通过递归,我们可以得到对应的父节点,这样我们就可以把槽公开为数据。

  设置(道具){

  //获取根节点

  const dataTree=getroot component(getCurrentInstance())

  const parentSlots=dataTree?时间

  const nodeTemplate=parentSlots?任意节点

  返回{

  节点模板

  }

  }

  这时我们需要一个组件来呈现暴露的插槽:

  组件:{

  模板容器:{

  功能性:真的,

  道具:{

  模板:{

  类型:功能

  },

  数据:{

  类型:对象

  }

  },

  render: (props,ctx)=h(div ,[props.template(props.data)])

  }

  }

  好了,现在一切都准备好了,可以显示UI了:

  模板容器

  v-if=nodeTemplate

  :template=nodeTemplate

  :data=node

  /模板-容器

  模板v-else

  {{ node.label }}

  /模板

  这样我们实现了类似下面定义的Slot的交付,也解决了我们跨组件交付Slot的问题。

  插槽:数据=节点名称=节点

  {{ node.label }}

  /插槽

  本文用的是Vue 3的例子,Vue 2是同一个概念。在Vue 3中,除了使用getRootComponent查询下面的节点,还可以使用Provide/Inject主动将Slot转移到子节点。

  这就是这篇关于Vue如何实现跨组件交付槽的文章。有关Vue跨组件交付插槽的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: