Vue3 通过作用域插槽实现树形菜单嵌套组件.docx

Vue3 通过作用域插槽实现树形菜单嵌套组件.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

Vue3?通过作用域插槽实现树形菜单嵌套组件

目录一、需求来源二、效果图三、使用示例(VTreeNodeDemo.vue)四、源码(VTreeNode.vue):

一、需求来源

工作中需要一种树形菜单组件,经过两天的构思最终通过作用域插槽实现:此组件将每个节点(插槽名为node)暴露出来。

通过插槽的attributes向当前插槽节点传递子项item(数据对象)和level(层深)参数,在保持组件内部极简的同时支持在数据模型中扩展性。基本达到比较好的封装颗粒度,大家可以在此基础上无限扩展封装具体的业务逻辑。

二、效果图

letlist=reactive(

name:1一级菜单,

isExpand:true,//是否展开子项

enabled:false,//是否可以响应事件

child:[

{name:1.1二级菜单,

isExpand:true,

child:[

{name:1.1.1三级菜单,isExpand:true,},

{name:1.2二级菜单,isExpand:true,},

name:1.1一级菜单,

isExpand:true,

child:[

{name:1.1.1二级菜单,isExpand:true,},

{name:1.1.2二级菜单,

isExpand:false,

child:[

{name:1.1.2.1三级菜单,isExpand:true,},

三、使用示例(VTreeNodeDemo.vue)

template

VTreeNode

:list=list

:level=level

template#node=slotProps

div

{{prefix(slotProps.level)}}{{slotProps.item.name}}{{sufix(slotProps.item)}}

/div

/template

/VTreeNode

/template

scriptsetup

importVTreeNodefrom@/components/VTreeNode/VTreeNode.vue;

import{ref,reactive,watch,onMounted,}fromvue;

letlist=reactive(

name:1一级菜单,

isExpand:true,//是否展开子项

enabled:false,//是否可以响应事件

child:[

{name:1.1二级菜单,

isExpand:true,

child:[

{name:1.1.1三级菜单,isExpand:true,},

{name:1.2二级菜单,isExpand:true,},

name:1.1一级菜单,

isExpand:true,

child:[

{name:1.1.1二级菜单,isExpand:true,},

{name:1.1.2二级菜单,

isExpand:false,

child:[

{name:1.1.2.1三级菜单,isExpand:true,},

constlevel=ref(0);

constprefix=(count)={

return__.repeat(count);

constsufix=(item)={

if(!Reflect.has(item,child)){

return;

return`(${item.child.length}子项)`;

/script

stylescopedlang=scss

.tree-node{

height:45px;

display:flex;

justify-self:center;

align-items:center;

//background-color:green;

border-bottom:1pxsolid#e4e4e4;

/style

四、源码(VTreeNode.vue):

template

!--div--

divv-for=(item,ind

文档评论(0)

158****0778 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档