layui 树组件tree 通过API获取数据

一、简单

	var treedata=[];
	tree.render({
		elem: '#addLeftType',
		id: 'demoId',
		data: treedata,
		showCheckbox: true,
		oncheck: function(obj){
			console.log(obj.data); // 得到当前点击的节点数据
			console.log(obj.checked); // 节点是否被选中
			console.log(obj.elem); // 得到当前节点元素
		},
		edit: ['add', 'update', 'del'] // 开启节点的右侧操作图标
	});
	get_tree_data(0);//初始化
	// 使用 layui 的 ajax 方法来获取树节点数据
	function get_tree_data(id){
		$.ajax({
			type:'post',
			url: "{:url('classif_listjson')}",
			data: {id:id},
			success:function(response){
				tree.reload('demoId', {
					data:response,
				});
				tree.setChecked('demoId', [1,2]); //单个勾选 id 为 1 的节点
			}
		});
	};

初始化 默认选中:只能这个位置才能生效

tree.setChecked('demoId', [1,2]); //单个勾选 id 为 1 的节点

二、复杂(只能单选,二级):增加、编辑、删除功能

//tree组件 操作 开始
	var show_btn = [];
	var show_btn_ids='';
	var array_ids=[];
	function get_tree_id(checkarr){ 
		for(var i=0;i<checkarr.length;i++){ 
			if(checkarr[i].children){
				get_tree_id(checkarr[i].children)
			}else{
				show_btn_ids += checkarr[i].id+',';
				array_ids.push(checkarr[i].id);
				$("#classify_ids").val(show_btn_ids);
			}

		} 
	}

 	var treedata=[];
	 //用来修改后的节点数据
	var update_treedata=[];
    //渲染
    var inst1 = tree.render({
      elem: '#addLeftType'  //绑定元素
	  ,id: 'demoId'
	  ,edit: ['add', 'update', 'del']
	  ,showCheckbox: true
      ,data:treedata
	  ,click: function(obj){
      	//layer.msg(JSON.stringify(obj.data));
      },oncheck: function(obj){
		// console.log(obj); //得到当前点击的节点数据 
		show_btn_ids = '';
		$("#classify_ids").val('');
		$("#showLeftType").html('');
		//获得选中的节点
		var checkData = tree.getChecked('demoId');
		$("#showLeftType").html("");
		//console.log(checkData.length)
		// 取消其它选中,只能单选
		uncheckAllExceptOne()


		get_tree_id(checkData); 
	
	 },operate: function(obj){
			var type = obj.type; //得到操作类型:add、edit、del
			var data = obj.data; //得到当前节点的数据
			var elem = obj.elem; //得到当前节点元素
			//Ajax 操作
			var id = data.id; //得到节点索引
			var all_id = data.pid_all.split(","); 
			if(type === 'add'){ //增加节点
				addType(id,all_id);
				//返回 key 值
				return '增加';
			} else if(type === 'update'){ //修改节点
				var title = elem.find('.layui-tree-txt').html()
				$.ajax({
					type: "post",
					url: "{:url('classif_add')}",
					dataType:"json",   //返回格式为json
					data: {id:id,title:title,field:'name',action:'ajax_update'},
					success: function(data){
						layer.msg(data.msg);
						$("#"+id).text(title);
					},
					error: function(){
						layer.msg('更新失败!');
					}
				});
			} else if(type === 'del'){ //删除节点
				$.ajax({
					type: "post",
					url: "{:url('classif_add')}",
					dataType:"json",   //返回格式为json
					data: {id:id,del_is:1,action:'ajax_del'},
					success: function(data){
						layer.msg(data.msg);
						if(data.code==200){
							//获得选中的节点
							var checkData = tree.getChecked('demoId');
							//清空选中
							array_ids=[];
							//重新获取选中id
							get_tree_id(checkData); 
							//treedata 结构数据,id递归删除对应id,array_ids给默认选中的id加上
							update_treedata= delete_tree_id(treedata,id,array_ids,"del",0,all_id);
							//重新渲染组件
							tree.reload('demoId', {data:update_treedata});
							//清空
							$("#showLeftType").html("");
							//再次获得选中的节点
							var checkData = tree.getChecked('demoId');
							//再次清空选中
							array_ids=[];
							//再次重新获取选中id
							get_tree_id(checkData); 
						}
					},
					error: function(){
						layer.msg('更新失败!');
					}
				});
			};
	  }
    });

	//取消除了当前选中所有选项
	function uncheckAllExceptOne(checkboxId) {
		var checkboxes = document.querySelectorAll('#addLeftType input[type="checkbox"]');
		for (var i = 0; i < checkboxes.length; i++) {
			checkboxes[i].checked = false;
		}
	}
	function get_page_data(id){
		$.ajax({
			type:'post',
			url: '{:url('classif_listjson')}',
			data: {id:id},
			success:function(response){
				treedata = response.data;
				if(response.code!=200){
					treedata =[{title:response.msg,id:99999999,children:[]}];
				}
				tree.reload('demoId', {
					data:treedata
				});
				{notempty name="$rs"}
				tree.setChecked('demoId', [{$rs['classify1']},{$rs['classify2']}]); //单个勾选 id 为 1 的节点
				{/notempty}
			}
		});
	};
	var p_id=0;
	var add_terr_item_title="未命名";
	get_page_data({$id});
	tree.setChecked('demoId', [1, 2]); // 批量勾选 id 为 1,3 的节点
	//操作节点type:del删除 add 添加
	function delete_tree_id(data,id,array_ids,type,addid,all_id){ 
		var is_data=data;
		var one_data=[];
		var p_spread=true;
		
		for(var i=0;i<data.length;i++){
		
			if(id==data[i].id&&type=="del"){
				is_data.splice(i,1);
			}else if(type=="add"&&(id==data[i].id)){
				if(is_data[i].children){
					is_data[i].children.push({id:addid,title:add_terr_item_title,pid_all:all_id.toString()+','+addid});
				}else{
					is_data[i].children=[];
					is_data[i].children.push({id:addid,title:add_terr_item_title,pid_all:all_id.toString()+','+addid});
				}
			}
			for (let index = 0; index < array_ids.length; index++) {
					var acid = array_ids[index];
					if(data[i]&&acid==data[i].id){
						if(is_data[i]){
							is_data[i].checked=true;
						}
					}
			} 
			//父节点展开
			if(data[i]&&data[i].id==id){
				is_data[i].spread=p_spread;//父节点展开
			}
			if(all_id){
				for (let k = 0; k <all_id.length; k++) {
					const sp_id = all_id[k];
					if(data[i]&&sp_id==data[i].id){
						is_data[i].spread=p_spread;//父节点展开
					}
				}
			}
			if(data[i]&&data[i].children){
				delete_tree_id(data[i].children,id,array_ids,type,addid,all_id);
			}
		}
		one_data=is_data;
		return  one_data;
	}

	function addType(pid,all_id){
		var typetitle = $("#typetitle").val();
		var title
		if(pid==p_id||pid==""||pid==0||pid==null||pid==undefined){
			title = typetitle? typetitle:add_terr_item_title;
		}else{
			title=add_terr_item_title;
		}
		add_terr_item_title=title;
		$.ajax({
			type: "post",
			url: "{:url('classif_add')}",
			dataType:"json",   //返回格式为json
			data: {pid:pid,title:title,level_limit:{$level_limit}},
			success: function(data){
				layer.msg(data.msg);
				if(data.code==200){
					//获得选中的节点
					var checkData = tree.getChecked('demoId');
					//清空选中
					array_ids=[];
					//重新获取选中id
					get_tree_id(checkData); 
					//treedata 结构数据,id递归删除对应id,array_ids给默认选中的id加上,all_id
					update_treedata= delete_tree_id(treedata,pid,array_ids,"add",data.add_id,all_id);
					if((pid==0||pid==null||pid==undefined||pid==""||pid==p_id)){
						update_treedata.push({id:data.add_id,title:add_terr_item_title,pid_all:p_id.toString()+','+data.add_id});
					}
					//重新渲染组件
					tree.reload('demoId', {data:update_treedata});
					//清空
					$("#showLeftType").html("");
					//再次获得选中的节点
					var checkData = tree.getChecked('demoId');
					//再次清空选中
					array_ids=[];
					//再次重新获取选中id
					get_tree_id(checkData); 
					add_terr_item_title="未命名";
				}else{
					//重新渲染组件
					tree.reload('demoId');
				}
			},
			error: function(){
				layer.msg('更新失败!');
			}
		});
	}
	$("#addType").click(function(){
		//更新后台数据
		addType(p_id,0);
	})

//tree组件 操作 结束

去掉uncheckAllExceptOne()就可以多选了

表单提交的一些判断

    /* 监听提交 */
    form.on('submit(component-form-demo1)', function(data){
		/* 启动加载... */
		var indexload = layer.load(1, {
		  shade: [0.1,'#fff'] //0.1透明度的白色背景
		});
		// 加入分类
		var data = JSON.parse(JSON.stringify(data.field));
		var checkData = tree.getChecked('demoId');
		if (Object.keys(checkData).length === 0) {
			layer.close(indexload);/* 关闭加载弹层... */
			layer.msg('请选择分类');
			return
		}
		var classify1 = checkData[0]['id'];
		var classify2 =  checkData[0]?.children?.[0]?.id;;
		data.classify1=classify1;
		data.classify2=classify2;
		var addData = JSON.stringify(data);
		$.ajax({
			url: "{:url('add')}",
			type: "post",
			dataType:"json",   //返回格式为json
			data: {data:addData},
			success: function(data) {
				layer.close(indexload);/* 关闭加载弹层... */
				layer.msg(data['msg']);
				/* 延迟2秒刷新... */
				if(data['code']==200){
					setTimeout(function(){
						window.location.reload()  
					},2000)
				}
			},
			error: function() {
				layer.close(indexload);/* 关闭加载弹层... */
				layer.msg('{$form_server_error_title}');
			}
		});
    });
相关推荐
喵叔哟14 分钟前
重构代码之取消临时字段
java·前端·重构
还是大剑师兰特1 小时前
D3的竞品有哪些,D3的优势,D3和echarts的对比
前端·javascript·echarts
王解1 小时前
【深度解析】CSS工程化全攻略(1)
前端·css
一只小白菜~1 小时前
web浏览器环境下使用window.open()打开PDF文件不是预览,而是下载文件?
前端·javascript·pdf·windowopen预览pdf
方才coding1 小时前
1小时构建Vue3知识体系之vue的生命周期函数
前端·javascript·vue.js
阿征学IT1 小时前
vue过滤器初步使用
前端·javascript·vue.js
王哲晓1 小时前
第四十五章 Vue之Vuex模块化创建(module)
前端·javascript·vue.js
丶21361 小时前
【WEB】深入理解 CORS(跨域资源共享):原理、配置与常见问题
前端·架构·web
发现你走远了1 小时前
『VUE』25. 组件事件与v-model(详细图文注释)
前端·javascript·vue.js
Mr.咕咕1 小时前
Django 搭建数据管理web——商品管理
前端·python·django