Skip to content

Commit d68d051

Browse files
committed
refactor tree
1 parent b85ca4b commit d68d051

File tree

16 files changed

+1475
-182
lines changed

16 files changed

+1475
-182
lines changed

src/App.vue

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,26 +8,12 @@
88
draggable
99
@on-checkbox-change="handleChangeCheckBox"
1010
@on-checked-item="handleChangeItem">
11-
<!-- <template v-slot="{node}">
12-
<span>{{ node.data.name }}</span>
13-
<span class="icon">+</span>
14-
<span class="icon">-</span>
15-
</template> -->
1611
</Tree>
17-
<!-- <List :data="baseData" bordered /> -->
18-
<!-- <img alt="Vue logo" src="./assets/logo.png"> -->
19-
<!-- <Dropdown @on-click="handleClick" trigger="click">
20-
<DropdownMenu transfer slot="dropdownList">
21-
<DropdownItem data="上海">上海</DropdownItem>
22-
<DropdownItem data="北京">北京</DropdownItem>
23-
<DropdownItem data="西安">西安</DropdownItem>
24-
</DropdownMenu>
25-
</Dropdown> -->
2612
</div>
2713
</template>
2814

2915
<script>
30-
import Tree from './components/Tree'
16+
import Tree from './components/Tree/Tree'
3117
import Mock from './utils/mock'
3218
export default {
3319
name: 'App',
@@ -376,4 +362,39 @@ export default {
376362
color: #fff;
377363
}
378364
}
365+
.vue-checkbox {
366+
position: relative;
367+
width: 13px;
368+
height: 13px;
369+
&-input {
370+
position: absolute;
371+
width: 100%;
372+
height: 100%;
373+
top: 0;
374+
left: 0;
375+
z-index: 3;
376+
background: transparent
377+
}
378+
&-indeterminate {
379+
box-sizing: border-box;
380+
position: absolute;
381+
width: 100%;
382+
height: 100%;
383+
left: 0;
384+
top: 0;
385+
background: #0075ff;
386+
z-index: 4;
387+
border-radius: 3px;
388+
&:after {
389+
position: absolute;
390+
content: '';
391+
width: 100%;
392+
height: 2px;
393+
background: #fff;;
394+
top: 50%;
395+
left: 0;
396+
}
397+
}
398+
}
399+
379400
</style>

src/components/Tree/Checkbox.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
2+
3+
const prefixCls = 'vue-checkbox'
4+
5+
export default {
6+
name: 'Checkbox',
7+
props: {
8+
value: [Boolean],
9+
indeterminate: [Boolean],
10+
disabled: [Boolean]
11+
},
12+
methods: {
13+
handleClick () {
14+
this.$emit('change', this.value)
15+
}
16+
},
17+
render () {
18+
const { value, disabled, indeterminate, handleClick } = this
19+
return (
20+
<div class={prefixCls} onClick={handleClick}>
21+
{ indeterminate && <div class={`${prefixCls}-indeterminate`}></div> }
22+
<input class={`${prefixCls}-input`} checked={value} disabled={disabled} type="checkbox" />
23+
</div>
24+
)
25+
}
26+
}

src/components/Tree/GenTree.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import TreeData from './TreeData'
2+
export default {
3+
name: 'GenTree',
4+
data () {
5+
return {
6+
nodeMap: {}
7+
}
8+
},
9+
methods: {
10+
updateNodeChecked (nodeId) {
11+
if (!nodeId || nodeId === 'root') return
12+
const res = {
13+
checked: this.showCheckbox,
14+
selected: !this.showCheckbox
15+
}
16+
if ((Array.isArray(this.checkedValue) && this.checkedValue.includes(nodeId)) || this.checkedValue === nodeId) {
17+
return res
18+
}
19+
},
20+
generateTree (rootNode, props, level = 0) {
21+
const { children, ...rest } = rootNode
22+
const tmpProps = {}
23+
if (rest.id === 'root') { // root node must expanded
24+
tmpProps.expanded = true
25+
}
26+
const node = new TreeData({ ...rest, ...props, ...tmpProps, level, ...this.updateNodeChecked(rest.id) })
27+
this.nodeMap[rest.id] = node
28+
children && children.forEach((child) => {
29+
node.addChild(this.generateTree(child, props, level + 1))
30+
})
31+
return node
32+
},
33+
genFlatTree (node) {
34+
const { children, data = {} } = node
35+
if (!data.expanded || !children || !children.length) return []
36+
return children && children.reduce((total, cur) => {
37+
return total.concat(cur, this.genFlatTree(cur))
38+
}, [])
39+
}
40+
41+
}
42+
}
43+
44+
// export { generateTree, genFlatTree }

0 commit comments

Comments
 (0)