前情:系统需要一条条显示表格数据,让外Modal自适应表格高度,表头不动,表格内容实时滚动到最新一条。
实现:使用watchEffect监听元素高度变化,并实时设置表格的scroll:{y:},同时重新计算modal高度。
let theadH = Number(
document.querySelectorAll('.check .ant-table-thead')[0].clientHeight || 0,
);
let frontH = document.querySelectorAll('.checkfront')[0].clientHeight;
stop.value = watchEffect(() => {
let t = getDataSource().length; //此数据被监听,不是无用数据
let modalH = document.querySelectorAll('.ant-modal-body .scrollbar__wrap')[0].clientHeight;
document
.querySelectorAll('.check .ant-table-tbody')[0]
.scrollIntoView({ behavior: 'smooth', block: 'end' });
setProps({ scroll: { y: modalH - frontH - theadH } });
emit('redo'); //使用此组件处传@redo="redoModalHeight"
});
上述代码段写在一个方法内,故在外定义变量stop来接收watchEffect,并将其写于函数内,方便组件外部调用:
function handleStop() {
unref(stop)();
}
return {
handleStop,
};
在modal中:
async function handleVisibleChange(visible: boolean) {
if (!visible) {
checkRisk.value.setTableData([]);
checkRisk.value.handleStop();
}
}
如果关闭弹窗时不停止监听(checkRisk.value.handleStop()),则第二次打开弹窗时,控制台报警告并死循环,程序卡死。警告如下:
Maximum recursive updates exceeded. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function