Vue.js iview实现树形权限表(可扩展表)

问题:

        需要一个可折叠的权限管理系统,用表格展示。

        主要用的iView组件库,有Table(表格),Tree(树形控件),Collapse(折叠面板)看起来比较符合意思

        深入查看Table相关范例,发现有个 通过给 columns 数据设置一项,指定 type: 'expand',即可开启扩展功能  可以考虑

        但也只是展开详细内容,如需树形结构,则需要render自定义去渲染,挺麻烦的。再去看看element UI,也没有什么比较好的选择。

过程:

        第一步,先构建根节点的数据表,后台返回JSON数据解析(www.json.cn)基本如下

        前面2个object和第三个结构基本类似,将数据注入authlist,匹配listcolumns展示

        展示结果如下:

        

        第二步,添加Columns的扩展expand功能,在listcolumns里添加

listcolumns: [
					{
                        title: '序号',
                        key: '_index',
                        className: 'index_css',
                        render: (h, params) => {
					    	return h('div', [
					        	h('span', {
					            	style: {
					                	display: 'inline-block',
					                	width: '100%',
					                	overflow: 'hidden',
					                	textOverflow: 'ellipsis',
					                	whiteSpace: 'nowrap',
					                	textAlign: 'center'
					            	}
					        	}, params.row._index)
					    	]);	
					    }
                    },
                    {  //添加的expand
                        type: 'expand',
                        width: 20,
                        render: (h, params) => {
                            return h(expandRow, {
                            	style:{
                            		padding: 0
                            	},
                                props: {
                                    row: params.row
                                }
                            })
                        }
                    },
                    {
                        title: '权限名称',
                        key: 'Title',
                        className: 'Title_css',
                        ellipsis:true,
                        render: (h, params) => {
					    	return h('div', [
					        	h('span', {
					            	style: {
					                	display: 'inline-block',
					                	width: '100%',
					                	overflow: 'hidden',
					                	textOverflow: 'ellipsis',
					                	whiteSpace: 'nowrap'
					            	}
					        	}, params.row.Title)
					    	]);	
					    }
                    },

          展示效果:

 

        第三步:authtable_expand.vue子组件,基本和父组件的Table一致

<template>
	<Table stripe :loading="loading" :showHeader=false border :columns="listcolumns" 
		:data="listauth" style="overflow-y: hidden;max-height: 522px;"></Table>
</template>

<script>
	import expandRow from '../components/authtable_expand.vue';
	export default{
		props:['row'],
		data(){
			return{
				loading: false,
				listcolumns: [
			        //listcolumns暂不展示
                ],
                listauth:[]
			}
		},
		mounted(){
			
		},
		methods:{
			
		},
		created(){
			//console.log("authotable_expend created: " + JSON.stringify(this.row.children))
			var object = this.row.children;
			console.log("auth expand data:" + JSON.stringify(object))
			this.listauth.splice(0)
			object.forEach(r=>{
				this.listauth.push(r)
			})
			//console.log("listauth:" + JSON.stringify(this.listauth))
		}
	}
</script>

<style lang="less">
	td.ivu-table-expanded-cell{
		padding:0;
	}
</style>

        注意,添加td.ivu-table-expanded-cell{padding:0;},可以是扩展部分内容充满全部,展示效果如下

        在expand.vue里递归调用自身,可以逐级扩展

总结:

        目前在Vue.js的2个主要的前端组件iView和ElementUI都暂时没有看到合适的可扩展的树形表,只有自己编写相关组件来实现。相信以后应该都会有的,就像之前iView多表头都没有,后面也终于添加了。

        此外,自定义组合树形权限表还有部分功能没有完善,如:

                1如果当前节点没有子节点,就不应该出现扩展的按钮

                2扩展按钮最好按照树的深度逐渐向后移动

                3序号未按总序号排列

        预期结果应该类似于:

        

写在后面2020.01.07:

       这个样式和功能设计是以前iView和elementUI没有类似组件的时候, 自己参照EasyUI自行设计的方法,细节问题比较多,现在可以可以参照ElementUI的树形数据,网址 树形数据

同时,EasyUI也有vue.js的重写,欢迎大家使用,表格功能更加强大。

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
实现一个查找树(也叫二叉搜索树)可以使用 Vue.js 来构建一个交互式的树形结构。 首先需要定义一个节点的数据结构,包括节点值、左子节点、右子节点等属性。例如: ```javascript { value: 5, left: { value: 3, left: null, right: null }, right: { value: 8, left: { value: 7, left: null, right: null }, right: null } } ``` 然后可以使用递归的方式来遍历树,将每个节点渲染成一个组件,同时在组件中定义点击事件来切换节点的展开和折叠状态。例如: ```html <template> <div> <div @click="toggle">{{ node.value }}</div> <div v-if="expanded"> <TreeNode v-if="node.left" :node="node.left" /> <TreeNode v-if="node.right" :node="node.right" /> </div> </div> </template> <script> export default { name: 'TreeNode', props: ['node'], data() { return { expanded: false } }, methods: { toggle() { this.expanded = !this.expanded } } } </script> ``` 最后,在父组件中使用根节点来渲染整个树: ```html <template> <div> <TreeNode :node="root" /> </div> </template> <script> import TreeNode from './TreeNode.vue' export default { name: 'Tree', components: { TreeNode }, data() { return { root: { value: 5, left: { value: 3, left: null, right: null }, right: { value: 8, left: { value: 7, left: null, right: null }, right: null } } } } } </script> ``` 这样就可以用 Vue.js 实现一个简单的查找树了。当然,这只是一个基本的示例,实际上还需要考虑很多细节,例如节点的插入、删除、搜索等操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值