vue3+ts+ztree
新公司 要用新技术 vue3+ts 一切从头学 最近要引一个树的插件 ztree 所以把遇到的问题 都记下来
一、ztree
找了无数个tree的插件,最后被ztree征服,主要是他的官网的demo简直太厉害了,想要的功能几乎都能复现出来,贴上网址:http://www.treejs.cn/v3/main.php#_zTreeInfo
我用到的功能就是拖拽 两棵树之间互相拖 ztree YYDS
二、开始
1.引入
因为ztree是jQuery插件 所以不仅得引入ztree 也得引入jQuery
npm install @ztree/ztree_v3
npm i jquery
//然后在main.ts 中引入
import '@ztree/ztree_v3/js/jquery-1.4.4.min.js'
import '@ztree/ztree_v3/js/jquery.ztree.core.min.js'
import '@ztree/ztree_v3/js/jquery.ztree.excheck.min.js'
import '@ztree/ztree_v3/js/jquery.ztree.exedit.min.js'
// import '@ztree/ztree_v3/css/metroStyle/metroStyle.css'
import '@ztree/ztree_v3/css/zTreeStyle/zTreeStyle.css'
//引入之后 可能会报找不到jQuery 这个时候要下载npm install @types/jquery
//这个js引入的顺序 一定不能变奥 因为我就在这碰过壁 咋写都写不出来 结果是顺序变了
然后需要在vue.config.ts 中配置一下jQuery 不然会报错:
const { defineConfig } = require('@vue/cli-service')
const webpack = require('webpack')
module.exports = defineConfig({
transpileDependencies: true,
configureWebpack: {
plugins: [
new webpack.ProvidePlugin({
$:"jquery",
jQuery:"jquery",
"windows.jQuery":"jquery"
})
]
},
})
这里要配置webpack的 就是自己建立一个 webpack.config.js 这也是打包的关键了
写树
我建议把官网的demo下载出来 这样在本地看非常方便
这个文件夹里的HTML 就是所有需要用到的功能文件 然后去对比官网的demo路径就能找到
下面贴出vue页面 整个代码 我这个写的是两棵树互拖 里面会有注释
<template>
<!-- vue3页面 -->
<div class="about-wrap">
<h1>测试树结构</h1>
<div class="btnwrap">
<a id="addLeaf" href="#" title="增加叶子节点" onclick="return false;">增加叶子节点</a>
<a id="remove" href="#" title="删除节点" onclick="return false;">删除节点</a>
</div>
<div class="content_wrap">
//这里的class="ztree"必须要写的 显示不出
<div class="zTreeDemoBackground left">
<ul id="treeDemo" class="ztree"></ul>
</div>
<div class="right">
<ul id="treeDemo2" class="ztree"></ul>
</div>
</div>
</div>
</template>
<script lang='ts'>
import { defineComponent, onMounted, reactive } from 'vue'
import $ from 'jquery';
export default defineComponent({
name: 'App',
props :{
},
setup(props) {
//以下 都是ts的写法 因为要配置类型 可以和ztree官方的做对比 其实差不多 就是多了类型 我都写了any 但后期一定要改
let onDrag =(event:any, treeId:any, treeNodes:any)=> {
alert(treeNodes.length);
};
let onDrop = (event:any, treeId:any, treeNodes:any, targetNode:any, moveType:any)=>{
alert(treeNodes.length + "," + (targetNode ? (targetNode.tId + ", " + targetNode.name) : "isRoot" ));
};
let beforeDrag=(treeId:any, treeNodes:any)=> {
console.log(treeId, treeNodes,'beforeDrag');
for (var i=0,l=treeNodes.length; i<l; i++) {
if (treeNodes[i].drag === false) {
return false;
}
}
return true;
}
let beforeDrop=(treeId:any, treeNodes:any, targetNode:any, moveType:any)=> {
console.log(treeId,'b drop');
return targetNode ? targetNode.drop !== false : true;
}
let showCode=(id:any, str:any)=> {
var code = $("#code" + id);
code.empty();
for (var i=0, l=str.length; i<l; i++) {
code.append("<li>"+str[i]+"</li>");
}
}
let setCheck=()=> {
let tree:any = $.fn;
var zTree = tree.zTree.getZTreeObj("treeDemo"),
isCopy = $("#copy").attr("checked"),
isMove = $("#move").attr("checked"),
prev = $("#prev").attr("checked"),
inner = $("#inner").attr("checked"),
next = $("#next").attr("checked");
zTree.setting.edit.drag.isCopy = isCopy;
zTree.setting.edit.drag.isMove = isMove;
showCode(1, ['setting.edit.drag.isCopy = ' + isCopy, 'setting.edit.drag.isMove = ' + isMove]);
zTree.setting.edit.drag.prev = prev;
zTree.setting.edit.drag.inner = inner;
zTree.setting.edit.drag.next = next;
showCode(2, ['setting.edit.drag.prev = ' + prev, 'setting.edit.drag.inner = ' + inner, 'setting.edit.drag.next = ' + next]);
}
let newCount = 1;
let trees:any = $.fn;
// 增加子节点
let add=(e:any)=>{
var zTree = trees.zTree.getZTreeObj("treeDemo"),
isParent = e.data.isParent,
nodes = zTree.getSelectedNodes(),
treeNode = nodes[0];
if (treeNode) {
treeNode = zTree.addNodes(treeNode, {id:(100 + newCount), pId:treeNode.id, isParent:isParent, name:"new node" + (newCount++)});
} else {
treeNode = zTree.addNodes(null, {id:(100 + newCount), pId:0, isParent:isParent, name:"new node" + (newCount++)});
}
if (treeNode) {
zTree.editName(treeNode[0]);
} else {
alert("叶子节点被锁定,无法增加子节点");
}
};
// 删除子节点
let remove = (e:any) => {
var zTree = trees.zTree.getZTreeObj("treeDemo"),
nodes = zTree.getSelectedNodes(),
treeNode = nodes[0];
if (nodes.length == 0) {
alert("请先选择一个节点");
return;
}
var callbackFlag = $("#callbackTrigger").attr("checked");
zTree.removeNode(treeNode, callbackFlag);
};
//在这里要配置树所用到的功能 官网写的非常清楚了
var setting = {
edit: {
enable: true,
// 显示删除按钮
showRemoveBtn: true,
// 显示更改名称按钮
showRenameBtn: true
},
data: {
simpleData: {
enable: true
}
},
view: {
showLine: false
},
callback: {
beforeDrag: beforeDrag,
beforeDrop: beforeDrop
}
};
// 数据格式 可以是这样并列的 也可以是json嵌套的那种
var zNodes =[
{ id:1, pId:0, name:"父节点 1", open:true},
{ id:11, pId:1, name:"叶子节点 1-1"},
{ id:12, pId:1, name:"叶子节点 1-2"},
{ id:13, pId:1, name:"叶子节点 1-3"},
{ id:2, pId:0, name:"父节点 2", open:true},
{ id:21, pId:2, name:"叶子节点 2-1"},
{ id:22, pId:2, name:"叶子节点 2-2"},
{ id:23, pId:2, name:"叶子节点 2-3"},
{ id:3, pId:0, name:"父节点 3", open:true},
{ id:31, pId:3, name:"叶子节点 3-1"},
{ id:32, pId:3, name:"叶子节点 3-2"},
{ id:33, pId:3, name:"叶子节点 3-3"}
];
onMounted(()=>{
ss();
});
let ss= ()=>{
$(document).ready(function(){
// 这句话要写 要配置类型 因为在jQuery里是找不到ztree的
// 配置为any类型就不报错了 这个问题困扰了我两天 就这一句话
let tree:any = $.fn;
// $("#copy").bind("click", copy);
// $("#cut").bind("click", cut);
// $("#paste").bind("click", paste);
tree.zTree.init($("#treeDemo"), setting, zNodes);
tree.zTree.init($("#treeDemo2"), setting);
$("#addLeaf").bind("click", {isParent:false}, add);
$("#remove").bind("click", remove);
});
}
//vue3 的形式 只要定义了 所有的都得return出来 不然找不到
return {
setting,
zNodes,
ss,
beforeDrag,
beforeDrop,
setCheck,
showCode,
add,
}
}
})
</script>
<style lang='less' scoped>
//这里就是写的树的样式了 自己随意改
// @import '../../public/css/demo.css';
@import '../../public/css/zTreeStyle.css';
.about-wrap{
width:100%;
height: 100%;
.btnwrap{
display: flex;
justify-content: space-around;
color: #222;
font-size: 16px;
padding-bottom: 20px;
a{
cursor: pointer;
}
}
.treewrap{
width: 100%;
height: 100%;
display: flex;
}
.left{
width: 50%;
height: 100%;
margin: 0 auto;
float: none !important;
border: solid pink;
}
.right{
width: 50%;
height: 100%;
border:solid forestgreen
}
}
</style>
最后的呈现(左右随便来回拖 我不会放GIF 反正是这个意思 )
这才刚刚开始 以后问题还多着呢!