vue.js - 从 Vue 组件访问 shadow DOM
问题描述
我目前正在使用 Vue3 开发一个自定义组件。我将其定义为:
import { defineCustomElement } from 'vue';
import Panel from '~/components/panel_custom/Panel.ce.vue';
const CustomElement = defineCustomElement(Panel);
window.customElements.define('panel-custom', CustomElement);
现在我正在尝试访问 shadowRoot 以使一些滚动到底部的功能正常工作。
如何访问元素以从 Like: 调用 shadowRoot element.shadowRoot;
?
我在 vue 文档中找不到任何内容。
解决方案
在 Vue 组件中,影子根是父节点,因此您可以通过以下方式访问它this.$el.parentNode
:
export default {
mounted() {
// assuming this Vue component is mounted as a custom element
// via `defineCustomElement()` and `window.customElements.define()`
console.log({ shadowRoot: this.$el.parentNode })
}
}
或者,您可以在文档中查询自定义元素,并shadowRoot
直接从引用中访问属性。下面的示例假设在查询时自定义元素存在于 light DOM 中,而不是 shadow DOM 中。document.querySelector()
不会穿透 shadow DOM,因此如果该元素位于另一个具有封闭模式 shadow root的自定义元素中,则查询将返回undefined
。
import { defineCustomElement } from 'vue'
import HelloWorld from '@/components/HelloWorld.vue'
const CustomElement = defineCustomElement(HelloWorld)
window.customElements.define('hello-world', CustomElement)
// assume element is in light DOM
const el = document.querySelector('hello-world')
console.log({ shadowRoot: el?.shadowRoot })
推荐阅读
- laravel - 如何检查电子邮件是否未验证 Laravel 7?
- c# - 无法在 Unity、MacOS 中打开 C# 脚本文件
- python - 创建 Pandas 数据框时如何忽略括号内的分隔符?
- c# - C# wpf hittest 对角线
- android - 如何在 Android MotionLayout/MotionScene 中无限运行动画定义?
- ada - 检测行尾的 Ada 程序
- instagram - instagram 帖子的链接响应中始终缺少 Open Graph 元标记
- reactjs - 如何在 Visual Studio 2019 v16.6 子目录下配置 npm 和 package.json?
- docker - 在k8s节点上,如何管理节点上电时的pod磁盘IOland-rush?
- joi - 我可以将枚举用于 JOi 架构属性名称吗