35 lines
750 B
TypeScript
35 lines
750 B
TypeScript
|
import { Directive } from 'vue';
|
|||
|
|
|||
|
export default {
|
|||
|
mounted(src, binding, vn) {
|
|||
|
const calc = () => {
|
|||
|
const height = src.clientHeight;
|
|||
|
const width = src.clientWidth;
|
|||
|
|
|||
|
// 要素が(一時的に)DOMに存在しないときは計算スキップ
|
|||
|
if (height === 0) return;
|
|||
|
|
|||
|
binding.value(width, height);
|
|||
|
};
|
|||
|
|
|||
|
calc();
|
|||
|
|
|||
|
// Vue3では使えなくなった
|
|||
|
// 無くても大丈夫か...?
|
|||
|
// TODO: ↑大丈夫じゃなかったので解決策を探す
|
|||
|
//vn.context.$on('hook:activated', calc);
|
|||
|
|
|||
|
const ro = new ResizeObserver((entries, observer) => {
|
|||
|
calc();
|
|||
|
});
|
|||
|
ro.observe(src);
|
|||
|
|
|||
|
src._get_size_ro_ = ro;
|
|||
|
},
|
|||
|
|
|||
|
unmounted(src, binding, vn) {
|
|||
|
binding.value(0, 0);
|
|||
|
src._get_size_ro_.unobserve(src);
|
|||
|
}
|
|||
|
} as Directive;
|