iview/src/components/tree/tree.vue

110 lines
3.5 KiB
Vue
Raw Normal View History

<template>
2017-03-24 20:52:14 +08:00
<div :class="prefixCls">
<Tree-node
2017-03-24 21:06:49 +08:00
v-for="item in data"
2017-03-24 20:52:14 +08:00
:key="item"
:data="item"
visible
:multiple="multiple"
:show-checkbox="showCheckbox">
</Tree-node>
</div>
</template>
<script>
2017-03-24 20:52:14 +08:00
import TreeNode from './node.vue';
import { findComponentsDownward } from '../../utils/assist';
2017-03-03 11:00:11 +08:00
import Emitter from '../../mixins/emitter';
2017-03-24 20:52:14 +08:00
import { t } from '../../locale';
2017-02-07 11:34:00 +08:00
const prefixCls = 'ivu-tree';
export default {
name: 'Tree',
2017-03-03 11:00:11 +08:00
mixins: [ Emitter ],
2017-03-24 20:52:14 +08:00
components: { TreeNode },
2017-02-07 11:34:00 +08:00
props: {
data: {
2017-02-07 11:34:00 +08:00
type: Array,
default () {
return [];
}
},
multiple: {
type: Boolean,
default: false
},
showCheckbox: {
type: Boolean,
default: false
},
emptyText: {
type: String,
default () {
return t('i.tree.emptyText');
}
}
},
data () {
2017-02-07 11:34:00 +08:00
return {
2017-03-24 21:06:49 +08:00
prefixCls: prefixCls
2017-02-07 11:34:00 +08:00
};
},
2017-02-07 11:34:00 +08:00
methods: {
2017-03-24 20:52:14 +08:00
getSelectedNodes () {
const nodes = findComponentsDownward(this, 'TreeNode');
return nodes.filter(node => node.data.selected).map(node => node.data);
},
2017-03-24 21:06:49 +08:00
updateData (isInit = true) {
2017-03-24 20:52:14 +08:00
// init checked status
function reverseChecked(data) {
if (data.children) {
let checkedLength = 0;
data.children.forEach(node => {
if (node.children) node = reverseChecked(node);
if (node.checked) checkedLength++;
});
2017-03-24 21:06:49 +08:00
if (isInit) {
if (checkedLength >= data.children.length) data.checked = true;
} else {
data.checked = checkedLength >= data.children.length;
}
2017-03-24 20:52:14 +08:00
return data;
2017-02-07 11:34:00 +08:00
} else {
2017-03-24 20:52:14 +08:00
return data;
2017-02-07 11:34:00 +08:00
}
}
2017-03-24 20:52:14 +08:00
function forwardChecked(data) {
if (data.children) {
data.children.forEach(node => {
if (data.checked) node.checked = true;
if (node.children) node = forwardChecked(node);
2017-03-24 20:50:13 +08:00
});
2017-03-24 20:52:14 +08:00
return data;
2017-03-24 20:50:13 +08:00
} else {
2017-03-24 20:52:14 +08:00
return data;
2017-03-24 20:50:13 +08:00
}
2017-02-07 11:34:00 +08:00
}
2017-03-24 21:06:49 +08:00
this.data.map(node => reverseChecked(node)).map(node => forwardChecked(node));
2017-03-24 20:52:14 +08:00
this.broadcast('TreeNode', 'indeterminate');
2017-02-07 11:34:00 +08:00
}
},
mounted () {
2017-03-24 20:52:14 +08:00
this.updateData();
2017-02-07 11:34:00 +08:00
2017-03-24 20:52:14 +08:00
this.$on('selected', ori => {
const nodes = findComponentsDownward(this, 'TreeNode');
nodes.forEach(node => {
this.$set(node.data, 'selected', false);
2017-02-07 15:29:53 +08:00
});
2017-03-24 20:52:14 +08:00
this.$set(ori, 'selected', true);
2017-02-07 11:34:00 +08:00
});
2017-03-24 20:52:14 +08:00
this.$on('on-selected', () => {
this.$emit('on-select-change', this.getSelectedNodes());
2017-02-07 11:34:00 +08:00
});
2017-03-24 20:52:14 +08:00
this.$on('checked', () => {
2017-03-24 21:06:49 +08:00
this.updateData(false);
2017-02-07 11:34:00 +08:00
});
}
};
</script>