摸鱼君删除子评论!
评论删除简单嘛,删除了就更新列表。
问题是子评论的删除
子评论是懒加载,也就是说,你点开的时候,才会去加载子评论,你删除以后,只加载子评论可以了。
而elementui里头,我点击展开时会有回调方法
onSubCommentListLoad(tree, treeNode, resolve) {
console.log(tree);
console.log(treeNode);
console.log(resolve);
let commentId = tree.id;
api.getSubCommentList(commentId).then(result => {
if (result.code === api.CODE_SUCCESS) {
resolve(result.data);
} else {
resolve([]);
}
})
}
也就是加载回来,然后把数据放到resolve里头去。
可是,我删除的时候没有这个resolve呀。
怎么办呢?
前面有数据请求回来,扔到resolve里,就可以更新子列表了。也就是说,我找到resolve是如何更新的,这个问题就解决了。
看源码吧。但是源码怎么调用的不知道呀。
输出调用栈:
console.trace("stack is: ");
这不就有了嘛
然后呢?
看源码咯:
这里的源码很简单
重点是这句:
if (data.length) {
_this.$set(lazyTreeNodeMap, key, data);
}
其实就是给lazyTreeNodeMap,设置key的值为data
那这个map是在哪里的呢?
okay,在states里,那好办了,也就是我改states里的lazyTreeNodeMap就可以更新子列表了。
开干
删除--->把整个item作为参数传过来。
doDelete(item) {
console.log(item);
}
先输出item
展开,可以找到lazyTreeNodeMap
到此,我们就找到这个数据Map了
我写的代码如下:
删除成功以后:
let itemId = item.row.id;
let list = item.store.states.lazyTreeNodeMap[item.row.commentId];
let that = this;
list.forEach((subItem, index) => {
if (subItem.id === itemId) {
list.splice(index, 1);
}
});
if (list.length === 0) {
that.contentList.forEach(parentItem => {
if (item.row.commentId === parentItem.id) {
console.log("update hasChildren");
parentItem.hasChildren = false;
}
})
}
效果
okay,今天就水到这里以,晚安。