vue项目 实现resize
监听窗口大小变化
在Vue项目中,可以通过监听window的resize事件来实现响应式布局或动态调整组件尺寸。以下是一个基本实现方法:
mounted() {
window.addEventListener('resize', this.handleResize);
this.handleResize(); // 初始化调用一次
},
beforeDestroy() {
window.removeEventListener('resize', this.handleResize);
},
methods: {
handleResize() {
this.windowWidth = window.innerWidth;
this.windowHeight = window.innerHeight;
// 其他根据窗口大小变化的逻辑
}
}
使用ResizeObserver API
对于监听DOM元素尺寸变化(而非窗口),推荐使用现代浏览器支持的ResizeObserver API:
data() {
return {
resizeObserver: null,
elementWidth: 0
}
},
mounted() {
this.resizeObserver = new ResizeObserver(entries => {
for (let entry of entries) {
this.elementWidth = entry.contentRect.width;
}
});
this.resizeObserver.observe(this.$refs.myElement);
},
beforeDestroy() {
this.resizeObserver.disconnect();
}
防抖优化处理
频繁的resize事件可能影响性能,建议添加防抖函数:
methods: {
debounceResize: _.debounce(function() {
// 实际处理逻辑
console.log('Resized:', window.innerWidth);
}, 200),
handleResize() {
this.debounceResize();
}
}
组件内局部resize
如果只需要监听某个特定组件的尺寸变化,可以使用自定义指令:
Vue.directive('resize', {
bind(el, binding) {
const callback = binding.value;
const observer = new ResizeObserver(entries => {
callback(entries[0].contentRect);
});
observer.observe(el);
el._resizeObserver = observer;
},
unbind(el) {
el._resizeObserver.disconnect();
}
});
使用方式:
<div v-resize="onResize"></div>
响应式设计辅助
结合CSS媒体查询和Vue数据绑定实现更完整的响应式方案:
computed: {
screenType() {
if (this.windowWidth < 768) return 'mobile';
if (this.windowWidth < 992) return 'tablet';
return 'desktop';
}
}






