javascript - 你可以将元素传递给 Vue 模板中的函数吗?
问题描述
我正在尝试根据元素的max-height
数量以编程方式计算和设置元素的样式。我必须在四个单独的元素上执行此操作,每个元素都有不同数量的子元素,所以我不能只创建一个计算属性。我已经有了计算max-height
函数中的逻辑,但是我无法将模板中的元素传递给函数。
我尝试了以下解决方案,但没有成功:
<div ref="div1" :style="{ maxHeight: getMaxHeight($refs.div1) }"></div>
这不起作用,因为$refs
在我将它传递给函数时尚未定义。试图传球
this
或$event.target
传球getMaxHeight()
。这也不起作用,因为this
它没有引用当前元素,并且没有事件,因为我不在v-on
事件处理程序中。
我能想到的唯一其他解决方案是创建四个计算属性,每个都getMaxHeight()
使用$ref
. 如果可能的话,我想从模板中传递元素本身。有谁知道这样做的方法,或更优雅的方法来解决这个问题?
解决方案
我最终创建了一个建议的指令。它在以下情况下尝试扩展/压缩:
- 被点击了
- 它的类改变
- 元素或其子元素更新
Vue组件:
<button @click="toggleAccordion($event.currentTarget.nextElementSibling)"></button>
<div @click="toggleAccordion($event.currentTarget)" v-accordion-toggle>
<myComponent v-for="data in dataList" :data="data"></myComponent>
</div>
......
private toggleAccordion(elem: HTMLElement): void {
elem.classList.toggle("expanded");
}
指示:
Accordion.ts
const expandable = (el: HTMLElement) => el.style.maxHeight = (el.classList.contains("expanded") ?
[...el.children].map(c => c.scrollHeight).reduce((h1, h2) => h1 + h2) : "0") + "px";
Vue.directive("accordion-toggle", {
bind: (el: HTMLElement, binding: any, vnode: any) => {
el.onclick = ($event: any) => {
expandable($event.currentTarget) ; // When the element is clicked
};
// If the classes on the elem change, like another button adding .expanded class
const observer = new MutationObserver(() => expandable(el));
observer.observe(el, {
attributes: true,
attributeFilter: ["class"],
});
},
componentUpdated: (el: HTMLElement) => {
expandable(el); // When the component (or its children) update
}
});
推荐阅读
- php - PHP 检测当前标准输出是否支持 ANSI 转义字符
- if-statement - PowerBI 多个 If 不拆分数据
- authentication - 在 Nuxt-auth fetchUser CustomStrategy 中丢失用户数据
- flutter - 如何在 Flutter 中定位小部件 toLeftOf 或 toRightOf
- html - 两个表相互重叠html
- mysql - 带有工资对的 MySQL 查询
- php - 模拟所有以特定字符串开头的方法
- c# - .net core 3.1 不加载相对路径并得到错误 404 not found
- android - Google Play 政策:如果我复制代码只是为了向学习者展示,我的应用会被禁止吗?
- clang - 如何修复介子生成不正确的链接器标志(--subsystem 控制台)