为ElementUI的标签页添加生命周期
在现有ElementUI下,子组件是不知道自己所属的标签页是否处于开启状态的。
下面写一个Vue的指令让子组件知道
实现
【为ElementUI的标签页添加生命周期】请看逐行注释。
type TabPaneChildren = {
elPaneActivated?: () => unknown;
$children: TabPaneChildren[];
};
/**
* 调用所有子孙组件的 elPaneActivated方法
*
*/
function callOnShow(instances: TabPaneChildren[]) {
//遍历子组件
instances.forEach((ins) => {
//如果当前组件有elPaneActivated方法,则调用。
ins.elPaneActivated && ins.elPaneActivated();
//对当前组件的子组件递归调用callOnShow。
if (ins.$children.length > 0) {
callOnShow(ins.$children);
}
});
}Vue.directive("tabs-lifecycle", {
inserted(_el, _binding, vnode) {
// 获取需要添加生命周期方法的ElTabs的实例
const ins: any = vnode.componentInstance;
// 获取所有ELPane的实例
const panes: any[] = ins.$children.filter((k: any) => k.$vnode.tag?.includes("ElTabPane")) ??
[];
// 监听ElTabs的tab-click事件。详见官网文档。
ins.$on("tab-click", async () => {
// Promise.resolve()的效果等于 Vue.$nextTick();
// 这一行也可改成ins.$nextTick();
await Promise.resolve();
// 遍历ElPane实例
panes.forEach((pane) => {
// 看源码可知ElPane的active属性代表当前ElPane是否被打开了
// 从Vue devtool中也可以得知这一点。
if (!pane.active) return;
// 从pane的实例上抛出一个激活事件。可以直接在模板中监听
pane.$emit("active");
// 调用callOnShow方法,该方法会递归pane的所有的子孙组件,并调用他们的elPaneActivated方法,如果有的话。
callOnShow([pane]);
});
});
},
});
使用
- 首先需要在ElTabs上使用这个指令
....
- 在某个子组件中
elPaneActivated(){ //当前组件所属的标签被打开了 }
- 在模板中
监听ElTabPane的active事件即可
完。
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量