ResizeObserver
简单说下 ResizeObserver 的用法
- new ResizeObserver(fn) 接受一个回调函数
- 回调函数默认是接受一个数组
- 数组第一项就是你传入的需要改变大小dom。
- 在回调函数内部改变大小。
- 观察者在vue需要 在合适时机打开关闭
例子
ts
const observer = new ResizeObserver(entries => {
for (let entry of entries) {
console.log('entry:', entry);
// 减去导航栏捣鼓 减去卡片高度
(entry.target as HTMLElement).style.height = (window.innerHeight - 55 - 290) + 'px';
}
})
onMounted(() => {
nextTick(() => {
if (expanded.value.length) {
observer.observe(domRef.value)
}
})
})
onUnmounted(() => {
observer.disconnect()
})
ResizeObserver:再次大小观察者意思
用途 :用于 js操作大小样式 在dom渲染之后再次改变大小。
获取dom 大小的Api
ts
window.innerHeight 视口的大小
获取slot传进来的dom
ts
//html
<div ref="slotContainer" class="slot-container">
<slot></slot>
</div>
//ts
// 使用template ref获取slot容器元素
const slotContainer = ref<HTMLElement>()
const getSlotContent = () => {
return slotContainer.value?.firstElementChild as HTMLElement
}
// firstElementChild 重点 ,不能把ref直接写到template 和slot上面
nextTick
这里也能发现 vue nextTick 的用途,但不太明显。
比如你要完成先将当前dom移到视口顶部,再在dom后面插入一个div ,这样一个需求。 涉及到一个函数两个ui调整,vue有搜集响应式,最后触发,如果没有nextTick 就会没有中间动画过程。 我们使用nextTick 就可以实现,先插入dom,再滚动到顶部。
ts
// 处理点击事件
const handleClick = async () => {
if (props.isActive) {
emit('activate', null); // 关闭激活项
placeholderHeight.value = 0;
return;
}
emit('activate', props.id); // 激活当前项
placeholderHeight.value = getDetailHeight();
// 等待 DOM 更新完成
await nextTick();
// 滚动到顶部
const itemEl = itemRef.value;
if (itemEl) {
itemEl.scrollIntoView({ behavior: 'smooth', block: 'start' });
}
};