当前位置: 首页 > 知识库问答 >
问题:

javascript - 在vue3中,先使用createVNode创建vnode,然后使用render函数挂载到dom上面,怎样才能获取到该元素的引用ref?

夏侯元忠
2023-07-19

定义一个InputCom.vue文件,文件内容为

<template>  <input ref="refEl" /></template><script lang="ts" setup>import { ref, defineExpose } from 'vue'const refEl = ref()defineExpose({  test() {    console.log("0-----test-----0")  },  refEl})</script>然后定义一个测试文件Test.vue,内容为<template>  <div ref="refEl"></div></template><script lang="ts" setup>import { ref, createVNode, render, defineExpose, onMounted } from 'vue'import InputCom from './InputCom.vue'const refEl = ref(null)const refInputCom = ref(null)// 必须动态创建// 必须动态创建// 必须动态创建const vnode = createVNode(InputCom, {ref:refInputCom})render(vnode, refEl.value)onMounted(() => {  // 调用InputCom.vue中暴露出来的方法    })</script>

在Test.vue中如何调用到InputCom.vue文件中暴露出来的方法以及引用,经过多次测试,发现使用render函数会导致获取到的refInputCom.value为undefined,请问该如何编写代码才能正确动态创建InputCom并可以正常调用该组件暴露出来的方法和属性

共有1个答案

鲜于勇
2023-07-19

首先createVNode的第二个参数接收组件的props,从你的示例代码中看到{ref:refInputCom},实际上等于在InputCom组件中的defineProps声明了一个ref属性,上层组件传递了refInputCom给ref。放弃defineExpose写法,我们依靠defineProps来获取到子组件内的方法,详细代码如下

// InputCom let props = defineProps({  init:Function})function funA(){  console.log("asa");}function funB(){  console.log("bb");}onMounted(()=>{  props.init({funA,funB})})// Test.vueimport { createVNode,render } from "vue";let events = {};let vnode = createVNode(HelloWorld,{init(e){  events = e;}});events.funA();events.funB();
 类似资料:
  • 问题内容: 我很难理解如何在PHP中使用DOMElement对象。我找到了这段代码,但是我不确定它是否适用于我: 基本上,我需要在DOM中搜索特定的,之后需要提取一个非标准的(即我用JS编写并使用的非标准的),以便可以看到它的价值。原因是我需要从中获取一份,而在HTML中则需要基于重定向。如果有人可以解释一下我如何为此目的使用DOMDocument,那将有所帮助。我真的很难理解发生了什么以及如何正

  • 当然,我已经定义了这一点。等等: 我得到一个等待超时例外 我甚至用了很多类型的By,比如Xpath,css选择器,类...但是仍然没有运气. 解决方案:所以我需要返回到defaut上下文(返回到父上下文),我的代码是这样的: 多谢@naveen提醒我查那个案子:)。

  • 我需要获得一个DOM元素的XPath来持久化它,这样我就可以查找该元素。 我已经尝试了这个答案的方法,但是当我用jQuery创建的对象调用该方法时... ...我得到这个错误: 未捕获的TypeError:无法读取未定义(…)的属性“子节点” 我尝试将替换为,将替换为,将替换为,但我收到未定义为函数结果的... 那么,您是否有一个与类似的函数可以使用jQuery呢?

  • 我希望能够获取<template #loadMore>中 id为"is_load"的div元素 但是ref无法引用到 ,在onMounted函数中使用nextTick回调打印处理这个dom也是空的,等待渲染后也不行 有什么方法可以操作到dom vue 无法获取到template中的dom元素?

  • 我需要能够更改应用于的css。如何使用javascript实现这一目标? 我的css存储为一个Javascript变量中的字符串。我不使用css文件。css由大约50个类组成,因此逐个应用它们是没有意义的。我知道如何通过更改最低类来实现这一点,但我只是想看看是否可以使用Javascript命令和变量。 伪码

  • 有史以来最奇怪的事情是:我从一个模块运行一个程序,该模块调用另一个模块的一些函数。问题是,相同的代码在使用基本函数时可以完美运行,但第三个函数只有在unittest类内部使用时才会失败,消息如下: NoSuchElementException:消息:没有这样的元素:无法定位元素:{“方法”:“xpath”,“选择器”:”//*[@id=“app_skeleton”]/tbody/tr[6]/td/