Skip to content

Commit be4f1da

Browse files
committed
fix: optimize code
1 parent 83e5f68 commit be4f1da

File tree

6 files changed

+93
-21
lines changed

6 files changed

+93
-21
lines changed

src/App.vue

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<template>
22
<div id="app">
33
<Tree :tree-data="demeData"
4+
expandedAll
45
show-checkbox
56
hasHalfelEction
67
draggable
@@ -12,6 +13,7 @@
1213
<span class="icon">-</span>
1314
</template> -->
1415
</Tree>
16+
<!-- <List :data="baseData" bordered /> -->
1517
<!-- <img alt="Vue logo" src="./assets/logo.png"> -->
1618
<!-- <Dropdown @on-click="handleClick" trigger="click">
1719
<DropdownMenu transfer slot="dropdownList">
@@ -25,13 +27,15 @@
2527

2628
<script>
2729
import Tree from './components/Tree'
30+
import Mock from './utils/mock'
2831
export default {
2932
name: 'App',
3033
components: {
3134
Tree
3235
},
3336
data () {
3437
return {
38+
baseData: [],
3539
demeData: [
3640
{
3741
name: "一级 1",
@@ -44,19 +48,19 @@ export default {
4448
{
4549
name: "三级 1-1-1",
4650
id: "3",
51+
selected: true,
4752
children: [
4853
{
4954
name: "四级 1-1-1-1",
5055
id: "4",
5156
children: [],
52-
selected: true,
5357
disabled: false,
5458
},
5559
{
5660
name: "四级 1-1-1-2",
5761
id: "5",
5862
children: [],
59-
selected: true,
63+
// selected: true,
6064
},
6165
],
6266
},
@@ -124,7 +128,26 @@ export default {
124128
]
125129
}
126130
},
131+
created () {
132+
this.genBaseData()
133+
},
127134
methods: {
135+
genBaseData () {
136+
const start = Math.round(Math.random())
137+
const end = start + Math.round(Math.random() * 4)
138+
const res = Mock.mock({
139+
'data|10': [
140+
{
141+
'id': /[a-z]{2}[A-Z]{2}[0-9]/,
142+
'status|1': ['success', 'fail'],
143+
'tags|1-2': ['success', 'normal', 'warning', 'error'].slice(start, end),
144+
'time': '@date("yyyy-MM-dd")',
145+
'name': "@ctitle(4,6)",
146+
}
147+
]
148+
})
149+
this.baseData = res.data
150+
},
128151
handleClick (data) {
129152
console.log(data)
130153
},
@@ -176,5 +199,12 @@ export default {
176199
}
177200
.rotate-motion(rotate90, 90deg);
178201
.rotate-motion(rotate180, 180deg);
202+
.el-tree__drop-indicator {
203+
position: absolute;
204+
left: 0;
205+
right: 0;
206+
height: 1px;
207+
background-color: #409eff;
208+
}
179209
180210
</style>

src/components/Tree.js

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export default {
2121
props: {
2222
expandedAll: {
2323
type: Boolean,
24-
default: true,
24+
default: false,
2525
},
2626
checkStrictly: {
2727
type: Boolean,
@@ -72,30 +72,45 @@ export default {
7272
isInitData: false
7373
},
7474
checkedNodes: [],
75-
checkedNodeKeys: []
75+
checkedNodeKeys: [],
76+
selectedNodes: []
7677
}
7778
},
7879
created() {
79-
this.walk();
80+
this.initData(); //init
81+
// this.isInitData = true //
8082
console.log(this.checkedNodeKeys)
8183
console.log(this.checkedNodes)
8284

8385
},
8486
methods: {
85-
walk(root = this.root) {
86-
const { children = [] } = root;
87-
children?.forEach((child) => {
87+
initData(root = this.root) {
88+
// const { children = [] } = root;
89+
/*children?.forEach((child) => {
8890
const { data } = child;
8991
// TODO 保存选中的值
9092
this.getCheckedValue(child)
9193
if (data.selected && !this.checkStrictly) {
92-
this.refreshUp(child);
94+
// this.refreshUp(child);
95+
9396
this.refreshDown(child);
9497
} else {
95-
this.walk(child);
98+
this.initData(child);
9699
}
97-
});
98-
this.isInitData = true
100+
});*/
101+
const selectedNodes = []
102+
this.recurTree(root, selectedNodes)
103+
selectedNodes.forEach((node) => {
104+
this.refreshUp(node)
105+
this.refreshDown(node)
106+
})
107+
this.recurTree(root, this.selectedNodes)
108+
},
109+
recurTree(node, db){
110+
if(node.isSelected()){
111+
db.push(node)
112+
}
113+
node?.children?.forEach((child) => this.recurTree(child, db))
99114
},
100115
refreshExpandedDown(node) {
101116
// eslint-disable-next-line no-debugger
@@ -144,7 +159,7 @@ export default {
144159
node?.children.forEach((child) => {
145160
const fromState = child.isSelected();
146161
// TODO 遍历children 初始化数据 不能直接跳出
147-
if (fromState === toState || !this.isInitData) {
162+
if (fromState === toState) {
148163
return
149164
}
150165

@@ -223,7 +238,7 @@ export default {
223238
if (dropPrev || dropInner || dropNext) {
224239
dragInfo.dropNode = dropNode;
225240
}
226-
console.log('dropNode', dropNode)
241+
// console.log('dropNode', dropNode)
227242
// TODO 这里的逻辑需要实现
228243
if (dropNode.node.nextSibling === draggingNode.node) {
229244
dropNext = false;
@@ -359,7 +374,7 @@ export default {
359374
return <TreeNode key={node?.data?.name ?? index} node={node} />;
360375
})}
361376
<div
362-
style={{display: this.dragInfo.showDropIndicator? 'none' : 'block'}}
377+
style={{display: this.dragInfo.showDropIndicator? 'block': 'none'}}
363378
class="el-tree__drop-indicator"
364379
ref="dropIndicator"></div>
365380
</div>

src/components/TreeData.js

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,12 @@ export default class TreeData {
77
setParent(node) {
88
this.parent = node;
99
}
10-
addChild(node) {
11-
this.children.push(node);
10+
addChild(node, index = -1) {
11+
if(index === -1){
12+
this.children.push(node);
13+
}else{
14+
this.children.splice(index, 0, node)
15+
}
1216
node.setParent(this);
1317
}
1418
isSelected() {
@@ -108,5 +112,18 @@ export default class TreeData {
108112
this.children.splice(index, 0, child);
109113
}
110114
}
115+
116+
moveNode(node, toParent, toIndex = -1){
117+
const fromIndex = this.getIndex(node)
118+
node.parent.children.splice(fromIndex, 1)
119+
toParent.addChild(node, toIndex)
120+
}
121+
122+
getIndex(node){
123+
if(!node?.parent){
124+
return 0
125+
}
126+
return node.parent.indexOf(node)
127+
}
111128

112129
}

src/components/TreeNode.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,13 @@ export default {
5555
return (name && <div
5656
style={`margin-left: ${level * 10}px; margin-bottom: 6px; display: inline-block;`}
5757
>
58-
{node.children && node.children.length? <span class={['icon', 'sh__expand-icon', expanded ? 'rotate180-enter icon-expand' : 'rotate180-leave icon-unexpand']} onClick={() => this.toggleFold(node)} style="padding: 1px; background: #eee; cursor: pointer"></span> : null}
58+
{<span class={['icon', 'sh__expand-icon', expanded ? 'rotate180-enter icon-expand' : 'rotate180-leave icon-unexpand']} onClick={() => this.foldToggle(node)} style={{padding: 1, background: '#eee', cursor: 'pointer', visibility: node.children && node.children.length ? 'visible' : 'hidden'}}></span>}
5959
{ partialSelected && `-`}
6060
{this.tree.showCheckbox && <input type='checkbox' disabled={disabled} checked={selected} onClick={() => this.selectToggle(node)} />}
6161
{ renderTreeNode ? renderTreeNode(node) : defaultSlot? defaultSlot({node}): <span>{name}</span> }
6262
</div>)
6363
},
64-
toggleFold(node) {
64+
foldToggle(node) {
6565
Object.assign(node.data, {expanded: !node.data.expanded})
6666
if (!node.data.expanded) {
6767
this.tree.refreshExpandedDown(node)

src/utils/mock.js

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vue.config.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ const cdn = {
77
'shsc-ui': 'shscUI'
88
},
99
css: [
10-
'https://testcdnqiniu.shuhaisc.com/shsc-ui/3.5.6/index.css'
10+
'https://uatcdnqiniu.shuhaisc.com/shsc-ui/3.5.7/index.css'
1111
],
1212
js: [
13-
'https://testcdnqiniu.shuhaisc.com/shsc-ui/3.5.6/index.umd.min.js'
13+
'https://uatcdnqiniu.shuhaisc.com/shsc-ui/3.5.7/index.umd.min.js'
1414
]
1515
}
1616

0 commit comments

Comments
 (0)