如何根据父元素是不是具有特定类来设置 vue 组件属性?

Posted

技术标签:

【中文标题】如何根据父元素是不是具有特定类来设置 vue 组件属性?【英文标题】:How to set vue component property based on if parent element has a specific class?如何根据父元素是否具有特定类来设置 vue 组件属性? 【发布时间】:2020-09-23 07:14:05 【问题描述】:

我的父组件中有这个结构:

<div class="section" >
    <VRVideoPage :isActive="false"></VRVideoPage>
</div>

通过第三方工具,“section”-div 可能会添加一个名为“active”的 css 类。

我现在想将 VRVideoPage 组件上的 ":isActive" 属性切换为 true,每当活动类应用于其父级时。

这可以通过 vue 模板语法实现吗?

【问题讨论】:

类属性不是反应性的。您应该通过第三方工具将 active 类添加到 data 部分中的道具。这样你就可以在 div 部分中使用 prop moth 并传递给 VRVideoPage 谢谢@Anatoly。这为我指明了正确的方向 【参考方案1】:

你可以这样尝试,但这不是一个好的做法,可能行不通:

<div class="section" >
    <VRVideoPage ref="video" :isActive="$refs.video.$el.parentNode.classList.contains('active')"></VRVideoPage>
</div>

【讨论】:

如果我们这样做,您可以将其缩短为仅使用$el.parentNode(应该是组件的根节点)。不需要裁判。即使我认为,您的示例也应该返回包装器 div(在组件中)。 如果您按照您建议的方式缩短它 - 那么$el 将引用当前组件/模板而不是VRVideoPage 组件。我们可以将 ref 放在外部 DIV 上,然后跳过 parentNode - 但是如果某些 3rd 方脚本更改 DOM 树,则无法保证 ref 将继续存在... Ehh 但是div.section 和$el 一样(组件的根元素),实际上和你的$refs.video.$el.parentNode 一样,你选择了第一个孩子,然后用parentNode 回去?所以那将是$el,除非你走出我认为他想要的组件,因此$el.parentNode 我承认你说的是真的——但前提是显示的代码是他的整个模板,而不仅仅是它的摘录(因为他说的是I have this structure in my component而不是This is the template of my component 谢谢大家。 parentNode 是一个非常有用的东西。 @Anatoly 在我原来的问题下的评论为我指明了正确的方向,提到类属性没有反应。

以上是关于如何根据父元素是不是具有特定类来设置 vue 组件属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何选择具有特定类的最后一个元素,而不是父级中的最后一个子元素?

仅当子容器具有内容时,如何将类添加到特定的父元素

在特定元素之后附加动态 vue 组件

javascript:仅当父元素处于活动状态且子元素具有特定类时,如何向子元素添加属性?

仅当父元素具有特定类时才为列表项元素设置样式[重复]

我可以禁用特定组件的某些 Vue 警告吗?