123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- <template>
- <div class="el-tree" :class="{ 'el-tree--highlight-current': highlightCurrent }">
- <el-tree-node
- v-for="child in root.childNodes"
- :node="child"
- :props="props"
- :key="getNodeKey(child)"
- :render-content="renderContent"
- @node-expand="handleNodeExpand">
- </el-tree-node>
- <div class="el-tree__empty-block" v-if="!root.childNodes || root.childNodes.length === 0">
- <span class="el-tree__empty-text">{{ emptyText }}</span>
- </div>
- </div>
- </template>
- <script>
- import TreeStore from './model/tree-store';
- import ElTreeNode from './tree-node.vue';
- import {t} from 'element-ui/src/locale';
- import emitter from 'element-ui/src/mixins/emitter';
- export default {
- name: 'ElTree',
- mixins: [emitter],
- components: {
- ElTreeNode
- },
- data() {
- return {
- store: null,
- root: null,
- currentNode: null
- };
- },
- props: {
- data: {
- type: Array
- },
- emptyText: {
- type: String,
- default() {
- return t('el.tree.emptyText');
- }
- },
- nodeKey: String,
- checkStrictly: Boolean,
- defaultExpandAll: Boolean,
- expandOnClickNode: {
- type: Boolean,
- default: true
- },
- checkDescendants: {
- type: Boolean,
- default: false
- },
- autoExpandParent: {
- type: Boolean,
- default: true
- },
- defaultCheckedKeys: Array,
- defaultExpandedKeys: Array,
- renderContent: Function,
- showCheckbox: {
- type: Boolean,
- default: false
- },
- props: {
- default() {
- return {
- children: 'children',
- label: 'label',
- icon: 'icon',
- disabled: 'disabled'
- };
- }
- },
- lazy: {
- type: Boolean,
- default: false
- },
- highlightCurrent: Boolean,
- load: Function,
- filterNodeMethod: Function,
- accordion: Boolean,
- indent: {
- type: Number,
- default: 18
- }
- },
- computed: {
- children: {
- set(value) {
- this.data = value;
- },
- get() {
- return this.data;
- }
- }
- },
- watch: {
- defaultCheckedKeys(newVal) {
- this.store.defaultCheckedKeys = newVal;
- this.store.setDefaultCheckedKey(newVal);
- },
- defaultExpandedKeys(newVal) {
- this.store.defaultExpandedKeys = newVal;
- this.store.setDefaultExpandedKeys(newVal);
- },
- data(newVal) {
- this.store.setData(newVal);
- }
- },
- methods: {
- filter(value) {
- if (!this.filterNodeMethod) throw new Error('[Tree] filterNodeMethod is required when filter');
- this.store.filter(value);
- },
- getNodeKey(node, index) {
- const nodeKey = this.nodeKey;
- if (nodeKey && node) {
- return node.data[nodeKey];
- }
- return index;
- },
- getCheckedNodes(leafOnly) {
- return this.store.getCheckedNodes(leafOnly);
- },
- getCheckedKeys(leafOnly) {
- return this.store.getCheckedKeys(leafOnly);
- },
- getCurrentNode() {
- const currentNode = this.store.getCurrentNode();
- return currentNode ? currentNode.data : null;
- },
- getCurrentKey() {
- if (!this.nodeKey) throw new Error('[Tree] nodeKey is required in getCurrentKey');
- const currentNode = this.getCurrentNode();
- return currentNode ? currentNode[this.nodeKey] : null;
- },
- setCheckedNodes(nodes, leafOnly) {
- if (!this.nodeKey) throw new Error('[Tree] nodeKey is required in setCheckedNodes');
- this.store.setCheckedNodes(nodes, leafOnly);
- },
- setCheckedKeys(keys, leafOnly) {
- if (!this.nodeKey) throw new Error('[Tree] nodeKey is required in setCheckedKeys');
- this.store.setCheckedKeys(keys, leafOnly);
- },
- setChecked(data, checked, deep) {
- this.store.setChecked(data, checked, deep);
- },
- setCurrentNode(node) {
- if (!this.nodeKey) throw new Error('[Tree] nodeKey is required in setCurrentNode');
- this.store.setUserCurrentNode(node);
- },
- setCurrentKey(key) {
- if (!this.nodeKey) throw new Error('[Tree] nodeKey is required in setCurrentKey');
- this.store.setCurrentNodeKey(key);
- },
- handleNodeExpand(nodeData, node, instance) {
- this.broadcast('ElTreeNode', 'tree-node-expand', node);
- this.$emit('node-expand', nodeData, node, instance);
- },
- updateKeyChildren(key, data) {
- if (!this.nodeKey) throw new Error('[Tree] nodeKey is required in updateKeyChild');
- this.store.updateChildren(key, data);
- }
- },
- created() {
- this.isTree = true;
- this.store = new TreeStore({
- key: this.nodeKey,
- data: this.data,
- lazy: this.lazy,
- props: this.props,
- load: this.load,
- currentNodeKey: this.currentNodeKey,
- checkStrictly: this.checkStrictly,
- checkDescendants: this.checkDescendants,
- defaultCheckedKeys: this.defaultCheckedKeys,
- defaultExpandedKeys: this.defaultExpandedKeys,
- autoExpandParent: this.autoExpandParent,
- defaultExpandAll: this.defaultExpandAll,
- filterNodeMethod: this.filterNodeMethod
- });
- this.root = this.store.root;
- }
- };
- </script>
|