近期根据需求,要作一个懒加载的组织树,而且能够编辑组织树。可是编辑成功以后,却没法进行实时更新。vue
一开始想到了不少解决方案,也在网上参考了不少方案,可是都有种种不足。遂查阅了ElementUi的tree组件源代码。node
Node.prototype.loadData = function loadData(callback) { var _this5 = this; var defaultProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; if (this.store.lazy === true && this.store.load && !this.loaded && (!this.loading || Object.keys(defaultProps).length)) { this.loading = true; var resolve = function resolve(children) { _this5.loaded = true; _this5.loading = false; _this5.childNodes = []; _this5.doCreateChildren(children, defaultProps); _this5.updateLeafState(); if (callback) { callback.call(_this5, children); } }; this.store.load(this, resolve); } else { if (callback) { callback.call(this); } } };
ps:以上代码来自node_modules/element-ui/lib/tree.jselement-ui
this明显是当前节点, 看if语句的条件中 this.loaded是当前节点是否已加载 。 resolve中把this.loaded置为了true;api
因此只用将当前节点的父节点的loaded属性置为false就好了。 这样再次点击该节点时,会继续请求懒加载方法。fetch
//节点更新成功后的操做 orgSuccess(){ //若是是新增子节点,则刷新当前节点 ,若是是更新当前节点,刷新父节点 let node = this.isNew?this.rightNode:this.rightNode.parent; node.loaded=false; node.isLeaf = false; this.$set(node,'expanded',false); this.fetchData(); },
PS1 : 这里为了交互更人性化,我将isLeaf和expanded属性也置为了false。
PS2 : 光修改属性是没法触发视图更新的,这里我经过了vue.set()方法来触发视图更新。 vue.set()的用法见官方文档:https://cn.vuejs.org/v2/api/#...ui
初来乍到,有什么不足或者不对的地方请你们指正!this