使用vue处理移动端组织结构树

本文档展示了如何在Vue移动端应用中利用组件和数据模拟实现类似Web端zTree插件的效果。通过CSS样式设置节点的显示,利用Vue组件`tree-item`递归渲染组织结构数据,实现层级展开与收起功能,并提供了添加子节点和创建新目录的交互操作。示例代码详细介绍了模板、数据处理和事件监听等关键部分。
摘要由CSDN通过智能技术生成

使用vue在移动端做出类似WEB端ztree插件效果:
CSS简单处理:

body {
			  font-family: Menlo, Consolas, monospace;
			  color: #444;
			}
			.item {
			  cursor: pointer;
			}
			.bold {
			  font-weight: bold;
			}
			ul {
			  padding-left: 1em;
			  line-height: 1.5em;
			  list-style-type: dot;
			}

BODY:

<ul id="demo">
			      <tree-item
			        class="item"
			        :item="treeData"
			        @make-folder="makeFolder"
			        @add-item="addItem"
			      ></tree-item>
			    </ul>

引入VUE.JS文件

<script type="text/javascript" src="../../js/vue.js"></script>
<script type="text/x-template" id="item-template">
		      <li>
		        <div
		          :class="{bold: isFolder}"
		          @click="toggle"
		          @dblclick="makeFolder">
		          {{ item.organizationName }}
		          <span v-if="isFolder">[{{ isOpen ? '-' : '+' }}]</span>
		        </div>
		        <ul v-show="isOpen" v-if="isFolder">
		          <tree-item
		            class="item"
		            v-for="(child, index) in item.children"
		            :key="index"
		            :item="child"
		            @make-folder="$emit('make-folder', $event)"
		            @add-item="$emit('add-item', $event)"
		          ></tree-item>
		          <!-- <li class="add" @click="$emit('add-item', item)">+</li> -->
		        </ul>
		      </li>
		    </script>

模拟数据

var data= [{
					"id": "001",
					"organizationName": "企业",
					"organizationNumber": null,
					"organizationState": 1,
					"organizationType": 1,
					"pName": null,
					"pNumber": null,
					"pid": "0",
					"relationshipStatus": null,
					"remark": null,
					"typeName": null
				},
				{
					"id": "001001",
					"organizationName": "企业1",
					"organizationNumber": null,
					"organizationState": 1,
					"organizationType": 1,
					"pName": "企业",
					"pNumber": null,
					"pid": "001",
					"relationshipStatus": null,
					"remark": null,
					"typeName": null
				},
				{
					"id": "001002",
					"organizationName": "企业001002",
					"organizationNumber": null,
					"organizationState": 1,
					"organizationType": 1,
					"pName": "企业",
					"pNumber": null,
					"pid": "001",
					"relationshipStatus": null,
					"remark": null,
					"typeName": null
				},
				{
					"id": "001003",
					"organizationName": "企业001003",
					"organizationNumber": null,
					"organizationState": 1,
					"organizationType": 1,
					"pName": "企业",
					"pNumber": null,
					"pid": "001",
					"relationshipStatus": null,
					"remark": null,
					"typeName": null
				},
				{
					"id": "001001001",
					"organizationName": "第一项目",
					"organizationNumber": "1",
					"organizationState": 1,
					"organizationType": 2,
					"pName": "廊坊管道研究院",
					"pNumber": null,
					"pid": "001001",
					"relationshipStatus": null,
					"remark": null,
					"typeName": null
				},
				{
					"id": "001001002",
					"organizationName": "第二项目",
					"organizationNumber": "1",
					"organizationState": 1,
					"organizationType": 2,
					"pName": "廊坊管道研究院",
					"pNumber": null,
					"pid": "001001",
					"relationshipStatus": null,
					"remark": null,
					"typeName": null
				},
				{
					"id": "001001001001",
					"organizationName": "第一工程",
					"organizationNumber": "1",
					"organizationState": 1,
					"organizationType": 3,
					"pName": "第一项目",
					"pNumber": "1",
					"pid": "001001001",
					"relationshipStatus": null,
					"remark": null,
					"typeName": null
				},
				{
					"id": "001001001001001",
					"organizationName": "第一公司",
					"organizationNumber": "1",
					"organizationState": 1,
					"organizationType": 3,
					"pName": "第一工程",
					"pNumber": "1",
					"pid": "001001001001",
					"relationshipStatus": null,
					"remark": null,
					"typeName": null
				}
			]
 Vue.component("tree-item", {
			        template: "#item-template",
			        props: {
			          item: Object
			        },
			        data: function() {
			          return {
			            isOpen: false
			          };
			        },
			        computed: {
			          isFolder: function() {
			            return this.item.children && this.item.children.length;
			          }
			        },
			        methods: {
			          toggle: function() {
			            if (this.isFolder) {
			              this.isOpen = !this.isOpen;
			            }
			          },
			          makeFolder: function() {
			            if (!this.isFolder) {
			              this.$emit("make-folder", this.item);
			              this.isOpen = true;
			            }
			          }
			        }
			      });
var vv = new Vue({
				el: '.content',
				data: function() {
					return {
						treeData: {}
					}
				},
				mounted: function() {
					const map = {};
					const val = [];
					array.forEach((item) => {
					    map[item.id] = item;
					});
					array.forEach((item) => {
					    const parent = map[item.pid];
					    if (parent) {
					        (parent.children || (parent.children = [])).push(item);
					    } else {
					        val.push(item);
					    }
					});
					this.treeData=val[0];
					console.log(JSON.stringify(val));
				},
				methods:{
					openChild:function(e,pid){
						console.log(pid);
					},
					makeFolder: function(item) {
					            Vue.set(item, "children", []);
					            this.addItem(item);
					          },
					          addItem: function(item) {
					            item.children.push({
					              name: "new stuff"
					            });
					          }
				}
			})
对于适用于Vue 3的移动端结构,你可以考虑使用以下方式来实现: 1. 首先,你可以使用通用组件[vue-virtual-tree](https://github.com/yangjingyu/vs-tree)来构建移动端结构。该组件支持大数据量加载和毫秒级渲染,适用于通讯录、组织、目录结构等场景。 2. 其次,你可以根据你的具体需求选择需要的功能点。根据引用提供的信息,基础组件支持层级面包屑、复选框、单选框、异步加载数据、虚拟列表、拖拽节点、手风琴、内搜索、自定义图标、连接线、最大可选、节点右键事件、自定义格式化数据等功能。你可以根据实际情况选择需要的功能点集成到你的移动端结构中。 3. 关于渲染节点内容,你可以使用引用提供的方法来生成简单的DOM节点。通过renderContent方法,你可以使用Vue 3的渲染函数(h)来创建包含自定义操作的节点。例如,你可以使用h("a")来创建带有点击事件的链接节点,通过点击事件可以实现节点的添加和删除操作。具体的代码实现可以根据你的需求进行进一步的调整和扩展。 总结起来,为了实现适用于Vue 3的移动端结构,你可以使用vue-virtual-tree组件作为基础,并根据实际需求选择需要的功能点集成到你的结构中。同时,你可以使用Vue 3的渲染函数(h)来生成自定义节点内容,以实现节点的添加、删除等操作。这样可以满足你在移动端上展示结构的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值