如何在Vue.js中调整大小时立即获取元素的宽度和高度? 这是我的代码笔插图 请帮我改变它直到工作,谢谢!
let app = new Vue({
el: '#app',
data: {
boxs: [{
width: 100,
height: 100
},
{
width: 100,
height: 100
}
]
}
});
#app {
display: flex;
justify-content: center;
align-items: center;
flex-wrap: wrap;
}
.resize {
display: flex;
justify-content: center;
align-items: center;
margin: 5px;
width: 100px;
height: 100px;
overflow: hidden;
resize: both;
background-color: #C3E2CE;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.4.4/vue.js"></script>
<div id="app">
<div v-for="box,key in boxs" class="resize">
{{ box.width }} x {{ box.height }}
</div>
</div>
答案 0 :(得分:1)
要获得响应实际调整大小操作的即时反馈,您可能需要尝试使用MutationObserver
。您可以将其附加到组件的ref
点,并在那里监听突变。
您可以在MutationObserver
功能中附加mounted
。请务必在destroyed
函数中进行所需的任何清理。
const Resizable = {
template: "<div ref='main' @resize='onResize' class='resize'>{{dims.width}} | {{dims.height}}</div>",
data() {
return {
dims: {
width: null,
height: null
}
};
},
mounted() {
const {
width,
height
} = this.$refs.main.getBoundingClientRect();
this.dims.width = width;
this.dims.height = height;
const mutationHandler = mutationList => {
for (let mutation of mutationList) {
if (mutation.type === "attributes") {
const {
width,
height
} = mutation.target.getBoundingClientRect();
this.dims.width = width;
this.dims.height = height;
}
}
};
const mo = new MutationObserver(mutationHandler);
mo.observe(this.$refs.main, {
attributes: true,
childList: true,
subtree: true
});
},
methods: {
onResize() {
console.log("Resized");
}
}
};
const app = new Vue({
el: "#app",
components: {
"resizable": Resizable
},
data() {
return {
items: [
"foo",
"bar",
"fizz"
]
}
}
});
&#13;
body {
background-color: #414141;
}
.container {
display: flex;
align-items: center;
justify-content: center;
}
.resize {
resize: both;
margin: 5px;
width: 100px;
height: 100px;
color: black;
overflow: scroll;
background-color: white;
text-align: center;
}
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.4.4/vue.js"></script>
<div id="app">
<div class="container">
<resizable v-for="item in items" :key="item" class="resize"></resizable>
</div>
</div>
&#13;
答案 1 :(得分:0)
原谅我,但我还在学习Vue。我建议你做更多的模块化方法并提取框,然后循环你想要多少。请注意,这不是最佳实践,因为w / h的框可能来自于从根元素加载的道具和数据。
const box = Vue.component("box", {
template: '<div class="resize">{{ boxWidth }} x {{ boxHeight}}</div>',
data() {
return {
boxWidth: 100,
boxHeight: 100,
};
},
mounted: function() {
this.$el.addEventListener("mouseup", this.move);
},
methods: {
move(e) {
if (e.target == this.$el) {
this.boxWidth = parseInt(this.$el.style.width);
this.boxHeight = parseInt(this.$el.style.height);
}
}
}
});
let app = new Vue({
el: "#app",
components: { box: box },
});
&#13;
#app {
display: flex;
justify-content: center;
align-items: center;
flex-wrap: wrap;
}
.resize {
display: flex;
justify-content: center;
align-items: center;
margin: 5px;
width: 100px;
height: 100px;
overflow: hidden;
resize: both;
background-color: #C3E2CE;
}
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.2/vue.js"></script>
<div id="app">
<div v-for="b in [0,1]">
<box></box>
</div>
</div>
&#13;
答案 2 :(得分:0)
简单的方法是使用普通的JS eventListener
来更改局部变量
window.addEventListener('resize', this.getWindowWidth);
data() {
return {
windowWidth:0
}
},
mounted () {
this.$nextTick(function() {
window.addEventListener('resize', this.getWindowWidth);
this.getWindowWidth()
})
},
methods: {
getWindowWidth() {
this.windowWidth = document.documentElement.clientWidth
}
}
并且不要忘记删除元件破坏时的eventListener
beforeDestroy() {
window.removeEventListener('resize', this.getWindowWidth);
}