问题
我正在使用Vue CLI应用程序。有一个孙组件,需要访问另一个组件的元素的属性。它实际上只需要clientHeight
属性。
因此 Content2.vue 组件需要访问以下元素的clientHeight
属性:<div id="header"></div>
(在 Header.vue 中)。
尝试的解决方案
我尝试使用$refs
。根据{{3}},$refs
仅适用于与父/子直接相关的组件。
我还考虑过将$refs
或clientHeight
添加到商店(this stackoverflow answer)中,但这似乎有些过分。
我总是可以放心使用vuex或querySelector。但是认为可能会有更好的结果。
感谢您的帮助!
答案 0 :(得分:1)
如果您完全确定CSS无法解决此问题,并且确实需要元素的clientHeight
,则可以从以下选项中选择最差的解决方案:
id
实例的Header
从App
传递到Content
到Content2
。然后让Content2
使用查询选择器获取高度。这似乎比让Content2
拥有硬编码的id
来得容易一些。Header
计算自己的高度并将事件发送到App
,然后将高度传递到Content
,然后传递到Content2
。请注意,如果高度不固定,您可能需要侦听调整大小事件。您选择的哪一项取决于问题中所提出的内容。
如果没有其他组件需要知道Header
的高度,我会选择(1)。
如果其他组件需要知道Header
的高度,或者Header
实例是否处于确定其动态高度的最佳位置,我会选择(2)。
如果我已经在使用某种全局状态管理器,我会选择(3)。
答案 1 :(得分:1)
截至目前的可行解决方案:
$refs
。如果要访问它,可以像this.$parent.$parent.$children[0].$refs.name
一样via $parent
。Vuex
clientHeight
并将其添加到商店。 (不要添加$refs
,它们不是数据对象)clientHeight
之类的全局信息的“自然”场所之一。知道树中远处的组件共享的clientHeight
在商店中,几乎不会令您的项目的任何新开发人员感到惊讶。香草
data()
,并在其中具有clientHeight
属性。现在,您可以使用this.$root.clientHeight = newValue
从任何组件中进行设置,也可以使用this.$root.clientHeight
进行读取。data()
。需要有人照顾,因为有人可能会开始在此处添加属性,这很快会变成一种糟糕的情况(Vuex的缺点没有缺点)。如果发生这种情况,您应该开始使用Vuex。$root
解决方案,不同之处在于,您可以直接发送和接收事件,而不是直接设置数据。data()
。$root
)。这里的坏处是这种解决方案对您的情况而言并不自然。 clientHeight
的设置无论如何都不是事件(或者是?),所以这可能是不自然的。传递道具
Header.vue
(通过事件)传递给clientHeight
(通过事件),App.vue
(通过道具)传递给Content.vue
,然后向下传递到Content2.vue
(通过道具)。$root
/ hub / bus实例。每个组件(事件或道具)的签名(事件或道具)中传递的每一个数据都是清楚的。就个人而言,我会选择Vuex的,特别是如果您已经配置了Vuex。如果不是这样,我会使用$root
,但是在第一次使用Vuex的承诺下,就需要全局使用任何其他道具。
答案 2 :(得分:0)
那么您可以尝试使用一种称为“事件总线”的东西。您可以从全局事件总线上的任何内容向另一个内容发出事件,然后其他内容侦听此事件。然后,您执行一个在事件总线上发出高度的函数,然后您在该事件上再次用“ on”侦听并执行一个函数