- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何获取插槽中 child 的 Dom 元素。试图在life hook onMounted()中获取一个对象的el vnode属性为null
我的组件:
<template>
<div>{{text}}</div>
<slot></slot>
</template>
<script lang="ts">
import { defineComponent, onMounted } from "vue";
export default defineComponent({
name: "my-component",
props: {
text: {
type: String,
default: '',
required: true,
},
},
setup( _, ctx) {
onMounted( () => {
if (ctx.slots.default) {
console.log( (ctx.slots.default()[0]) ); // <- property "el" - is null
}
})
},
});
</script>
最佳答案
要记住的几件事(对于其他想做同样事情的人)
slots.default
是需要执行的函数slots.default()
返回一个数组,因为一个槽可以有多个元素,在大多数情况下你可以只选择[0]
onMounted
,这可能是最简单的。插槽可通过函数 slots.default()
访问,该函数采用用于呈现插槽的数据参数。如果您想使用渲染函数,这对于生成节点很有用,并且在很大程度上似乎只是一些暴露的内部结构。
我发现了一些使用节点遍历来绕过它的技巧。
一个(可能是更好的选择)使用子对象(slots.default()[0].children.default()[0].el.parentElement
)
另一个使用 ref
和 nextElementSibling
。
这个想法是你放置一个跨度(或其他一些“不可见”元素),你可以使用 ref
获得引用。然后在 onMounted
处理程序中,您可以使用该元素获取将成为下一个元素兄弟的插槽元素。
var app = Vue.createApp({
setup() {return {}}
});
app.component("parent-component", {
template: `<div>🧑<span ref="slotRef"></span><slot></slot></div>`,
setup(props, ctx) {
const slotRef = Vue.ref(null); // create a ref
Vue.onMounted(()=>{
const defaultSlot = ctx.slots.default();
console.log(defaultSlot[0].children.default()[0].el.parentElement) // or get the parent of the first child
defaultSlot[0].children.default()[0].el.parentElement.innerText += "😡"
console.log(slotRef.value.nextElementSibling); // get the Sibling of ref
slotRef.value.nextElementSibling.innerText += "🤯"
})
return {slotRef};
}
});
app.component("child-component", {
template: `<div>👶<slot></slot></div>`,
});
app.mount("#app");
div{border:1px solid; padding:2px;}
<script src="https://unpkg.com/vue@3.0.11/dist/vue.global.prod.js"></script>
<div id="app">
<parent-component>
<child-component>
🦜
</child-component>
</parent-component>
</div>
关于vue.js - 如何从插槽中的子组件获取 HTMLElement?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67428598/
我正在尝试使用 VS 2013 中的 WebBrowser 控件在网页上输入文本。我的应用程序是用 C# 编写的。网页的 Html 不使用标准 ID,而是使用称为 data-gel-id 的内容。我相
假设我有以下 HTML 代码: My first menu My second menu My title My t
在很多情况下,我已经能够以两种方式为所有 HTMLElements 注册方法。 所以我很好奇,有什么不同吗? 我应该更喜欢一种方法而不是另一种方法吗? 什么是正确的方法? 最佳答案 使用原型(prot
我创建了一个自定义事件。 var event = new Event('hello');,向节点添加监听器 div1.addEventListener('hello', /*cb1*/); div2.
[[WARNING]]:看起来像问题 TypeScript: add type property to HtmlElement但我需要向元素对象添加一个函数,而不是向节点添加属性。 我尝试将 Java
我通过 babel(es2015 预设)运行 my-widget.js 来生成 my-widget-es5.js。这会导致 Polymer 出现错误。 Class constructor Polyme
[[WARNING]]:看起来像问题 TypeScript: add type property to HtmlElement但我需要向元素对象添加一个函数,而不是向节点添加属性。 我尝试将 Java
我试图用以下设计模式写一些东西: void main() { document.registerElement('abs-test', Test); TestExtend test =
我正在尝试为 textarea html 元素引发 keydown 和 key up 事件,我可以将内部文本设置为我想要的文本,但网站似乎不承认文本在那里,除非我可以提出这些事件。我怎样才能做到这一点
使用 jQuery 可以做这样的事情:$("div")[5].animate() 在我看来,开发人员使用 prototype 扩展了 HTMLElement。 我现在的问题是:他们是怎么做到的?例如,
似乎HTMLElements默认情况下在 5 秒内等待元素。有什么方法可以更改此默认超时持续时间吗? 最佳答案 在当前版本中这是不可能的。但是我们有一个开放的拉取请求(https://github.c
https://jsfiddle.net/6vqbLm5c/29/ HTML: paragraph CSS: p { margin:0; } div { padding: 10px
如果该按钮不存在,则测试将挂起超过 5 秒。 DefaultElementLocator 中的 findElement() 方法被调用约 63 次! block 嵌套越深,等待时间越长。 是否可以在
我想检查库如何处理我传递给它的视频元素,所以我天真地这样做了: cosnt videoElement = new Proxy(document.querySelector('video'), {
我有一个 Element,但我不知道如何从中获取 HTMLElement。 例如: A link Another link 然后我像这样得到它们: var nodes: NodeListOf = do
我想从 document 获取元素高度,我正在尝试使用 const header = document.getElementsByClassName(myClass) 获取它。但是在将Element
我在将我的一个 JavaScript 行转换为 TypeScript 时遇到了一些问题。 此行用于在 ID 为 containerId 的容器上创建类型为 widgetName 的小部件。 widge
我正在尝试在 TypeScript 中实例化新的 HTMLDivElement var elem = new HTMLDivElement(); 但是浏览器抛出 Uncaught TypeError:
我想通过 javasacript 从字符串创建 HTMLElement,就像这样 element = createHTMLElement('title') element.addEventListen
如何获取插槽中 child 的 Dom 元素。试图在life hook onMounted()中获取一个对象的el vnode属性为null 我的组件: {{text}} impo
我是一名优秀的程序员,十分优秀!