- 构建:Vue CLI 4 → Vite 5,入口迁至根 index.html(含 env-config + 主题通道 loader)
- 技术栈:Vue 2.6 → Vue 3.4,view-design → view-ui-plus 1.3.24,vue-router 3 → 4(hash)
- 壳层重写:App.vue / components/layout.vue 对齐 Notice 骨架(logo-badge、icon-* 通道图标、resolveMenuPage、crumb-home 基线)
- 机械转换:具名 slot → template #x、.sync → v-model:、@click.native、$set、beforeDestroy、/deep/ → :deep()
- render:h('Button')/h('Input') → 真组件 + 扁平 props/onClick
- 组件适配:vuedraggable 4 的 #item 插槽;vue-treeselect → @zanmato/vue3-treeselect;Page 分页改 v-model + pageSize 显式回写
- 清理:删除 Vue2 死代码(layout_old/bak/child、App.Net、codeModal、未引用组件)
- 修复:深链接首次加载被重定向到首个模块(router.isReady)
验证:vite build 通过;headless CDP 全 15 路由无异常;教师列表 2 行渲染、操作列按钮点击弹窗正常。
158 lines
4.9 KiB
Vue
158 lines
4.9 KiB
Vue
<template>
|
|
<div :id="domId" :ref="domId" class="ztree"></div>
|
|
</template>
|
|
|
|
<script>
|
|
|
|
export default {
|
|
props: {
|
|
treeData: {
|
|
type: Object,
|
|
default: () => ({})
|
|
},
|
|
setting: {
|
|
type: Object,
|
|
default: () => ({})
|
|
},
|
|
// 外部传入需要默认选中的节点id,不传则选中第一个一级节点
|
|
selectId: {
|
|
type: [Number, String],
|
|
default: null
|
|
}
|
|
},
|
|
data() {
|
|
return {
|
|
domId: "",
|
|
treeSetting: {
|
|
view: {
|
|
dblClickExpand: false,
|
|
showIcon: false,
|
|
},
|
|
check: {
|
|
enable: false,
|
|
},
|
|
callback: {},
|
|
},
|
|
};
|
|
},
|
|
watch: {
|
|
treeData(val) {
|
|
if (val && val.length) {
|
|
this.$nextTick(() => {
|
|
this.initTree(this.treeData, this.domId);
|
|
});
|
|
}
|
|
},
|
|
// 监听外部传入选中id变化,自动重新选中
|
|
selectId() {
|
|
this.$nextTick(() => {
|
|
this.handleDefaultSelect();
|
|
})
|
|
}
|
|
},
|
|
created() {
|
|
this.$watch("treeData", (val) => {
|
|
if (val) {
|
|
this.$nextTick(() => {
|
|
this.initTree(this.treeData, this.domId);
|
|
});
|
|
}
|
|
});
|
|
},
|
|
mounted() {
|
|
this.domId = this.uuid();
|
|
},
|
|
methods: {
|
|
getZtreeInstance() {
|
|
return $.fn.zTree.getZTreeObj(this.domId);
|
|
},
|
|
uuid() {
|
|
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(
|
|
/[xy]/g,
|
|
function (c) {
|
|
var r = (Math.random() * 16) | 0,
|
|
v = c == "x" ? r : (r & 0x3) | 0x8;
|
|
return v.toString(16);
|
|
}
|
|
);
|
|
},
|
|
/**
|
|
* 核心方法:根据节点id选中节点,并逐层展开所有父节点
|
|
* @param {String|Number} targetId 目标节点id
|
|
*/
|
|
selectNodeById(targetId) {
|
|
const treeObj = $.fn.zTree.getZTreeObj(this.domId);
|
|
if (!treeObj || !targetId) return;
|
|
|
|
const targetNode = treeObj.getNodeByParam('id', targetId);
|
|
if (!targetNode) return;
|
|
|
|
// 高亮选中节点
|
|
treeObj.selectNode(targetNode);
|
|
|
|
// 循环向上展开所有父节点
|
|
let currNode = targetNode;
|
|
while (currNode) {
|
|
treeObj.expandNode(currNode, true, false, false);
|
|
currNode = currNode.getParentNode();
|
|
}
|
|
},
|
|
/**
|
|
* 默认选中逻辑:有selectId选对应节点,无则选第一个一级节点
|
|
*/
|
|
handleDefaultSelect() {
|
|
const treeObj = $.fn.zTree.getZTreeObj(this.domId);
|
|
if (!treeObj) return;
|
|
|
|
const rootNodes = treeObj.getNodes();
|
|
if (!rootNodes || rootNodes.length === 0) return;
|
|
|
|
if (this.selectId !== null && this.selectId !== undefined) {
|
|
// 外部传入id,选中指定节点
|
|
this.selectNodeById(this.selectId);
|
|
} else {
|
|
// 无传入id,默认选中第一个一级节点
|
|
const firstRoot = rootNodes[0];
|
|
treeObj.selectNode(firstRoot);
|
|
treeObj.expandNode(firstRoot, true, false, false);
|
|
}
|
|
},
|
|
initTree(_data, _domId) {
|
|
const _this = this;
|
|
// 合并自定义setting
|
|
_this.treeSetting = Object.assign({}, _this.treeSetting, _this.setting);
|
|
|
|
// 绑定点击回调
|
|
_this.treeSetting.callback.onClick = (event, treeId, treeNode) => {
|
|
_this.$emit("on-tree-click", treeNode);
|
|
};
|
|
// 绑定复选框点击回调
|
|
_this.treeSetting.callback.onCheck = (event, treeId, treeNode) => {
|
|
const zTreeObj = $.fn.zTree.getZTreeObj(treeId);
|
|
// getCheckedNodes(true) 获取所有手动勾选节点,不分层级
|
|
const allChecked = zTreeObj.getCheckedNodes(true);
|
|
this.$emit('on-tree-Check', allChecked);
|
|
};
|
|
// 展开所有一级节点
|
|
var zNodes = _this.openFistNode(_data);
|
|
// 初始化树
|
|
$.fn.zTree.init($("#" + _domId), _this.treeSetting, zNodes);
|
|
// 执行默认选中逻辑
|
|
this.$nextTick(() => {
|
|
this.handleDefaultSelect();
|
|
})
|
|
},
|
|
openFistNode(_zNodes) {
|
|
if (_zNodes && _zNodes.length > 0) {
|
|
for (var i = 0; i < _zNodes.length; i++) {
|
|
_zNodes[i].open = true;
|
|
}
|
|
}
|
|
return _zNodes;
|
|
}
|
|
},
|
|
};
|
|
</script>
|
|
|
|
<style>
|
|
</style> |