[英]How to access Vue component element property from sibling component
问题
我正在使用Vue CLI应用程序。 有一个孙子组件需要访问另一个组件的元素属性。 它实际上只需要clientHeight
属性。
所以Content2.vue组件需要访问这个元素的clientHeight
属性: <div id="header"></div>
(在Header.vue中)。
尝试的解决方案
我试过使用$refs
。 并且根据this stackoverflow answer $refs
仅适用于与父/子直接相关的组件。
我还考虑将$refs
或clientHeight
添加到商店( vuex ),但这似乎有点过分了。
我总是可以 go vanilla 并使用querySelector或getElementById 。 但认为可能有更好的东西。
谢谢你的帮助!
截至今天的可能解决方案:
Vuex
clientHeight
并将其添加到商店。 (不要添加$refs
,它们不是数据对象)clientHeight
之类的全局信息的“自然”位置之一。 几乎没有任何新的项目开发人员会惊讶地发现clientHeight
被树中远处的组件共享,在 store 中。香草
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 使用 go,特别是如果您已经配置了它。 如果不是,我会使用$root
,但是在使用 Vuex 的 promise 的第一刻,任何其他道具在全球范围内都是必要的。
如果您绝对确定 CSS 无法解决此问题,并且您确实需要元素的clientHeight
,那么您只能从以下选择最不坏的解决方案:
Header
实例的id
从App
传递到Content
到Content2
。 然后让Content2
使用查询选择器来获取高度。 这似乎比Content2
有一个硬编码的id
更脆弱。Header
计算自己的高度并向App
发出事件,然后将高度传递给Content
,然后传递给Content2
。 请注意,如果高度不固定,您可能需要监听调整大小事件。您选择哪一个不仅取决于问题中提出的内容。
如果没有其他组件需要知道Header
的高度,我会选择 (1)。
如果其他组件需要知道Header
的高度,或者Header
实例是否在最佳 position 中以确定其自己的动态高度,我会选择 (2)。
如果我已经在使用某种全局 state 管理器,我会选择 (3)。
好吧,您可以尝试使用称为“事件总线”的东西。 您可以通过全局事件总线从任何内容向另一个内容发出事件,而其他内容会监听此事件。 然后你执行一个 function,它在事件总线上发出高度,你再次用“on”监听这个事件并执行一个 function
这可能会对您有所帮助: https://alligator.io/vuejs/global-event-bus/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.